mirror of
https://github.com/CoreUnion/CoreShop.git
synced 2026-10-16 21:08:47 +08:00
!114 发货方式调增为批量订单发货和单个订单发货。增加【门店自提】自动发货,并支持后台设置开启,当开启后【门店自提】订单将自动发货,并生成提货码,用户凭借提货码或手机号码到门店核销。增加自定发货定时任务。
* Merge branch 'master' into dahuihui/develop * 【后端】发货方式调增为批量订单发货和单个订单发货;【后端】增加【门店自提】自动发货,并支持后台设置开启,当开启后【门店自提】订单将自动发货,… * 调试商品展示页面 * 因mysql不支持一定格式数据排序,调整部分longtext字段为text格式,保持富文本字段为longtext格式 * Merge branch 'master' into dahuihui/develop * 修复后台页面设计,导航组跳转问题 #I42RJ4 #I3VUZR * 修复后台页面设计,导航组跳转问题 #I42RJ4 * Merge branch 'master' into dahuihui/develop * Merge branch 'master' into dahuihui/develop * 微信小程序登录获取手机号码不成功 * 修复代理商品池商品同步价格展示问题。 * Merge branch 'develop' into dahuihui/develop * 修复sku删除单个货品后,未清理cache导致重复加载的问题。(感谢vikinghunter提供修改建议) #I44XMY * 1、【后端】修复后台上传类型不同导致文件夹路径问题差异化问题。 #I45QKZ * Merge branch 'develop' into dahuihui/develop * 1、【后端】修复保存商品未更新sku序列问题。#I44OOG * 修复更新pages主键无说明导致更新失败问题。 * 修复sku输入小写逗号,导致前端展示会被截断的问题。 * 修复代码生成器引用实体目录错误问题。 * Merge branch 'develop' into dahuihui/develop * 修复redis提示端口号错误问题。 * 【接口】修复微信支付失败回调存储数据长度过短导致写入失败问题。 * 同步 * 增加消息转发类型 * 调整细节 * 修复github链接 * 1、【后端】移除业务逻辑中的【MediatR】及中介者模式,启用【Redis队列】处理。 * Merge branch 'develop' into dahuihui/develop * 升级编辑器为CKEditor5 * Merge branch 'develop' into dahuihui/develop * Merge branch 'develop' into dahuihui/develop * 【后端】优化后端设置权限角色,反射controller和action的效率问题。 * 【后端】修复后端编辑商品问题。 * 【后端】修复腾讯云cos存储未调用bucket问题。#I42DF0 * Merge branch 'develop' into dahuihui/develop * 启用新域名及演示平台 * Merge branch 'develop' into dahuihui/develop * Merge branch 'develop' into dahuihui/develop * 调整说明 * Merge branch 'develop' into dahuihui/develop * 删除不需要的菜单 * 修复域名转发获取ip地址长度过长问题。 * 1、【后端】调整全局错误返回提示语。2、【数据库】修复20日删除3个表后,未清理干净问题。 * Merge branch 'develop' into dahuihui/develop * Merge branch 'develop' into dahuihui/develop * 调整全局错误返回提示语 * 修复商品批量处理报错的问题并优化展示界面。#I3X8PP * Merge branch 'develop' into dahuihui/develop * Merge branch 'develop' into dahuihui/develop * 增加过滤敏感词的功能。#I3W6CM * 增加Issue 和 Pull Request 模板 * 修复自定义上传路径上传至站点根目录,而非wwwroot的问题 #I41TD1 * Merge branch 'develop' into dahuihui/develop * 修复自定义上传路径的表单命名异常问题 * 使用新数据库 * 【数据库】修复mysql数据库decimal类型未带小数的问题。#I3WAUY * 更新数据库及脚本 * 2021-07-20 * Merge branch 'develop' into dahuihui/develop * 修复webapi不进入调试断点的问题。 * Merge branch 'develop' into dahuihui/develop * 修复后台前后端分离table面板启用自定义域名问题。 * 修复后台前后端分离域名未增加到html问题。 * Merge branch 'develop' into dahuihui/develop * 【后端】修复修改登录用户真实姓名长度问题。 * 修复后台管理配送方式维护错误问题 * 1、修复小程序注册问题,导致交互事情。不然盛派的组件有bug,在不注册微信公众号只注册微信小程序的时候,进行小程序消息操作,默认还是走的是微… * 修复消息模板不推送的问题 * Merge branch 'develop' into dahuihui/develop * Merge branch 'develop' into dahuihui/develop * 修复过期失效文档 * 调整代码生成器,增加初始化事务 * 调整接口端提示界面 * 修复弹窗不居中问题 * 调整一些命名方式 * 修复uni-app前端,用户订单列表【确认收货】按钮失效问题 * 1、修复mysql数据库下,报表统计sql的语法错误。2、为方便前端在不部署接口及后端的情况下测试uni-app前端,默认增加了测试接口地址… * Merge branch 'develop' into dahuihui/develop * 调整命名 * 增加docker-compose部署 * Merge branch 'develop' into dahuihui/develop * 修复因linux下存在数据与文件名称大小写不对应,导致找不到数据库表的问题,特重新发布一份表名与实体名称一一对应脚本。 * 新mysql表名存在大小写问题
This commit is contained in:
@@ -358,6 +358,10 @@
|
||||
/// </summary>
|
||||
public const string OrderFinishCommand = "OrderFinishCommandQueue";
|
||||
/// <summary>
|
||||
/// 订单完成时,门店订单自动发货
|
||||
/// </summary>
|
||||
public const string OrderAutomaticDelivery = "OrderAutomaticDeliveryQueue";
|
||||
/// <summary>
|
||||
/// 订单完结后走打印模块
|
||||
/// </summary>
|
||||
public const string OrderPrint = "OrderPrintQueue";
|
||||
|
||||
@@ -96,6 +96,10 @@ namespace CoreCms.Net.Configuration
|
||||
/// </summary>
|
||||
public const string RemindOrderTime = "remindOrderTime";
|
||||
|
||||
/// <summary>
|
||||
/// 门店订单自动发货
|
||||
/// </summary>
|
||||
public const string StoreOrderAutomaticDelivery = "storeOrderAutomaticDelivery";
|
||||
|
||||
//分销功能(老分销)=============================================================
|
||||
/// <summary>
|
||||
|
||||
@@ -73,6 +73,11 @@ namespace CoreCms.Net.Configuration
|
||||
di.Add(SystemSettingConstVars.ReshipAddress, new DictionaryKeyValues() { sKey = "退货详细地址", sValue = "" });
|
||||
di.Add(SystemSettingConstVars.ReshipCoordinate, new DictionaryKeyValues() { sKey = "退货坐标", sValue = "" });
|
||||
|
||||
|
||||
di.Add(SystemSettingConstVars.StoreOrderAutomaticDelivery, new DictionaryKeyValues() { sKey = "门店自提自动发货", sValue = "2" });
|
||||
|
||||
|
||||
|
||||
//分销功能
|
||||
|
||||
di.Add(SystemSettingConstVars.OpenDistribution, new DictionaryKeyValues() { sKey = "是否开启三级分销", sValue = "1" });
|
||||
@@ -226,5 +231,24 @@ namespace CoreCms.Net.Configuration
|
||||
};
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统默认发货物流方式
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static List<CommonKeyValues> GetSystemLogistics()
|
||||
{
|
||||
var list = new List<CommonKeyValues>
|
||||
{
|
||||
new CommonKeyValues() {sDescription = "本地同城配送", sValue = "无", sKey = "benditongcheng"},
|
||||
new CommonKeyValues() {sDescription = "本地上门自提", sValue = "无", sKey = "shangmenziti"},
|
||||
};
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace CoreCms.Net.Core.Config
|
||||
//对应的订阅者类,需要new一个实例对象,当然你也可以传参,比如日志对象
|
||||
m.ListSubscribe = new List<Type>() {
|
||||
typeof(OrderAgentOrDistributionSubscribe),
|
||||
typeof(OrderAutomaticDeliverySubscribe),
|
||||
typeof(OrderFinishCommandSubscribe),
|
||||
typeof(OrderPrintSubscribe),
|
||||
|
||||
|
||||
@@ -47,6 +47,27 @@ namespace CoreCms.Net.IServices
|
||||
string memo = "");
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发货,单个订单发货
|
||||
/// </summary>
|
||||
/// <param name="orderId">英文逗号分隔的订单号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <returns></returns>
|
||||
Task<WebApiCallBack> Ship(string orderId, string logiCode, string logiNo, Dictionary<int, int> items,
|
||||
int storeId = 0, string shipName = "", string shipMobile = "", int shipAreaId = 0, string shipAddress = "",
|
||||
string memo = "");
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 物流信息查询根据快递编码和单号查询(快递100)未使用
|
||||
/// </summary>
|
||||
|
||||
@@ -148,6 +148,11 @@ namespace CoreCms.Net.IServices
|
||||
/// <returns></returns>
|
||||
Task<WebApiCallBack> GetOrderShipInfo(string[] ids);
|
||||
|
||||
/// <summary>
|
||||
/// 构建单个需要发货的数据,和发货单密切关联
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<WebApiCallBack> GetOrderShipInfo(string orderId);
|
||||
|
||||
/// <summary>
|
||||
/// 发货改状态
|
||||
@@ -158,6 +163,24 @@ namespace CoreCms.Net.IServices
|
||||
Task<WebApiCallBack> EditShipStatus(string orderId, Dictionary<int, int> items);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 批量订单发货
|
||||
/// </summary>
|
||||
/// <param name="ids">订单标号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <returns></returns>
|
||||
Task<WebApiCallBack> BatchShip(string[] ids, string logiCode, string logiNo,
|
||||
Dictionary<int, int> items, string shipName, string shipMobile, string shipAddress, string memo,
|
||||
int storeId = 0, int shipAreaId = 0);
|
||||
|
||||
/// <summary>
|
||||
/// 订单发货
|
||||
/// </summary>
|
||||
@@ -172,10 +195,12 @@ namespace CoreCms.Net.IServices
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <returns></returns>
|
||||
Task<WebApiCallBack> OrderShip(string[] ids, string logiCode, string logiNo,
|
||||
Task<WebApiCallBack> Ship(string ids, string logiCode, string logiNo,
|
||||
Dictionary<int, int> items, string shipName, string shipMobile, string shipAddress, string memo,
|
||||
int storeId = 0, int shipAreaId = 0);
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 后台完成订单
|
||||
/// </summary>
|
||||
|
||||
@@ -318,7 +318,7 @@ namespace CoreCms.Net.Model.ViewModels.View
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 后端订单发货返回实体
|
||||
/// 后端订单发货返回集合实体
|
||||
/// </summary>
|
||||
public class AdminOrderShipResult
|
||||
{
|
||||
@@ -338,6 +338,28 @@ namespace CoreCms.Net.Model.ViewModels.View
|
||||
public List<CoreCmsOrder> orders { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 后端订单发货返回单个实体
|
||||
/// </summary>
|
||||
public class AdminOrderShipOneResult
|
||||
{
|
||||
public string orderId { get; set; }
|
||||
public decimal weight { get; set; } = 0;
|
||||
public string memo { get; set; }
|
||||
public decimal costFreight { get; set; } = 0;
|
||||
public int storeId { get; set; } = 0;
|
||||
public int shipAreaId { get; set; } = 0;
|
||||
public string shipAddress { get; set; }
|
||||
public string shipName { get; set; }
|
||||
public string shipMobile { get; set; }
|
||||
public int logisticsId { get; set; } = 0;
|
||||
public CoreCmsShip ship { get; set; } = null;
|
||||
public string logisticsName { get; set; }
|
||||
public List<CoreCmsOrderItem> items { get; set; }
|
||||
public CoreCmsOrder orderInfo { get; set; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 前端提交售后单提交参数
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Loging;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Essensoft.Paylink.WeChatPay.V2;
|
||||
using Essensoft.Paylink.WeChatPay.V2.Notify;
|
||||
using InitQ.Abstractions;
|
||||
using InitQ.Attributes;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace CoreCms.Net.RedisMQ.Subscribe
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店订单自动发货
|
||||
/// </summary>
|
||||
public class OrderAutomaticDeliverySubscribe : IRedisSubscribe
|
||||
{
|
||||
|
||||
private readonly ICoreCmsOrderServices _orderServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
|
||||
|
||||
public OrderAutomaticDeliverySubscribe(ICoreCmsSettingServices settingServices, ICoreCmsAgentOrderServices agentOrderServices, ICoreCmsOrderServices orderServices, ICoreCmsOrderItemServices orderItemServices)
|
||||
{
|
||||
_settingServices = settingServices;
|
||||
_orderServices = orderServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 订单完成时,门店订单自动发货
|
||||
/// </summary>
|
||||
/// <param name="msg"></param>
|
||||
/// <returns></returns>
|
||||
[Subscribe(RedisMessageQueueKey.OrderAutomaticDelivery)]
|
||||
|
||||
private async Task OrderAutomaticDelivery(string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var order = JsonConvert.DeserializeObject<CoreCmsOrder>(msg);
|
||||
if (order != null)
|
||||
{
|
||||
var goodItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId);
|
||||
if (!goodItems.Any())
|
||||
{
|
||||
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单自动发货", "明细获取失败");
|
||||
return;
|
||||
}
|
||||
|
||||
Dictionary<int, int> items = new Dictionary<int, int>();
|
||||
|
||||
goodItems.ForEach(p =>
|
||||
{
|
||||
items.Add(p.productId, p.nums);
|
||||
});
|
||||
|
||||
var result = new WebApiCallBack();
|
||||
|
||||
if (order.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
|
||||
{
|
||||
result = await _orderServices.Ship(order.orderId, "shangmenziti", "无", items, order.shipName, order.shipMobile, order.shipAddress, order.memo, order.storeId, order.shipAreaId);
|
||||
}
|
||||
else if (order.receiptType == (int)GlobalEnumVars.OrderReceiptType.IntraCityService)
|
||||
{
|
||||
result = await _orderServices.Ship(order.orderId, "benditongcheng", "无", items, order.shipName, order.shipMobile, order.shipAddress, order.memo, order.storeId, order.shipAreaId);
|
||||
}
|
||||
|
||||
NLogUtil.WriteAll(result.status ? NLog.LogLevel.Info : NLog.LogLevel.Error,
|
||||
LogType.RedisMessageQueue, "订单自动发货", JsonConvert.SerializeObject(result));
|
||||
}
|
||||
else
|
||||
{
|
||||
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "订单自动发货", "订单获取失败");
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "订单自动发货", msg, ex);
|
||||
throw;
|
||||
}
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Caching.AutoMate.RedisCache;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
@@ -23,6 +24,7 @@ using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.View;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Flurl.Http;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
@@ -39,20 +41,22 @@ namespace CoreCms.Net.Services
|
||||
private readonly ICoreCmsBillDeliveryRepository _dal;
|
||||
private readonly ICoreCmsStoreServices _storeServices;
|
||||
private readonly ICoreCmsBillDeliveryItemServices _billDeliveryItemServices;
|
||||
private readonly ICoreCmsBillDeliveryOrderRelServices _billDeliveryOrderRelServices;
|
||||
private readonly ICoreCmsOrderLogServices _orderLogServices;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IRedisOperationRepository _redisOperationRepository;
|
||||
|
||||
|
||||
|
||||
public CoreCmsBillDeliveryServices(
|
||||
IUnitOfWork unitOfWork,
|
||||
IServiceProvider serviceProvider
|
||||
, ICoreCmsBillDeliveryRepository dal
|
||||
, ICoreCmsStoreServices storeServices
|
||||
, ICoreCmsBillDeliveryItemServices billDeliveryItemServices
|
||||
, ICoreCmsBillDeliveryOrderRelServices billDeliveryOrderRelServices
|
||||
, ICoreCmsOrderLogServices orderLogServices
|
||||
, ICoreCmsSettingServices settingServices)
|
||||
, ICoreCmsSettingServices settingServices, IRedisOperationRepository redisOperationRepository)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
@@ -60,9 +64,9 @@ namespace CoreCms.Net.Services
|
||||
_serviceProvider = serviceProvider;
|
||||
_storeServices = storeServices;
|
||||
_billDeliveryItemServices = billDeliveryItemServices;
|
||||
_billDeliveryOrderRelServices = billDeliveryOrderRelServices;
|
||||
_orderLogServices = orderLogServices;
|
||||
_settingServices = settingServices;
|
||||
_redisOperationRepository = redisOperationRepository;
|
||||
}
|
||||
|
||||
|
||||
@@ -77,8 +81,6 @@ namespace CoreCms.Net.Services
|
||||
return await _dal.GetDeliveryList(orderId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 批量发货,可以支持多个订单合并发货,单个订单拆分发货等。
|
||||
/// </summary>
|
||||
@@ -150,6 +152,7 @@ namespace CoreCms.Net.Services
|
||||
billDelivery.memo = memo;
|
||||
billDelivery.createTime = DateTime.Now;
|
||||
|
||||
|
||||
//设置发货明细
|
||||
var bdRel = new List<CoreCmsBillDeliveryItem>();
|
||||
|
||||
@@ -174,6 +177,21 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
|
||||
//构建发货单明细
|
||||
//dInfo.items.ForEach(p =>
|
||||
//{
|
||||
// var bdItem = new CoreCmsBillDeliveryItem();
|
||||
// bdItem.deliveryId = billDelivery.deliveryId;
|
||||
// bdItem.orderId = p.orderId;
|
||||
// bdItem.productId = p.productId;
|
||||
// bdItem.goodsId = p.goodsId;
|
||||
// bdItem.bn = p.bn;
|
||||
// bdItem.sn = p.sn;
|
||||
// bdItem.weight = p.weight;
|
||||
// bdItem.name = p.name;
|
||||
// bdItem.addon = !string.IsNullOrEmpty(p.addon) ? p.addon : "";
|
||||
// bdItem.nums = orderItem.nums;
|
||||
// bdRel.Add(bdItem);
|
||||
//});
|
||||
var bdItem = new CoreCmsBillDeliveryItem();
|
||||
bdItem.deliveryId = billDelivery.deliveryId;
|
||||
bdItem.productId = orderItem.productId;
|
||||
@@ -195,26 +213,15 @@ namespace CoreCms.Net.Services
|
||||
|
||||
|
||||
//插入发货单主体表
|
||||
await base.InsertAsync(billDelivery);
|
||||
await _dal.InsertAsync(billDelivery);
|
||||
|
||||
//插入发货单明细表
|
||||
await _billDeliveryItemServices.InsertAsync(bdRel);
|
||||
|
||||
//订单更新发货状态,发送各种消息
|
||||
var rels = new List<CoreCmsBillDeliveryOrderRel>(); //关系表
|
||||
foreach (var order in orders)
|
||||
{
|
||||
await orderShip(order, items, billDelivery, storeId);
|
||||
var rel = new CoreCmsBillDeliveryOrderRel
|
||||
{
|
||||
deliveryId = billDelivery.deliveryId,
|
||||
orderId = order.orderId
|
||||
};
|
||||
rels.Add(rel);
|
||||
}
|
||||
if (rels.Any())
|
||||
{
|
||||
await _billDeliveryOrderRelServices.InsertAsync(rels);
|
||||
await OrderShip(order, items, billDelivery, storeId);
|
||||
}
|
||||
|
||||
var stock = new CoreCmsStock
|
||||
@@ -236,6 +243,154 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发货,单个订单发货
|
||||
/// </summary>
|
||||
/// <param name="orderId">英文逗号分隔的订单号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Ship(string orderId, string logiCode, string logiNo, Dictionary<int, int> items, int storeId = 0, string shipName = "", string shipMobile = "", int shipAreaId = 0, string shipAddress = "", string memo = "")
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var orderService = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var stockServices = container.ServiceProvider.GetService<ICoreCmsStockServices>();
|
||||
|
||||
//获取订单详情
|
||||
var dInfoResult = await orderService.GetOrderShipInfo(orderId);
|
||||
if (!dInfoResult.status)
|
||||
{
|
||||
return dInfoResult;
|
||||
}
|
||||
var dInfo = dInfoResult.data as AdminOrderShipOneResult;
|
||||
var orderInfo = dInfo.orderInfo;
|
||||
|
||||
//校验门店自提和普通订单收货地址是否填写
|
||||
if (storeId != 0)
|
||||
{
|
||||
var storeModel = await _storeServices.QueryByIdAsync(storeId);
|
||||
if (storeModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
jm.data = 1000;
|
||||
jm.code = 1000;
|
||||
return jm;
|
||||
}
|
||||
shipName = storeModel.storeName;
|
||||
shipMobile = storeModel.mobile;
|
||||
shipAreaId = storeModel.areaId;
|
||||
shipAddress = storeModel.address;
|
||||
}
|
||||
if (string.IsNullOrEmpty(shipName) || string.IsNullOrEmpty(shipMobile) || string.IsNullOrEmpty(shipAddress) || shipAreaId == 0)
|
||||
{
|
||||
jm.msg = "收货地址信息不全";
|
||||
jm.otherData = new
|
||||
{
|
||||
shipName,
|
||||
shipMobile,
|
||||
shipAddress,
|
||||
shipAreaId
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
var billDelivery = new CoreCmsBillDelivery();
|
||||
billDelivery.orderId = string.Join(",", orderId);
|
||||
billDelivery.deliveryId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.发货单编号);
|
||||
billDelivery.logiCode = logiCode;
|
||||
billDelivery.logiNo = logiNo;
|
||||
billDelivery.shipAreaId = shipAreaId;
|
||||
billDelivery.shipAddress = shipAddress;
|
||||
billDelivery.shipName = shipName;
|
||||
billDelivery.shipMobile = shipMobile;
|
||||
billDelivery.status = (int)GlobalEnumVars.BillDeliveryStatus.Already;
|
||||
billDelivery.memo = memo;
|
||||
billDelivery.createTime = DateTime.Now;
|
||||
|
||||
|
||||
//设置发货明细
|
||||
var bdRel = new List<CoreCmsBillDeliveryItem>();
|
||||
|
||||
//校验发货内容
|
||||
var tNum = 0;
|
||||
foreach (var item in items)
|
||||
{
|
||||
var orderItem = dInfo.items.Find(p => p.productId == item.Key);
|
||||
if (orderItem == null)
|
||||
{
|
||||
//发货的商品不在发货明细里,肯定有问题
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
//判断总发货数量
|
||||
tNum = tNum + item.Value;
|
||||
|
||||
if ((orderItem.nums - orderItem.sendNums - (orderItem.reshipNums - orderItem.reshipedNums)) < item.Value)
|
||||
{
|
||||
jm.msg = orderItem.name + "发超了";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//构建发货单明细
|
||||
dInfo.items.ForEach(p =>
|
||||
{
|
||||
var bdItem = new CoreCmsBillDeliveryItem();
|
||||
bdItem.deliveryId = billDelivery.deliveryId;
|
||||
bdItem.productId = p.productId;
|
||||
bdItem.goodsId = p.goodsId;
|
||||
bdItem.bn = p.bn;
|
||||
bdItem.sn = p.sn;
|
||||
bdItem.weight = p.weight;
|
||||
bdItem.name = p.name;
|
||||
bdItem.addon = !string.IsNullOrEmpty(p.addon) ? p.addon : "";
|
||||
bdItem.nums = orderItem.nums;
|
||||
bdRel.Add(bdItem);
|
||||
});
|
||||
}
|
||||
if (tNum < 1)
|
||||
{
|
||||
jm.msg = "请至少发生一件商品!";
|
||||
return jm;
|
||||
}
|
||||
//事务处理开始
|
||||
|
||||
|
||||
//插入发货单主体表
|
||||
await _dal.InsertAsync(billDelivery);
|
||||
|
||||
//插入发货单明细表
|
||||
await _billDeliveryItemServices.InsertAsync(bdRel);
|
||||
|
||||
//订单更新发货状态,发送各种消息
|
||||
await OrderShip(orderInfo, items, billDelivery, storeId);
|
||||
|
||||
var stock = new CoreCmsStock
|
||||
{
|
||||
manager = 0,
|
||||
id = billDelivery.deliveryId,
|
||||
createTime = DateTime.Now,
|
||||
type = (int)GlobalEnumVars.StockType.DeliverGoods,
|
||||
memo = "订单发货操作,发货单号:" + billDelivery.deliveryId
|
||||
};
|
||||
|
||||
await stockServices.InsertAsync(stock);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "发货成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 给订单发货
|
||||
/// </summary>
|
||||
@@ -243,7 +398,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="items">总的发货包裹内容</param>
|
||||
/// <param name="deliveryInfo">发货单信息</param>
|
||||
/// <param name="storeId">门店自提还是普通订单,0是普通订单,其他是门店自提</param>
|
||||
private async Task<bool> orderShip(CoreCmsOrder orderInfo, Dictionary<int, int> items, CoreCmsBillDelivery deliveryInfo, int storeId = 0)
|
||||
private async Task<bool> OrderShip(CoreCmsOrder orderInfo, Dictionary<int, int> items, CoreCmsBillDelivery deliveryInfo, int storeId = 0)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderService = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
@@ -323,6 +478,15 @@ namespace CoreCms.Net.Services
|
||||
|
||||
if (stockLogs.Any())
|
||||
{
|
||||
//var stock = new CoreCmsStock
|
||||
//{
|
||||
// manager = 0,
|
||||
// id = deliveryInfo.deliveryId,
|
||||
// createTime = DateTime.Now,
|
||||
// type = (int)GlobalEnumVars.StockType.DeliverGoods,
|
||||
// memo = log.msg
|
||||
//};
|
||||
//await stockServices.InsertAsync(stock);
|
||||
await stockLogServices.InsertAsync(stockLogs);
|
||||
}
|
||||
|
||||
@@ -375,9 +539,8 @@ namespace CoreCms.Net.Services
|
||||
param = jsonParamData,
|
||||
sign = signStr
|
||||
};
|
||||
var result = await postUrl.WithHeader("Content-Type ", "application/x-www-form-urlencoded")
|
||||
.PostJsonAsync(postData)
|
||||
.ReceiveJson<KuaiDi100ApiPostResult>();
|
||||
|
||||
var result = await postUrl.PostUrlEncodedAsync(postData).ReceiveJson<KuaiDi100ApiPostResult>();
|
||||
if (result.status == "200")
|
||||
{
|
||||
jm.status = true;
|
||||
|
||||
@@ -821,7 +821,7 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
}
|
||||
//把退款金额和退货商品查出来
|
||||
AftersalesVal(order, aftersaleLevel);
|
||||
AfterSalesVal(order, aftersaleLevel);
|
||||
//促销信息
|
||||
if (!string.IsNullOrEmpty(order.promotionList))
|
||||
{
|
||||
@@ -859,7 +859,7 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="order"></param>
|
||||
/// <param name="aftersaleLevel">取售后单的时候,售后单的等级,0:待审核的和审核通过的售后单,1未审核的,2审核通过的</param>
|
||||
private void AftersalesVal(CoreCmsOrder order, int aftersaleLevel)
|
||||
public void AfterSalesVal(CoreCmsOrder order, int aftersaleLevel)
|
||||
{
|
||||
var addAftersalesStatus = false;
|
||||
var res = _billAftersalesServices.OrderToAftersales(order.orderId, aftersaleLevel);
|
||||
@@ -1300,6 +1300,20 @@ namespace CoreCms.Net.Services
|
||||
await _invoiceServices.InsertAsync(taxInfo);
|
||||
}
|
||||
|
||||
//如果是门店自提,应该自动跳过发货,生成提货单信息,使用提货单核销。
|
||||
if (order.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
|
||||
{
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var storeOrderAutomaticDelivery = CommonHelper
|
||||
.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreOrderAutomaticDelivery)
|
||||
.ObjectToInt(1);
|
||||
if (storeOrderAutomaticDelivery == 1)
|
||||
{
|
||||
//订单自动发货
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderAutomaticDelivery, JsonConvert.SerializeObject(order));
|
||||
}
|
||||
}
|
||||
|
||||
//结佣处理
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderAgentOrDistribution, JsonConvert.SerializeObject(order));
|
||||
//易联云打印机打印
|
||||
@@ -1453,9 +1467,9 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 构建需要发货的数据,和发货单密切关联
|
||||
#region 构建多个需要发货的数据,和发货单密切关联
|
||||
/// <summary>
|
||||
/// 构建需要发货的数据,和发货单密切关联
|
||||
/// 构建多个需要发货的数据,和发货单密切关联
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetOrderShipInfo(string[] ids)
|
||||
@@ -1517,7 +1531,7 @@ namespace CoreCms.Net.Services
|
||||
jm.msg = "订单号:" + item.orderId + "有未审核的售后单,请先处理掉才能发货。";
|
||||
return jm;
|
||||
}
|
||||
AftersalesVal(item, 0);
|
||||
AfterSalesVal(item, 0);
|
||||
}
|
||||
|
||||
if (!jm.status)
|
||||
@@ -1624,6 +1638,108 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 构建单个需要发货的数据,和发货单密切关联
|
||||
/// <summary>
|
||||
/// 构建单个需要发货的数据,和发货单密切关联
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetOrderShipInfo(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack { status = true };
|
||||
|
||||
var orderInfo = await _dal.QueryByClauseAsync(p => p.orderId == orderId);
|
||||
if (orderInfo == null)
|
||||
{
|
||||
jm.msg = "请选择订单";
|
||||
return jm;
|
||||
}
|
||||
orderInfo.items = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == orderId);
|
||||
var isStoreId = 0;//校验是普通快递收货,还是门店自提,这两种收货方式不能混着发
|
||||
//更改状态和库存
|
||||
|
||||
if (orderInfo.status != (int)GlobalEnumVars.OrderStatus.Normal)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + orderInfo.orderId + "非正常状态不能发货。<br />";
|
||||
}
|
||||
else if (orderInfo.payStatus == (int)GlobalEnumVars.OrderPayStatus.No)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + orderInfo.orderId + "未支付不能发货。<br />";
|
||||
}
|
||||
else if (orderInfo.shipStatus != (int)GlobalEnumVars.OrderShipStatus.No && orderInfo.shipStatus != (int)GlobalEnumVars.OrderShipStatus.PartialYes)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + orderInfo.orderId + "不是待发货和部分发货状态不能发货。<br />";
|
||||
}
|
||||
//校验,不能普通快递和门店自提,不能混发
|
||||
isStoreId = orderInfo.storeId;
|
||||
|
||||
//判断是否有未审核的售后单,如果有,就不能发货,已做拦截
|
||||
var isHaveBillAfterSales = await _billAftersalesServices.ExistsAsync(p =>
|
||||
p.orderId == orderInfo.orderId &&
|
||||
p.status == (int)GlobalEnumVars.BillAftersalesStatus.WaitAudit);
|
||||
if (isHaveBillAfterSales)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + orderInfo.orderId + "有未审核的售后单,请先处理掉才能发货。";
|
||||
return jm;
|
||||
}
|
||||
AfterSalesVal(orderInfo, 0);
|
||||
|
||||
|
||||
if (!jm.status)
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
|
||||
var newOrder = new AdminOrderShipOneResult()
|
||||
{
|
||||
orderId = orderId,
|
||||
weight = orderInfo.weight,
|
||||
costFreight = orderInfo.costFreight,
|
||||
storeId = orderInfo.storeId,
|
||||
shipAreaId = orderInfo.shipAreaId,
|
||||
shipAddress = orderInfo.shipAddress,
|
||||
shipName = orderInfo.shipName,
|
||||
shipMobile = orderInfo.shipMobile,
|
||||
logisticsId = orderInfo.logisticsId,
|
||||
logisticsName = orderInfo.logisticsName,
|
||||
items = new List<CoreCmsOrderItem>(),
|
||||
orderInfo = orderInfo,
|
||||
memo = orderInfo.memo
|
||||
};
|
||||
|
||||
if (newOrder.logisticsId > 0)
|
||||
{
|
||||
newOrder.ship = await _shipServices.QueryByClauseAsync(p => p.id == newOrder.logisticsId);
|
||||
}
|
||||
|
||||
//组合总运费
|
||||
foreach (var orderItem in orderInfo.items)
|
||||
{
|
||||
var model = newOrder.items.FirstOrDefault(p => p.productId == orderItem.productId);
|
||||
if (model == null)
|
||||
{
|
||||
newOrder.items.Add(orderItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
var index = newOrder.items.IndexOf(model);
|
||||
newOrder.items[index].nums += orderItem.nums;//总数量
|
||||
newOrder.items[index].weight += orderItem.weight;//总重量
|
||||
newOrder.items[index].sendNums += orderItem.sendNums;//已发送数量
|
||||
newOrder.items[index].reshipNums += orderItem.reshipNums;//退货数量
|
||||
}
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.data = newOrder;
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 发货改状态
|
||||
/// <summary>
|
||||
/// 发货改状态
|
||||
@@ -1663,10 +1779,10 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 订单发货
|
||||
#region 订单批量发货
|
||||
|
||||
/// <summary>
|
||||
/// 订单发货
|
||||
/// 订单批量发货
|
||||
/// </summary>
|
||||
/// <param name="ids">订单标号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
@@ -1679,7 +1795,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> OrderShip(string[] ids, string logiCode, string logiNo,
|
||||
public async Task<WebApiCallBack> BatchShip(string[] ids, string logiCode, string logiNo,
|
||||
Dictionary<int, int> items, string shipName, string shipMobile, string shipAddress, string memo, int storeId = 0, int shipAreaId = 0)
|
||||
{
|
||||
|
||||
@@ -1689,6 +1805,34 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 订单单个发货
|
||||
|
||||
/// <summary>
|
||||
/// 订单单个发货
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <param name="deliveryCompanyId">直播物流编码</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Ship(string orderId, string logiCode, string logiNo,
|
||||
Dictionary<int, int> items, string shipName, string shipMobile, string shipAddress, string memo, int storeId = 0, int shipAreaId = 0)
|
||||
{
|
||||
var result = await _billDeliveryServices.Ship(orderId, logiCode, logiNo, items, storeId, shipName, shipMobile, shipAreaId, shipAddress, memo);
|
||||
return result;
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 完成订单
|
||||
/// <summary>
|
||||
/// 完成订单
|
||||
|
||||
@@ -94,16 +94,21 @@ namespace CoreCms.Net.Services
|
||||
var list = new List<CoreCmsLogistics>();
|
||||
|
||||
|
||||
var logistics = new CoreCmsLogistics();
|
||||
logistics.logiCode = "benditongcheng";
|
||||
logistics.logiName = "本地同城配送";
|
||||
logistics.imgUrl = "";
|
||||
logistics.phone = shopMobile;
|
||||
logistics.url = "";
|
||||
logistics.sort = -1;
|
||||
logistics.isDelete = false;
|
||||
var systemLogistics = SystemSettingDictionary.GetSystemLogistics();
|
||||
systemLogistics.ForEach(p =>
|
||||
{
|
||||
var logistics = new CoreCmsLogistics();
|
||||
logistics.logiCode = p.sKey;
|
||||
logistics.logiName = p.sDescription;
|
||||
logistics.imgUrl = "";
|
||||
logistics.phone = shopMobile;
|
||||
logistics.url = "";
|
||||
logistics.sort = -1;
|
||||
logistics.isDelete = false;
|
||||
|
||||
list.Add(logistics);
|
||||
});
|
||||
|
||||
list.Add(logistics);
|
||||
|
||||
var count = 0;
|
||||
person.showapi_res_body.expressList.ForEach(p =>
|
||||
|
||||
@@ -1312,11 +1312,14 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
||||
return Json(jm);
|
||||
}
|
||||
|
||||
if (entity.code == "benditongcheng")
|
||||
var systemLogistics = SystemSettingDictionary.GetSystemLogistics();
|
||||
foreach (var p in systemLogistics)
|
||||
{
|
||||
jm.code = 1;
|
||||
jm.msg = "本地同城配送不支持轨迹查询";
|
||||
return Json(jm);
|
||||
if (entity.code == p.sKey)
|
||||
{
|
||||
jm.msg = p.sDescription + "不支持轨迹查询";
|
||||
return Json(jm);
|
||||
}
|
||||
}
|
||||
|
||||
jm = await _logisticsServices.ExpressPoll(entity.code, entity.no, entity.mobile);
|
||||
|
||||
@@ -499,9 +499,16 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var ids = entity.orderId.Split(",");
|
||||
|
||||
var result = await _coreCmsOrderServices.OrderShip(ids, entity.logiCode, entity.logiNo, entity.items, entity.shipName, entity.shipMobile, entity.shipAddress, entity.memo, entity.storeId, entity.shipAreaId);
|
||||
WebApiCallBack result;
|
||||
if (entity.orderId.Contains(","))
|
||||
{
|
||||
var ids = entity.orderId.Split(",");
|
||||
result = await _coreCmsOrderServices.BatchShip(ids, entity.logiCode, entity.logiNo, entity.items, entity.shipName, entity.shipMobile, entity.shipAddress, entity.memo, entity.storeId, entity.shipAreaId);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = await _coreCmsOrderServices.Ship(entity.orderId, entity.logiCode, entity.logiNo, entity.items, entity.shipName, entity.shipMobile, entity.shipAddress, entity.memo, entity.storeId, entity.shipAreaId);
|
||||
}
|
||||
|
||||
jm.code = result.status ? 0 : 1;
|
||||
jm.msg = result.msg;
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
<script type="text/html" template lay-done="layui.data.done(d);">
|
||||
<table class="layui-table layui-form" lay-filter="LAY-app-CoreCmsGoods-detailsForm" id="LAY-app-CoreCmsGoods-detailsForm">
|
||||
<colgroup>
|
||||
<col width="100">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="id">商品ID</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.id || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="bn">商品条码</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.bn || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="name">商品名称</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.name || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="brief">商品简介</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.brief || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="image">缩略图</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.image || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="images">图集</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.images || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="video">视频</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.video || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="productsDistributionType">佣金分配方式</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.productsDistributionType || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsCategoryId">商品分类</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsCategoryId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsTypeId">商品类别</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsTypeId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsSkuIds">sku序列</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsSkuIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsParamsIds">参数序列</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsParamsIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="brandId">品牌</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.brandId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isNomalVirtual">是否虚拟商品</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isNomalVirtual" value="{{d.params.data.isNomalVirtual}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isNomalVirtual" {{ d.params.data.isNomalVirtual ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isMarketable">是否上架</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isMarketable" value="{{d.params.data.isMarketable}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isMarketable" {{ d.params.data.isMarketable ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="unit">商品单位</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.unit || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="intro">商品详情</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.intro || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="spesDesc">商品规格序列号存储</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.spesDesc || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="parameters">参数序列化</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.parameters || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="commentsCount">评论次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.commentsCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="viewCount">浏览次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.viewCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="buyCount">购买次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.buyCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="uptime">上架时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.uptime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="downtime">下架时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.downtime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="sort">商品排序</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.sort || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="labelIds">标签id逗号分隔</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.labelIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="newSpec">自定义规格名称</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.newSpec || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="openSpec">开启规则</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.openSpec || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="createTime">创建时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.createTime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="updateTime">更新时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.updateTime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isRecommend">是否推荐</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isRecommend" value="{{d.params.data.isRecommend}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isRecommend" {{ d.params.data.isRecommend ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isHot">是否热门</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isHot" value="{{d.params.data.isHot}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isHot" {{ d.params.data.isHot ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isDel">是否删除</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isDel" value="{{d.params.data.isDel}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isDel" {{ d.params.data.isDel ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</script>
|
||||
<script>
|
||||
var debug= layui.setter.debug;
|
||||
layui.data.done = function (d) {
|
||||
//开启调试情况下获取接口赋值数据
|
||||
if (debug) { console.log(d.params.data); }
|
||||
|
||||
layui.use(['admin', 'form', 'coreHelper'], function () {
|
||||
var $ = layui.$
|
||||
, setter = layui.setter
|
||||
, admin = layui.admin
|
||||
, coreHelper = layui.coreHelper
|
||||
, form = layui.form;
|
||||
form.render(null, 'LAY-app-CoreCmsGoods-detailsForm');
|
||||
});
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,361 @@
|
||||
<script type="text/html" template lay-done="layui.data.done(d);">
|
||||
|
||||
|
||||
<div class="layui-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">基础信息</li>
|
||||
<li>图集视频</li>
|
||||
<li>SKU/货品设置</li>
|
||||
<li>参数设置</li>
|
||||
<li>会员折扣</li>
|
||||
<li>商品详情</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
基础信息
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
图集视频
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
SKU/货品设置
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
参数设置
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
会员折扣
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
商品详情
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<table class="layui-table layui-form" lay-filter="LAY-app-CoreCmsGoods-detailsForm" id="LAY-app-CoreCmsGoods-detailsForm">
|
||||
<colgroup>
|
||||
<col width="100">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="id">商品ID</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.id || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="bn">商品条码</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.bn || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="name">商品名称</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.name || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="brief">商品简介</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.brief || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="image">缩略图</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.image || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="images">图集</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.images || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="video">视频</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.video || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="productsDistributionType">佣金分配方式</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.productsDistributionType || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsCategoryId">商品分类</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsCategoryId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsTypeId">商品类别</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsTypeId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsSkuIds">sku序列</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsSkuIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="goodsParamsIds">参数序列</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.goodsParamsIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="brandId">品牌</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.brandId || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isNomalVirtual">是否虚拟商品</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isNomalVirtual" value="{{d.params.data.isNomalVirtual}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isNomalVirtual" {{ d.params.data.isNomalVirtual ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isMarketable">是否上架</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isMarketable" value="{{d.params.data.isMarketable}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isMarketable" {{ d.params.data.isMarketable ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="unit">商品单位</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.unit || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="intro">商品详情</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.intro || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="spesDesc">商品规格序列号存储</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.spesDesc || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="parameters">参数序列化</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.parameters || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="commentsCount">评论次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.commentsCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="viewCount">浏览次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.viewCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="buyCount">购买次数</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.buyCount || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="uptime">上架时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.uptime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="downtime">下架时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.downtime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="sort">商品排序</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.sort || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="labelIds">标签id逗号分隔</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.labelIds || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="newSpec">自定义规格名称</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.newSpec || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="openSpec">开启规则</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.openSpec || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="createTime">创建时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.createTime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="updateTime">更新时间</label>
|
||||
</td>
|
||||
<td>
|
||||
{{ d.params.data.updateTime || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isRecommend">是否推荐</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isRecommend" value="{{d.params.data.isRecommend}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isRecommend" {{ d.params.data.isRecommend ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isHot">是否热门</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isHot" value="{{d.params.data.isHot}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isHot" {{ d.params.data.isHot ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<label for="isDel">是否删除</label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" disabled name="isDel" value="{{d.params.data.isDel}}" lay-skin="switch" lay-text="开启|关闭" lay-filter="isDel" {{ d.params.data.isDel ? 'checked' : '' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</script>
|
||||
<script>
|
||||
var debug = layui.setter.debug;
|
||||
layui.data.done = function (d) {
|
||||
//开启调试情况下获取接口赋值数据
|
||||
if (debug) { console.log(d.params.data); }
|
||||
|
||||
layui.use(['admin', 'form', 'coreHelper'], function () {
|
||||
var $ = layui.$
|
||||
, setter = layui.setter
|
||||
, admin = layui.admin
|
||||
, coreHelper = layui.coreHelper
|
||||
, form = layui.form;
|
||||
form.render(null, 'LAY-app-CoreCmsGoods-detailsForm');
|
||||
});
|
||||
};
|
||||
</script>
|
||||
@@ -273,12 +273,16 @@
|
||||
});
|
||||
});
|
||||
//监听行双击事件
|
||||
//table.on('rowDouble(LAY-app-CoreCmsGoods-tableBox)', function (obj) {
|
||||
//});
|
||||
table.on('rowDouble(LAY-app-CoreCmsGoods-tableBox)', function (obj) {
|
||||
//查看详情
|
||||
doDetails(obj);
|
||||
});
|
||||
//监听工具条
|
||||
table.on('tool(LAY-app-CoreCmsGoods-tableBox)',
|
||||
function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
if (obj.event === 'detail') {
|
||||
doDetails(obj);
|
||||
} else if (obj.event === 'del') {
|
||||
doDelete(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
doEdit(obj)
|
||||
@@ -547,6 +551,31 @@
|
||||
function doEdit(obj) {
|
||||
location.hash = '/good/goods/edit/id=' + obj.data.id;
|
||||
}
|
||||
|
||||
//执行预览操作
|
||||
function doDetails(obj) {
|
||||
coreHelper.Post("Api/CoreCmsGoods/GetDetails", { id: obj.data.id }, function (e) {
|
||||
if (e.code === 0) {
|
||||
admin.popup({
|
||||
shadeClose: false,
|
||||
title: '查看详情',
|
||||
area: ['1200px', '90%'],
|
||||
id: 'LAY-popup-CoreCmsGoods-details',
|
||||
success: function (layero, index) {
|
||||
view(this.id).render('good/goods/details', { data: e.data }).done(function () {
|
||||
form.render();
|
||||
});
|
||||
// 禁止弹窗出现滚动条
|
||||
$(layero).children('.layui-layer-content').css('overflow', 'visible');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//执行单个删除
|
||||
function doDelete(obj) {
|
||||
coreHelper.Post("Api/CoreCmsGoods/DoDelete", { id: obj.data.id }, function (e) {
|
||||
|
||||
@@ -356,6 +356,18 @@
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">退货的详细地址</div>
|
||||
</div>
|
||||
|
||||
<blockquote class="layui-elem-quote">
|
||||
发货相关
|
||||
</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{{d.data.configs['storeOrderAutomaticDelivery']['sKey']}}:</label>
|
||||
<div class="layui-input-inline layui-inline-7">
|
||||
<input type="radio" lay-filter="storeOrderAutomaticDelivery" name="storeOrderAutomaticDelivery" value="1" title="开启" {{d.data.configs['storeOrderAutomaticDelivery']['sValue']==="1" ? 'checked':''}}>
|
||||
<input type="radio" lay-filter="storeOrderAutomaticDelivery" name="storeOrderAutomaticDelivery" value="2" title="不开启" {{d.data.configs['storeOrderAutomaticDelivery']['sValue']==="2" ? 'checked':''}}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"> </label>
|
||||
<div class="layui-input-block">
|
||||
|
||||
@@ -508,10 +508,14 @@ namespace CoreCms.Net.Web.WebApi.Controllers
|
||||
return Json(jm);
|
||||
}
|
||||
|
||||
if (entity.code == "benditongcheng")
|
||||
var systemLogistics = SystemSettingDictionary.GetSystemLogistics();
|
||||
foreach (var p in systemLogistics)
|
||||
{
|
||||
jm.msg = "本地同城配送不支持轨迹查询";
|
||||
return Json(jm);
|
||||
if (entity.code == p.sKey)
|
||||
{
|
||||
jm.msg = p.sDescription + "不支持轨迹查询";
|
||||
return Json(jm);
|
||||
}
|
||||
}
|
||||
|
||||
jm = await _logisticsServices.ExpressPoll(entity.code, entity.no, entity.mobile);
|
||||
|
||||
Reference in New Issue
Block a user