diff --git a/CoreCms.Net.Configuration/GlobalConstVars.cs b/CoreCms.Net.Configuration/GlobalConstVars.cs index 106365a3..cb2ec660 100644 --- a/CoreCms.Net.Configuration/GlobalConstVars.cs +++ b/CoreCms.Net.Configuration/GlobalConstVars.cs @@ -353,6 +353,10 @@ namespace CoreCms.Net.Configuration /// public const string WeChatPayNotice = "WeChatPayNoticeQueue"; /// + /// 微信支付成功后推送到接口进行发货处理 + /// + public const string WeChatPayShipping = "WeChatPayShippingQueue"; + /// /// 微信模板消息 /// public const string SendWxTemplateMessage = "SendWxTemplateMessage"; diff --git a/CoreCms.Net.Configuration/GlobalEnumVars.cs b/CoreCms.Net.Configuration/GlobalEnumVars.cs index 21ef2068..ea958e7a 100644 --- a/CoreCms.Net.Configuration/GlobalEnumVars.cs +++ b/CoreCms.Net.Configuration/GlobalEnumVars.cs @@ -1066,12 +1066,6 @@ namespace CoreCms.Net.Configuration /// [Description("接龙")] Solitaire = 8, - /// - /// 微信交易组件 - /// - [Description("微信交易组件")] - TransactionComponent = 10, - } /// @@ -3260,5 +3254,91 @@ namespace CoreCms.Net.Configuration #endregion + #region 微信发货管理 + + /// + /// 微信发货信息管理订单状态 + /// + public enum WeChatShippingOrderStatus + { + /// + /// 待发货 + /// + [Description("")] + 待发货 = 1, + + /// + /// 已发货 + /// + [Description("")] + 已发货 = 2, + + /// + /// 确认收货 + /// + [Description("")] + 确认收货 = 3, + + /// + /// 交易完成 + /// + [Description("")] + 交易完成 = 4, + + /// + /// 已退款 + /// + [Description("")] + 已退款 = 5 + } + + /// + /// 物流模式 + /// + public enum WeChatShippingLogisticsType + { + /// + /// 物流配送 + /// + [Description("")] + 物流配送 = 1, + + /// + /// 同城配送 + /// + [Description("")] + 同城配送 = 2, + + /// + /// 虚拟商品 + /// + [Description("")] + 虚拟商品 = 3, + + /// + /// 用户自提 + /// + [Description("")] + 用户自提 = 4, + } + + /// + /// 发货模式 + /// + public enum WeChatShippingDeliveryMode + { + /// + /// 统一发货 + /// + UNIFIED_DELIVERY = 1, + + /// + /// 分拆发货 + /// + SPLIT_DELIVERY = 2 + } + + #endregion + } } diff --git a/CoreCms.Net.Core/Config/RedisMessageQueueSetup.cs b/CoreCms.Net.Core/Config/RedisMessageQueueSetup.cs index 853e7a90..cb5f05dc 100644 --- a/CoreCms.Net.Core/Config/RedisMessageQueueSetup.cs +++ b/CoreCms.Net.Core/Config/RedisMessageQueueSetup.cs @@ -29,6 +29,7 @@ namespace CoreCms.Net.Core.Config //对应的订阅者类,需要new一个实例对象,当然你也可以传参,比如日志对象 m.ListSubscribe = new List() { typeof(MessagePushSubscribe), + typeof(WeChatPayShippingSubscribe), typeof(RefundSubscribe), typeof(OrderAgentOrDistributionSubscribe), typeof(OrderAutomaticDeliverySubscribe), diff --git a/CoreCms.Net.DTO/WeChatShipping/GetDeliveryListResult.cs b/CoreCms.Net.DTO/WeChatShipping/GetDeliveryListResult.cs new file mode 100644 index 00000000..4b9b604b --- /dev/null +++ b/CoreCms.Net.DTO/WeChatShipping/GetDeliveryListResult.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreCms.Net.DTO.WeChatShipping +{ + /// + /// 获取运力id列表get_delivery_list返回值处理 + /// + + public class GetDeliveryListResult + { + /// + /// 返回码 + /// + public int errcode { get; set; } + + /// + /// 运力公司个数 + /// + public int count { get; set; } + + /// + /// 运力公司列表 + /// + public List delivery_list { get; set; } + + + } + + /// + /// 快递公司实体 + /// + public class deliveryModel + { + /// + /// 公司编码 + /// + public string delivery_id { get; set; } + + /// + /// 公司名称 + /// + public string delivery_name { get; set; } + + + } + +} diff --git a/CoreCms.Net.DTO/WeChatShipping/OrderShippingCreatePost.cs b/CoreCms.Net.DTO/WeChatShipping/OrderShippingCreatePost.cs new file mode 100644 index 00000000..4e0be3fd --- /dev/null +++ b/CoreCms.Net.DTO/WeChatShipping/OrderShippingCreatePost.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreCms.Net.DTO.WeChatShipping +{ + /// + /// 发货信息录入接口提交参数 + /// + public class OrderShippingCreatePost + { + /// + /// 同城配送快递编码 + /// + public string? cityDistributionName { get; set; } + /// + /// 同城配送快递单号 + /// + public string? cityDistributionNumber { get; set; } + + /// + /// 是否全部发货 + /// + public bool is_all_delivered { get; set; } = false; + + /// + /// 商品信息 + /// + public string item_desc { get; set; } + + /// + /// 发货类型 + /// + public int logistics_type { get; set; } + + /// + /// 交易单号 + /// + public string transaction_id { get; set; } + + /// + /// 物流信息 + /// + public List? shipping_list { get; set; } + + /// + /// openid + /// + public string openid { get; set; } + + /// + /// 商户号 + /// + public string merchant_id { get; set; } + + /// + /// 商家订单编号 + /// + public string merchant_trade_no { get; set; } + + + } + + public class ShippingList + { + /// + /// 快递公司名称 + /// + public string express_company { get; set; } + + /// + /// 快递单号 + /// + public string tracking_no { get; set; } + + } + +} diff --git a/CoreCms.Net.IRepository/WeChatShipping/IWeChatShippingDeliveryRepository.cs b/CoreCms.Net.IRepository/WeChatShipping/IWeChatShippingDeliveryRepository.cs new file mode 100644 index 00000000..9775d45e --- /dev/null +++ b/CoreCms.Net.IRepository/WeChatShipping/IWeChatShippingDeliveryRepository.cs @@ -0,0 +1,98 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.ViewModels.Basics; +using CoreCms.Net.Model.ViewModels.UI; +using SqlSugar; + + +namespace CoreCms.Net.IRepository +{ + /// + /// 微信发货快递公司信息 工厂接口 + /// + public interface IWeChatShippingDeliveryRepository : IBaseRepository + { + #region 重写增删改查操作=========================================================== + + /// + /// 重写异步插入方法 + /// + /// + /// + Task InsertAsync(WeChatShippingDelivery entity); + + + /// + /// 重写异步更新方法 + /// + /// + /// + Task UpdateAsync(WeChatShippingDelivery entity); + + + /// + /// 重写异步更新方法 + /// + /// + /// + Task UpdateAsync(List entity); + + + /// + /// 重写删除指定ID的数据 + /// + /// + /// + Task DeleteByIdAsync(object id); + + + /// + /// 重写删除指定ID集合的数据(批量删除) + /// + /// + /// + Task DeleteByIdsAsync(int[] ids); + + #endregion + + #region 获取缓存的所有数据========================================================== + + /// + /// 获取缓存的所有数据 + /// + /// + Task> GetCaChe(); + + #endregion + + + /// + /// 重写根据条件查询分页数据 + /// + /// 判断集合 + /// 排序方式 + /// 当前页面索引 + /// 分布大小 + /// + /// 是否使用WITH(NOLOCK) + /// + Task> QueryPageAsync( + Expression> predicate, + Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1, + int pageSize = 20, bool blUseNoLock = false); + + } +} diff --git a/CoreCms.Net.IServices/WeChatShipping/IWeChatShippingDeliveryServices.cs b/CoreCms.Net.IServices/WeChatShipping/IWeChatShippingDeliveryServices.cs new file mode 100644 index 00000000..39372d73 --- /dev/null +++ b/CoreCms.Net.IServices/WeChatShipping/IWeChatShippingDeliveryServices.cs @@ -0,0 +1,100 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.ViewModels.Basics; +using CoreCms.Net.Model.ViewModels.UI; +using SqlSugar; + +namespace CoreCms.Net.IServices +{ + /// + /// 微信发货快递公司信息 服务工厂接口 + /// + public interface IWeChatShippingDeliveryServices : IBaseServices + { + #region 重写增删改查操作=========================================================== + + /// + /// 重写异步插入方法 + /// + /// + /// + Task InsertAsync(WeChatShippingDelivery entity); + + /// + /// 重写异步更新方法 + /// + /// + /// + Task UpdateAsync(WeChatShippingDelivery entity); + + /// + /// 重写异步更新方法 + /// + /// + /// + Task UpdateAsync(List entity); + + /// + /// 重写删除指定ID的数据 + /// + /// + /// + Task DeleteByIdAsync(object id); + + /// + /// 重写删除指定ID集合的数据(批量删除) + /// + /// + /// + Task DeleteByIdsAsync(int[] ids); + + #endregion + + #region 获取缓存的所有数据========================================================== + + /// + /// 获取缓存的所有数据 + /// + /// + Task> GetCaChe(); + + #endregion + + #region 重写根据条件查询分页数据 + /// + /// 重写根据条件查询分页数据 + /// + /// 判断集合 + /// 排序方式 + /// 当前页面索引 + /// 分布大小 + /// + /// 是否使用WITH(NOLOCK) + /// + Task> QueryPageAsync( + Expression> predicate, + Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1, + int pageSize = 20, bool blUseNoLock = false); + #endregion + + + /// + /// 通过接口更新所有快递公司信息 + /// + Task DoUpdateCompany(); + + } +} diff --git a/CoreCms.Net.Model/Entities/WeChatShipping/WeChatShippingDelivery.cs b/CoreCms.Net.Model/Entities/WeChatShipping/WeChatShippingDelivery.cs new file mode 100644 index 00000000..e51a8a17 --- /dev/null +++ b/CoreCms.Net.Model/Entities/WeChatShipping/WeChatShippingDelivery.cs @@ -0,0 +1,68 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace CoreCms.Net.Model.Entities +{ + /// + /// 微信发货快递公司信息 + /// + public partial class WeChatShippingDelivery + { + /// + /// 构造函数 + /// + public WeChatShippingDelivery() + { + } + + /// + /// 序列 + /// + [Display(Name = "序列")] + + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + + [Required(ErrorMessage = "请输入{0}")] + + + + public System.Int32 id { get; set; } + + + /// + /// 快递公司编码 + /// + [Display(Name = "快递公司编码")] + + [Required(ErrorMessage = "请输入{0}")] + [StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")] + + + public System.String deliveryId { get; set; } + + + /// + /// 快递公司名称 + /// + [Display(Name = "快递公司名称")] + + [Required(ErrorMessage = "请输入{0}")] + [StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")] + + + public System.String deliveryName { get; set; } + + + } +} diff --git a/CoreCms.Net.RedisMQ/WeChatPayShippingSubscribe.cs b/CoreCms.Net.RedisMQ/WeChatPayShippingSubscribe.cs new file mode 100644 index 00000000..da6a12be --- /dev/null +++ b/CoreCms.Net.RedisMQ/WeChatPayShippingSubscribe.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CoreCms.Net.Caching.AccressToken; +using CoreCms.Net.Configuration; +using CoreCms.Net.IServices; +using CoreCms.Net.Loging; +using CoreCms.Net.Utility.Extensions; +using CoreCms.Net.Utility.Helper; +using CoreCms.Net.WeChat.Service.HttpClients; +using InitQ.Abstractions; +using InitQ.Attributes; +using Newtonsoft.Json; +using SKIT.FlurlHttpClient.Wechat.Api; +using SKIT.FlurlHttpClient.Wechat.Api.Models; + +namespace CoreCms.Net.RedisMQ +{ + /// + /// 微信支付成功后推送到接口进行发货处理 + /// + public class WeChatPayShippingSubscribe : IRedisSubscribe + { + private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; + private readonly ICoreCmsServicesServices _servicesServices; + private readonly ICoreCmsBillPaymentsServices _billPaymentsServices; + private readonly ICoreCmsBillDeliveryServices _billDeliveryServices; + private readonly ICoreCmsOrderItemServices _orderItemServices; + private readonly ICoreCmsUserServices _userServices; + private readonly ICoreCmsUserWeChatInfoServices _weChatInfoServices; + private readonly ICoreCmsOrderServices _orderServices; + private readonly ICoreCmsSettingServices _settingServices; + + + + public WeChatPayShippingSubscribe(ICoreCmsBillPaymentsServices billPaymentsServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsServicesServices servicesServices, ICoreCmsBillDeliveryServices billDeliveryServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsUserServices userServices, ICoreCmsUserWeChatInfoServices weChatInfoServices, ICoreCmsOrderServices orderServices, ICoreCmsSettingServices settingServices) + { + _billPaymentsServices = billPaymentsServices; + _weChatApiHttpClientFactory = weChatApiHttpClientFactory; + _servicesServices = servicesServices; + _billDeliveryServices = billDeliveryServices; + _orderItemServices = orderItemServices; + _userServices = userServices; + _weChatInfoServices = weChatInfoServices; + _orderServices = orderServices; + _settingServices = settingServices; + } + + /// + /// 微信支付成功后推送到接口进行发货处理 + /// + /// + /// + [Subscribe(RedisMessageQueueKey.WeChatPayShipping)] + private async Task WeChatPayNotice(string msg) + { + try + { + var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == msg); + if (paymentOrder == null) + { + NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":支付单不存在"); + return; + } + else + { + if (paymentOrder.paymentCode != GlobalEnumVars.PaymentsTypes.wechatpay.ToString()) + { + NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":非微信支付方式不予处理"); + return; + } + + + + + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + + var isTradeManagedRequest = new WxaSecOrderIsTradeManagedRequest() + { + AccessToken = accessToken + }; + //商品名称 + var orderTitle = string.Empty; + //检索是否开启了微信发货信息功能,才会进行后面的发货操作 + var responseIsTradeManagedResponse = await client.ExecuteWxaSecOrderIsTradeManagedAsync(isTradeManagedRequest); + if (responseIsTradeManagedResponse.IsSuccessful() && responseIsTradeManagedResponse.IsTradeManaged) + { + //判断不同支付单类型下如何获取商品标题,目前只是简单标题,非商品订单如果需要详细到具体明细,建议扩展获取其他关联信息。 + switch (paymentOrder.type) + { + case (int)GlobalEnumVars.BillPaymentsType.Recharge: + orderTitle = "用户充值" + paymentOrder.money + "元"; + break; + case (int)GlobalEnumVars.BillPaymentsType.FormOrder: + orderTitle = "表单订单"; + break; + case (int)GlobalEnumVars.BillPaymentsType.FormPay: + orderTitle = "表单付款码支付"; + break; + case (int)GlobalEnumVars.BillPaymentsType.ServiceOrder: + { + var id = Convert.ToInt32(paymentOrder.sourceId); + var serviceModel = await _servicesServices.QueryByClauseAsync(p => p.id == id); + if (serviceModel == null) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":服务项目获取失败"); + return; + } + orderTitle = serviceModel.title; + break; + } + case (int)GlobalEnumVars.BillPaymentsType.Common: + case (int)GlobalEnumVars.BillPaymentsType.PinTuan: + case (int)GlobalEnumVars.BillPaymentsType.Group: + case (int)GlobalEnumVars.BillPaymentsType.Seckill: + case (int)GlobalEnumVars.BillPaymentsType.Solitaire: + { + var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (!orderItems.Any()) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单详情获取失败"); + return; + } + + if (orderItems.Count == 1) + { + orderTitle = orderItems.FirstOrDefault()?.name; + } + else + { + orderItems.ForEach(p => { orderTitle += p.name + ";"; }); + } + + break; + } + case (int)GlobalEnumVars.BillPaymentsType.Bargain: + orderTitle = "砍价活动"; + break; + case (int)GlobalEnumVars.BillPaymentsType.Giveaway: + orderTitle = "购物赠品"; + break; + default: + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单类型获取失败"); + return; + } + + + //构建请求 + var request = new WxaSecOrderUploadShippingInfoRequest + { + AccessToken = accessToken, + OrderKey = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.OrderKey() + { + OrderNumberType = 2, + TransactionId = paymentOrder.tradeNo, + }, + IsFinishAll = true + }; + + + //组装参数 + + //获取openid + var user = await _userServices.QueryByClauseAsync(p => p.id == paymentOrder.userId); + if (user == null) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息获取失败"); + return; + } + + var weChatUserInfo = await _weChatInfoServices.QueryByClauseAsync(p => p.userId == user.id); + if (weChatUserInfo == null) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息openId获取失败"); + return; + } + + request.Payer = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.Payer() { OpenId = weChatUserInfo.openid }; + + //设置发货信息 + //如果是商品模式是,则去走快递或者自提及同城配送。 + //两种情况:1支付单支付成功后,自动调用此模式处理充值,服务商品,用户自提的订单,2、如果是后台手动发货,处理发货的订单业务。 + var shippingList = new List(); + + if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Common + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Group + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Seckill + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire) + { + //获取订单 + var order = await _orderServices.QueryByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (order == null) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单获取失败"); + return; + } + + request.LogisticsType = order.receiptType switch + { + //设置物流的发货模式 + (int)GlobalEnumVars.OrderReceiptType.SelfDelivery => (int)GlobalEnumVars.WeChatShippingLogisticsType.用户自提, + (int)GlobalEnumVars.OrderReceiptType.IntraCityService => (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送, + (int)GlobalEnumVars.OrderReceiptType.Logistics => (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送, + _ => request.LogisticsType + }; + + //判断订单是否发货 + if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.PartialYes or (int)GlobalEnumVars.OrderShipStatus.Yes) + { + //获取订单的发货信息 + var orderBillDeliveries = await _billDeliveryServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (orderBillDeliveries == null || !orderBillDeliveries.Any()) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作"); + return; + } + shippingList.AddRange(orderBillDeliveries.Select(item => new WxaSecOrderUploadShippingInfoRequest.Types.Shipping { ItemDescription = orderTitle, ExpressCompany = item.thirdPartylogiCode, TrackingNumber = item.logiNo })); + + request.DeliveryMode = orderBillDeliveries.Count > 1 + ? (int)GlobalEnumVars.WeChatShippingDeliveryMode.SPLIT_DELIVERY + : (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; + } + else + { + //判断是否门店订单自动发货 + var allConfigs = await _settingServices.GetConfigDictionaries(); + var storeOrderAutomaticDelivery = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreOrderAutomaticDelivery).ObjectToInt(1); + if (storeOrderAutomaticDelivery == 1 || order.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery) + { + shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" }); + } + else + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作"); + return; + } + } + } + else + { + //非商品模式,直接走虚拟发货。 + request.LogisticsType = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; + shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" }); + } + + request.ShippingList = shippingList; + + var response = await client.ExecuteWxaSecOrderUploadShippingInfoAsync(request); + if (response.IsSuccessful()) + { + NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":发货提交成功"); + } + else + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-推送接口", JsonConvert.SerializeObject(response)); + + } + } + else + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-获取是否需要推送", JsonConvert.SerializeObject(responseIsTradeManagedResponse)); + } + } + } + catch (Exception ex) + { + NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg, ex); + throw; + } + await Task.CompletedTask; + } + + } +} diff --git a/CoreCms.Net.Repository/Bill/CoreCmsBillPaymentsRepository.cs b/CoreCms.Net.Repository/Bill/CoreCmsBillPaymentsRepository.cs index e635768b..cd18b042 100644 --- a/CoreCms.Net.Repository/Bill/CoreCmsBillPaymentsRepository.cs +++ b/CoreCms.Net.Repository/Bill/CoreCmsBillPaymentsRepository.cs @@ -46,7 +46,7 @@ namespace CoreCms.Net.Repository { var dt = DateTime.Now.AddDays(-8); - var types = new int[] { (int)GlobalEnumVars.BillPaymentsType.Common, (int)GlobalEnumVars.BillPaymentsType.PinTuan, (int)GlobalEnumVars.BillPaymentsType.Group, (int)GlobalEnumVars.BillPaymentsType.Seckill, (int)GlobalEnumVars.BillPaymentsType.Bargain, (int)GlobalEnumVars.BillPaymentsType.Giveaway, (int)GlobalEnumVars.BillPaymentsType.Solitaire, (int)GlobalEnumVars.BillPaymentsType.TransactionComponent }; + var types = new int[] { (int)GlobalEnumVars.BillPaymentsType.Common, (int)GlobalEnumVars.BillPaymentsType.PinTuan, (int)GlobalEnumVars.BillPaymentsType.Group, (int)GlobalEnumVars.BillPaymentsType.Seckill, (int)GlobalEnumVars.BillPaymentsType.Bargain, (int)GlobalEnumVars.BillPaymentsType.Giveaway, (int)GlobalEnumVars.BillPaymentsType.Solitaire }; var list = await DbClient.Queryable() .Where(p => p.createTime >= dt && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed && types.Contains(p.type)) diff --git a/CoreCms.Net.Repository/WeChatShipping/WeChatShippingDeliveryRepository.cs b/CoreCms.Net.Repository/WeChatShipping/WeChatShippingDeliveryRepository.cs new file mode 100644 index 00000000..04052fc3 --- /dev/null +++ b/CoreCms.Net.Repository/WeChatShipping/WeChatShippingDeliveryRepository.cs @@ -0,0 +1,196 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Caching.Manual; +using CoreCms.Net.Configuration; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.ViewModels.Basics; +using CoreCms.Net.IRepository; +using CoreCms.Net.IRepository.UnitOfWork; +using CoreCms.Net.Model.ViewModels.UI; +using SqlSugar; + +namespace CoreCms.Net.Repository +{ + /// + /// 微信发货快递公司信息 接口实现 + /// + public class WeChatShippingDeliveryRepository : BaseRepository, IWeChatShippingDeliveryRepository + { + private readonly IUnitOfWork _unitOfWork; + public WeChatShippingDeliveryRepository(IUnitOfWork unitOfWork) : base(unitOfWork) + { + _unitOfWork = unitOfWork; + } + + #region 实现重写增删改查操作========================================================== + + /// + /// 重写异步插入方法 + /// + /// 实体数据 + /// + public async Task InsertAsync(WeChatShippingDelivery entity) + { + var jm = new AdminUiCallBack(); + + var bl = await DbClient.Insertable(entity).ExecuteReturnIdentityAsync() > 0; + jm.code = bl ? 0 : 1; + jm.msg = bl ? GlobalConstVars.CreateSuccess : GlobalConstVars.CreateFailure; + + return jm; + } + + /// + /// 重写异步更新方法 + /// + /// + /// + public async Task UpdateAsync(WeChatShippingDelivery entity) + { + var jm = new AdminUiCallBack(); + + var oldModel = await DbClient.Queryable().In(entity.id).SingleAsync(); + if (oldModel == null) + { + jm.msg = "不存在此信息"; + return jm; + } + //事物处理过程开始 + oldModel.id = entity.id; + oldModel.deliveryId = entity.deliveryId; + oldModel.deliveryName = entity.deliveryName; + + //事物处理过程结束 + var bl = await DbClient.Updateable(oldModel).ExecuteCommandHasChangeAsync(); + jm.code = bl ? 0 : 1; + jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure; + + return jm; + } + + /// + /// 重写异步更新方法 + /// + /// + /// + public async Task UpdateAsync(List entity) + { + var jm = new AdminUiCallBack(); + + var bl = await DbClient.Updateable(entity).ExecuteCommandHasChangeAsync(); + jm.code = bl ? 0 : 1; + jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure; + + return jm; + } + + /// + /// 重写删除指定ID的数据 + /// + /// + /// + public async Task DeleteByIdAsync(object id) + { + var jm = new AdminUiCallBack(); + + var bl = await DbClient.Deleteable(id).ExecuteCommandHasChangeAsync(); + jm.code = bl ? 0 : 1; + jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure; + + return jm; + } + + /// + /// 重写删除指定ID集合的数据(批量删除) + /// + /// + /// + public async Task DeleteByIdsAsync(int[] ids) + { + var jm = new AdminUiCallBack(); + + var bl = await DbClient.Deleteable().In(ids).ExecuteCommandHasChangeAsync(); + jm.code = bl ? 0 : 1; + jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure; + + return jm; + } + + #endregion + + #region 获取缓存的所有数据========================================================== + + /// + /// 获取缓存的所有数据 + /// + /// + public async Task> GetCaChe() + { + var list = await DbClient.Queryable().With(SqlWith.NoLock).WithCache().ToListAsync(); + return list; + } + + #endregion + + + #region 重写根据条件查询分页数据 + /// + /// 重写根据条件查询分页数据 + /// + /// 判断集合 + /// 排序方式 + /// 当前页面索引 + /// 分布大小 + /// + /// 是否使用WITH(NOLOCK) + /// + public async Task> QueryPageAsync(Expression> predicate, + Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1, + int pageSize = 20, bool blUseNoLock = false) + { + RefAsync totalCount = 0; + List page; + if (blUseNoLock) + { + page = await DbClient.Queryable() + .OrderByIF(orderByExpression != null, orderByExpression, orderByType) + .WhereIF(predicate != null, predicate).Select(p => new WeChatShippingDelivery + { + id = p.id, + deliveryId = p.deliveryId, + deliveryName = p.deliveryName, + + }).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount); + } + else + { + page = await DbClient.Queryable() + .OrderByIF(orderByExpression != null, orderByExpression, orderByType) + .WhereIF(predicate != null, predicate).Select(p => new WeChatShippingDelivery + { + id = p.id, + deliveryId = p.deliveryId, + deliveryName = p.deliveryName, + + }).ToPageListAsync(pageIndex, pageSize, totalCount); + } + var list = new PageList(page, pageIndex, pageSize, totalCount); + return list; + } + + #endregion + + } +} diff --git a/CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs b/CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs index d05b2d1e..34ab5c1b 100644 --- a/CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs +++ b/CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; +using CoreCms.Net.Caching.AutoMate.RedisCache; using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IRepository.UnitOfWork; @@ -61,6 +62,7 @@ namespace CoreCms.Net.Services private readonly ICoreCmsTopUpTypeServices _topUpTypeServices; private readonly ICoreCmsUserPointLogServices _userPointLogServices; private readonly WeChatOptions _weChatOptions; + private readonly IRedisOperationRepository _redisOperationRepository; @@ -77,7 +79,7 @@ namespace CoreCms.Net.Services , IServiceProvider serviceProvider, ICoreCmsServicesServices servicesServices , ICoreCmsUserServicesOrderServices userServicesOrderServices , ICoreCmsUserWeChatInfoServices userWeChatInfoServices - , IOptions weChatOptions, ICoreCmsTopUpTypeServices topUpTypeServices, ICoreCmsUserPointLogServices userPointLogServices) + , IOptions weChatOptions, ICoreCmsTopUpTypeServices topUpTypeServices, ICoreCmsUserPointLogServices userPointLogServices, IRedisOperationRepository redisOperationRepository) { this._dal = dal; base.BaseDal = dal; @@ -97,6 +99,7 @@ namespace CoreCms.Net.Services _userWeChatInfoServices = userWeChatInfoServices; _topUpTypeServices = topUpTypeServices; _userPointLogServices = userPointLogServices; + _redisOperationRepository = redisOperationRepository; _weChatOptions = weChatOptions.Value; } @@ -126,7 +129,6 @@ namespace CoreCms.Net.Services || type == (int)GlobalEnumVars.BillPaymentsType.Bargain || type == (int)GlobalEnumVars.BillPaymentsType.Giveaway || type == (int)GlobalEnumVars.BillPaymentsType.Solitaire - || type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent ) { //如果是订单生成支付单的话,取第一条订单的店铺id,后面的所有订单都要保证是此店铺的id @@ -286,7 +288,6 @@ namespace CoreCms.Net.Services || type == (int)GlobalEnumVars.BillPaymentsType.Bargain || type == (int)GlobalEnumVars.BillPaymentsType.Giveaway || type == (int)GlobalEnumVars.BillPaymentsType.Solitaire - || type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent ) { //如果是订单生成支付单的话,取第一条订单的店铺id,后面的所有订单都要保证是此店铺的id @@ -694,7 +695,6 @@ namespace CoreCms.Net.Services || billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.Bargain || billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.Giveaway || billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire - || billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent ) { //如果是订单类型,做支付后处理 @@ -733,6 +733,10 @@ namespace CoreCms.Net.Services { //::todo 其他业务逻辑 } + + //微信发货信息管理API发货 + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayShipping, billPaymentInfo.paymentId); + } jm.status = true; jm.data = paymentId; @@ -792,7 +796,7 @@ namespace CoreCms.Net.Services || entity.type == (int)GlobalEnumVars.BillPaymentsType.Bargain || entity.type == (int)GlobalEnumVars.BillPaymentsType.Giveaway || entity.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire - || entity.type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent) + ) { var orderItem = await _orderItemServices.QueryByClauseAsync(p => p.orderId == entity.sourceId); if (orderItem != null) @@ -852,7 +856,6 @@ namespace CoreCms.Net.Services || type == (int)GlobalEnumVars.BillPaymentsType.Bargain || type == (int)GlobalEnumVars.BillPaymentsType.Giveaway || type == (int)GlobalEnumVars.BillPaymentsType.Solitaire - || type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent ) { var orderInfo = await orderServices.QueryByIdAsync(orderId); diff --git a/CoreCms.Net.Services/WeChatShipping/WeChatShippingDeliveryServices.cs b/CoreCms.Net.Services/WeChatShipping/WeChatShippingDeliveryServices.cs new file mode 100644 index 00000000..f58a31db --- /dev/null +++ b/CoreCms.Net.Services/WeChatShipping/WeChatShippingDeliveryServices.cs @@ -0,0 +1,175 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Caching.AccressToken; +using CoreCms.Net.Configuration; +using CoreCms.Net.DTO.WeChatShipping; +using CoreCms.Net.IRepository; +using CoreCms.Net.IRepository.UnitOfWork; +using CoreCms.Net.IServices; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.ViewModels.Api; +using CoreCms.Net.Model.ViewModels.Basics; +using CoreCms.Net.Model.ViewModels.UI; +using CoreCms.Net.WeChat.Service.HttpClients; +using Flurl.Http; +using SKIT.FlurlHttpClient.Wechat.Api.Models; +using SqlSugar; + + +namespace CoreCms.Net.Services +{ + /// + /// 微信发货快递公司信息 接口实现 + /// + public class WeChatShippingDeliveryServices : BaseServices, IWeChatShippingDeliveryServices + { + private readonly IWeChatShippingDeliveryRepository _dal; + private readonly IUnitOfWork _unitOfWork; + private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; + + + public WeChatShippingDeliveryServices(IUnitOfWork unitOfWork, IWeChatShippingDeliveryRepository dal, IWeChatApiHttpClientFactory weChatApiHttpClientFactory) + { + this._dal = dal; + _weChatApiHttpClientFactory = weChatApiHttpClientFactory; + base.BaseDal = dal; + _unitOfWork = unitOfWork; + } + + #region 实现重写增删改查操作========================================================== + + /// + /// 重写异步插入方法 + /// + /// 实体数据 + /// + public async Task InsertAsync(WeChatShippingDelivery entity) + { + return await _dal.InsertAsync(entity); + } + + /// + /// 重写异步更新方法方法 + /// + /// + /// + public async Task UpdateAsync(WeChatShippingDelivery entity) + { + return await _dal.UpdateAsync(entity); + } + + /// + /// 重写异步更新方法方法 + /// + /// + /// + public async Task UpdateAsync(List entity) + { + return await _dal.UpdateAsync(entity); + } + + /// + /// 重写删除指定ID的数据 + /// + /// + /// + public async Task DeleteByIdAsync(object id) + { + return await _dal.DeleteByIdAsync(id); + } + + /// + /// 重写删除指定ID集合的数据(批量删除) + /// + /// + /// + public async Task DeleteByIdsAsync(int[] ids) + { + return await _dal.DeleteByIdsAsync(ids); + } + + #endregion + + #region 获取缓存的所有数据========================================================== + + /// + /// 获取缓存的所有数据 + /// + /// + public async Task> GetCaChe() + { + return await _dal.GetCaChe(); + } + + #endregion + + #region 重写根据条件查询分页数据 + /// + /// 重写根据条件查询分页数据 + /// + /// 判断集合 + /// 排序方式 + /// 当前页面索引 + /// 分布大小 + /// + /// 是否使用WITH(NOLOCK) + /// + public async Task> QueryPageAsync(Expression> predicate, + Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1, + int pageSize = 20, bool blUseNoLock = false) + { + return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock); + } + #endregion + + + /// + /// 通过接口更新所有快递公司信息 + /// + public async Task DoUpdateCompany() + { + var jm = new AdminUiCallBack(); + + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + + var url = $"https://api.weixin.qq.com/cgi-bin/express/delivery/open_msg/get_delivery_list?access_token={accessToken}"; + + var postData = new { accessToken }; + + var result = await url.PostJsonAsync(postData).ReceiveJson(); + + var bl = result != null; + + if (result is { errcode: 0 }) + { + //先清空历史表 + await _dal.DeleteAsync(p => p.id > 0, true); + //组装插入数据 + var insertData = result.delivery_list.Select(item => new WeChatShippingDelivery() { deliveryId = item.delivery_id, deliveryName = item.delivery_name }).ToList(); + //更新数据库 + bl = await _dal.InsertAsync(insertData, true) > 0; + + } + + jm.data = result; + + jm.code = bl ? 0 : 1; + jm.msg = bl ? "数据刷新成功" : "数据刷新失败"; + return jm; + } + + } +} diff --git a/CoreCms.Net.Web.Admin/Controllers/Order/CoreCmsOrderController.cs b/CoreCms.Net.Web.Admin/Controllers/Order/CoreCmsOrderController.cs index 9491fada..c19e102e 100644 --- a/CoreCms.Net.Web.Admin/Controllers/Order/CoreCmsOrderController.cs +++ b/CoreCms.Net.Web.Admin/Controllers/Order/CoreCmsOrderController.cs @@ -64,6 +64,7 @@ namespace CoreCms.Net.Web.Admin.Controllers private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices; private readonly IRedisOperationRepository _redisOperationRepository; private readonly CoreCms.Net.WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; + private readonly IWeChatShippingDeliveryServices _weChatShippingDeliveryServices; private readonly ICoreCmsOrderItemServices _orderItemServices; @@ -82,7 +83,7 @@ namespace CoreCms.Net.Web.Admin.Controllers , ICoreCmsLogisticsServices logisticsServices , ICoreCmsBillPaymentsServices billPaymentsServices , ICoreCmsPaymentsServices paymentsServices - , ICoreCmsSettingServices settingServices, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IRedisOperationRepository redisOperationRepository, ICoreCmsBillDeliveryServices billDeliveryServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsOrderItemServices orderItemServices) + , ICoreCmsSettingServices settingServices, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IRedisOperationRepository redisOperationRepository, ICoreCmsBillDeliveryServices billDeliveryServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsOrderItemServices orderItemServices, IWeChatShippingDeliveryServices weChatShippingDeliveryServices) { _webHostEnvironment = webHostEnvironment; _coreCmsOrderServices = coreCmsOrderServices; @@ -99,6 +100,7 @@ namespace CoreCms.Net.Web.Admin.Controllers _billDeliveryServices = billDeliveryServices; _weChatApiHttpClientFactory = weChatApiHttpClientFactory; _orderItemServices = orderItemServices; + _weChatShippingDeliveryServices = weChatShippingDeliveryServices; } #region 获取列表============================================================ @@ -493,7 +495,7 @@ namespace CoreCms.Net.Web.Admin.Controllers var storeList = await _storeServices.QueryAsync(); var logistics = await _logisticsServices.QueryListByClauseAsync(p => p.isDelete == false); - + var deliveryCompany = await _weChatShippingDeliveryServices.GetCaChe(); var result = await _coreCmsOrderServices.GetOrderShipInfo(entity.id); if (!result.status) { @@ -517,6 +519,7 @@ namespace CoreCms.Net.Web.Admin.Controllers jm.data = new { orderModel = result.data, + deliveryCompany, storeList, logistics, }; @@ -543,10 +546,32 @@ namespace CoreCms.Net.Web.Admin.Controllers { 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, entity.deliveryCompanyId); + + if (result.status) + { + var orderPaymentIds = await _billPaymentsServices.QueryListByClauseAsync(p => ids.Contains(p.sourceId) && p.paymentCode == GlobalEnumVars.PaymentsTypes.wechatpay.ToString() && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed); + if (orderPaymentIds.Any()) + { + //依次推入队列. + foreach (var item in orderPaymentIds) + { + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayShipping, item.paymentId); + } + } + + } + } 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, entity.deliveryCompanyId); + + //微信发货信息管理API发货 + if (result.status && await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == entity.orderId && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed) is { } paymentInfo) + { + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayShipping, paymentInfo.paymentId); + } + } jm.code = result.status ? 0 : 1; @@ -603,6 +628,12 @@ namespace CoreCms.Net.Web.Admin.Controllers result = await _coreCmsOrderServices.Ship(order.orderId, "benditongcheng", "无", items, order.shipName, order.shipMobile, order.shipAddress, order.memo, order.storeId, order.shipAreaId, "OTHERS"); } + //微信发货信息管理API发货 + if (result.status && await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == order.orderId && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed) is { } paymentInfo) + { + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayShipping, paymentInfo.paymentId); + } + jm.code = result.status ? 0 : 1; jm.msg = result.msg; jm.data = result.data; @@ -1716,7 +1747,7 @@ namespace CoreCms.Net.Web.Admin.Controllers return jm; } #endregion - + #region 预览快递进度============================================================ // POST: Api/CoreCmsOrder/GetDetails/10 /// diff --git a/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingDeliveryController.cs b/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingDeliveryController.cs new file mode 100644 index 00000000..be8db853 --- /dev/null +++ b/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingDeliveryController.cs @@ -0,0 +1,157 @@ +/*********************************************************************** + * Project: CoreCms + * ProjectName: 核心内容管理系统 + * Web: https://www.corecms.net + * Author: 大灰灰 + * Email: jianweie@163.com + * CreateTime: 2023/9/15 23:09:53 + * Description: 暂无 + ***********************************************************************/ + + +using System; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Configuration; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.Entities.Expression; +using CoreCms.Net.Model.FromBody; +using CoreCms.Net.Model.ViewModels.UI; +using CoreCms.Net.Filter; +using CoreCms.Net.Loging; +using CoreCms.Net.IServices; +using CoreCms.Net.Utility.Helper; +using CoreCms.Net.Utility.Extensions; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using NPOI.HSSF.UserModel; +using SqlSugar; +using CoreCms.Net.Services; + +namespace CoreCms.Net.Web.Admin.Controllers +{ + /// + /// 微信发货快递公司信息 + /// + [Description("微信发货快递公司信息")] + [Route("api/[controller]/[action]")] + [ApiController] + [RequiredErrorForAdmin] + [Authorize(Permissions.Name)] + public class WeChatShippingDeliveryController : ControllerBase + { + private readonly IWebHostEnvironment _webHostEnvironment; + private readonly IWeChatShippingDeliveryServices _weChatShippingDeliveryServices; + + /// + /// 构造函数 + /// + public WeChatShippingDeliveryController(IWebHostEnvironment webHostEnvironment + ,IWeChatShippingDeliveryServices weChatShippingDeliveryServices + ) + { + _webHostEnvironment = webHostEnvironment; + _weChatShippingDeliveryServices = weChatShippingDeliveryServices; + } + + #region 获取列表============================================================ + // POST: Api/WeChatShippingDelivery/GetPageList + /// + /// 获取列表 + /// + /// + [HttpPost] + [Description("获取列表")] + public async Task GetPageList() + { + var jm = new AdminUiCallBack(); + var pageCurrent = Request.Form["page"].FirstOrDefault().ObjectToInt(1); + var pageSize = Request.Form["limit"].FirstOrDefault().ObjectToInt(30); + var where = PredicateBuilder.True(); + //获取排序字段 + var orderField = Request.Form["orderField"].FirstOrDefault(); + + Expression> orderEx = orderField switch + { + "id" => p => p.id,"deliveryId" => p => p.deliveryId,"deliveryName" => p => p.deliveryName, + _ => p => p.id + }; + + //设置排序方式 + var orderDirection = Request.Form["orderDirection"].FirstOrDefault(); + var orderBy = orderDirection switch + { + "asc" => OrderByType.Asc, + "desc" => OrderByType.Desc, + _ => OrderByType.Desc + }; + //查询筛选 + + //序列 int + var id = Request.Form["id"].FirstOrDefault().ObjectToInt(0); + if (id > 0) + { + where = where.And(p => p.id == id); + } + //快递公司编码 nvarchar + var deliveryId = Request.Form["deliveryId"].FirstOrDefault(); + if (!string.IsNullOrEmpty(deliveryId)) + { + where = where.And(p => p.deliveryId.Contains(deliveryId)); + } + //快递公司名称 nvarchar + var deliveryName = Request.Form["deliveryName"].FirstOrDefault(); + if (!string.IsNullOrEmpty(deliveryName)) + { + where = where.And(p => p.deliveryName.Contains(deliveryName)); + } + //获取数据 + var list = await _weChatShippingDeliveryServices.QueryPageAsync(where, orderEx, orderBy, pageCurrent, pageSize, true); + //返回数据 + jm.data = list; + jm.code = 0; + jm.count = list.TotalCount; + jm.msg = "数据调用成功!"; + return jm; + } + #endregion + + #region 首页数据============================================================ + // POST: Api/WeChatShippingDelivery/GetIndex + /// + /// 首页数据 + /// + /// + [HttpPost] + [Description("首页数据")] + public AdminUiCallBack GetIndex() + { + //返回数据 + var jm = new AdminUiCallBack { code = 0 }; + return jm; + } + #endregion + + #region 拉取数据更新============================================================ + + // POST: Api/CoreCmsLogistics/DoDelete/10 + /// + /// 拉取数据更新 + /// + [HttpPost] + [Description("单选删除")] + public async Task DoUpdateCompany() + { + var jm = await _weChatShippingDeliveryServices.DoUpdateCompany(); + return jm; + + } + + #endregion + + } +} diff --git a/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingOrderController.cs b/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingOrderController.cs new file mode 100644 index 00000000..55933247 --- /dev/null +++ b/CoreCms.Net.Web.Admin/Controllers/WeChatShipping/WeChatShippingOrderController.cs @@ -0,0 +1,661 @@ +using System; +using System.Collections.Generic; +using CoreCms.Net.Configuration; +using CoreCms.Net.Filter; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using CoreCms.Net.Model.Entities; +using CoreCms.Net.Model.Entities.Expression; +using CoreCms.Net.Model.ViewModels.UI; +using CoreCms.Net.Utility.Extensions; +using CoreCms.Net.Utility.Helper; +using SqlSugar; +using Azure.Core; +using CoreCms.Net.Caching.AccressToken; +using CoreCms.Net.DTO.WeChatShipping; +using CoreCms.Net.IServices; +using CoreCms.Net.Model.ViewModels.Api; +using Flurl.Http; +using CoreCms.Net.WeChat.Service.HttpClients; +using CoreCms.Net.WeChat.Service.Enums; +using SKIT.FlurlHttpClient.Wechat.Api.Models; +using SKIT.FlurlHttpClient.Wechat.Api; +using CoreCms.Net.Model.FromBody; +using CoreCms.Net.Services; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressBusinessDeliveryGetAllResponse.Types; +using CoreCms.Net.Loging; + +namespace CoreCms.Net.Web.Admin.Controllers.WeChatShipping +{ + + /// + /// 微信发货信息订单管理 + /// + [Description("微信发货信息订单管理")] + [Route("api/[controller]/[action]")] + [ApiController] + [RequiredErrorForAdmin] + [Authorize(Permissions.Name)] + public class WeChatShippingOrderController : ControllerBase + { + + private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; + private readonly ICoreCmsBillPaymentsServices _billPaymentsServices; + private readonly ICoreCmsOrderServices _orderServices; + private readonly ICoreCmsOrderItemServices _orderItemServices; + private readonly ICoreCmsServicesServices _servicesServices; + private readonly IWeChatShippingDeliveryServices _weChatShippingDeliveryServices; + private readonly ICoreCmsBillDeliveryServices _billDeliveryServices; + + + /// + /// 构造函数 + /// + public WeChatShippingOrderController(IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsOrderServices orderServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsServicesServices servicesServices, IWeChatShippingDeliveryServices weChatShippingDeliveryServices, ICoreCmsBillDeliveryServices billDeliveryServices) + { + _weChatApiHttpClientFactory = weChatApiHttpClientFactory; + _billPaymentsServices = billPaymentsServices; + _orderServices = orderServices; + _orderItemServices = orderItemServices; + _servicesServices = servicesServices; + _weChatShippingDeliveryServices = weChatShippingDeliveryServices; + _billDeliveryServices = billDeliveryServices; + } + + + #region 获取列表============================================================ + + // POST: Api/CoreCmsBillReship/GetPageList + /// + /// 获取列表 + /// + /// + [HttpPost] + [Description("获取列表")] + public async Task GetPageList() + { + var jm = new AdminUiCallBack(); + var pageCurrent = Request.Form["page"].FirstOrDefault().ObjectToInt(1); + var pageSize = Request.Form["limit"].FirstOrDefault().ObjectToInt(20); + + var last_index = Request.Form["last_index"].FirstOrDefault(); + + //获取排序字段 + + //设置排序方式 + var orderDirection = Request.Form["orderDirection"].FirstOrDefault(); + var orderBy = orderDirection switch + { + "asc" => OrderByType.Asc, + "desc" => OrderByType.Desc, + _ => OrderByType.Desc + }; + //查询筛选 + + + //构建请求 + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var request = new WxaSecOrderGetOrderListRequest() + { + AccessToken = accessToken + }; + + //构建查询 + var status = Request.Form["status"].FirstOrDefault().ObjectToInt(0); + if (status > 0) + { + request.OrderState = status; + } + + if (pageCurrent > 1) + { + request.Limit = pageCurrent; + } + + if (!string.IsNullOrEmpty(last_index)) + { + request.Offset = last_index; + } + + if (pageSize > 0) + { + request.Limit = pageSize; + } + + var response = await client.ExecuteWxaSecOrderGetOrderListAsync(request, HttpContext.RequestAborted); + if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.请求成功) + { + + //返回数据 + jm.data = response.OrderList; + jm.otherData = response; + jm.code = 0; + jm.count = 10000; + jm.msg = "数据调用成功!"; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + + //获取数据 + + return jm; + } + + #endregion + + #region 首页数据============================================================ + + // POST: Api/CoreCmsBillReship/GetIndex + /// + /// 首页数据 + /// + /// + [HttpPost] + [Description("首页数据")] + public AdminUiCallBack GetIndex() + { + //返回数据 + var jm = new AdminUiCallBack { code = 0 }; + + var status = EnumHelper.EnumToList(); + var logisticsType = EnumHelper.EnumToList(); + + jm.data = new + { + status, + logisticsType + }; + + + return jm; + } + + #endregion + + #region 创建发货单============================================================ + /// + /// 创建发货单 + /// + /// + [HttpPost] + [Description("创建数据")] + public async Task GetCreate([FromBody] FMStringId entity) + { + //返回数据 + var jm = new AdminUiCallBack { code = 0 }; + + var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.id); + if (paymentOrder == null) + { + jm.msg = "支付单获取失败"; + return jm; + } + + var billDeliveryList = new List(); + + var orderTitle = string.Empty; + var logisticsTypeValue = 0; + if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Recharge) + { + orderTitle = "用户充值" + paymentOrder.money + "元"; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.FormOrder) + { + orderTitle = "表单订单"; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.FormPay) + { + orderTitle = "表单付款码支付"; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.ServiceOrder) + { + var id = Convert.ToInt32(paymentOrder.sourceId); + var serviceModel = await _servicesServices.QueryByClauseAsync(p => p.id == id); + if (serviceModel == null) + { + jm.msg = "服务项目获取失败"; + return jm; + } + + orderTitle = serviceModel.title; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Common + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Group + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Seckill + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire + ) + { + + billDeliveryList = await _billDeliveryServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); + //获取订单 + var order = await _orderServices.QueryByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (order == null) + { + jm.msg = "关联订单获取失败"; + return jm; + } + + logisticsTypeValue = order.receiptType switch + { + //设置物流的发货模式 + (int)GlobalEnumVars.OrderReceiptType.SelfDelivery => (int)GlobalEnumVars.WeChatShippingLogisticsType.用户自提, + (int)GlobalEnumVars.OrderReceiptType.IntraCityService => (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送, + (int)GlobalEnumVars.OrderReceiptType.Logistics => (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送, + _ => logisticsTypeValue + }; + var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (!orderItems.Any()) + { + jm.msg = "订单详情获取失败"; + return jm; + } + else + { + if (orderItems.Count == 1) + { + orderTitle = orderItems.FirstOrDefault()?.name; + } + else + { + orderItems.ForEach(p => { orderTitle += p.name + ";"; }); + } + } + + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Bargain) + { + orderTitle = "砍价活动"; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Giveaway) + { + orderTitle = "购物赠品"; + logisticsTypeValue = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; + } + else + { + jm.msg = "订单类型获取失败"; + return jm; + } + + var status = EnumHelper.EnumToList(); + var logisticsType = EnumHelper.EnumToList(); + + + //构建请求 + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var request = new WxaSecOrderGetOrderRequest + { + AccessToken = accessToken, + TransactionId = entity.data.ToString(), + OutTradeNumber = entity.id + }; + + var deliveryCompany = await _weChatShippingDeliveryServices.GetCaChe(); + + + var response = await client.ExecuteWxaSecOrderGetOrderAsync(request, HttpContext.RequestAborted); + if (response.IsSuccessful()) + { + jm.code = 0; + jm.data = new + { + response.Order, + status, + logisticsType, + orderTitle, + deliveryCompany, + billDeliveryList, + paymentOrder, + logisticsTypeValue + }; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + return jm; + } + #endregion + + #region 创建提交============================================================ + // POST: Api/CoreCmsAgent/DoCreate + /// + /// 创建提交 + /// + /// + /// + [HttpPost] + [Description("创建提交")] + public async Task DoCreate([FromBody] OrderShippingCreatePost entity) + { + var jm = new AdminUiCallBack(); + + var shippingList = new List(); + + if (entity.logistics_type == (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送) + { + if (entity.shipping_list == null || !entity.shipping_list.Any()) + { + jm.msg = "物流配送请完善快递信息"; + return jm; + } + + foreach (var item in entity.shipping_list) + { + if (string.IsNullOrEmpty(item.express_company) && string.IsNullOrEmpty(item.tracking_no)) + { + jm.msg = "请填写完整的快递信息"; + return jm; + } + var shipping = new WxaSecOrderUploadShippingInfoRequest.Types.Shipping + { + ItemDescription = entity.item_desc, + ExpressCompany = item.express_company, + TrackingNumber = item.tracking_no + }; + shippingList.Add(shipping); + } + } + else if (entity.logistics_type == (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送) + { + var shipping = new WxaSecOrderUploadShippingInfoRequest.Types.Shipping + { + ItemDescription = entity.item_desc, + ExpressCompany = entity.cityDistributionName, + TrackingNumber = entity.cityDistributionNumber + }; + shippingList.Add(shipping); + } + else if (entity.logistics_type == (int)GlobalEnumVars.WeChatShippingLogisticsType.用户自提 || entity.logistics_type == (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品) + { + var shipping = new WxaSecOrderUploadShippingInfoRequest.Types.Shipping + { + ItemDescription = entity.item_desc + }; + shippingList.Add(shipping); + } + else + { + jm.msg = "请提交合理的物流模式"; + return jm; + } + + var request = new WxaSecOrderUploadShippingInfoRequest + { + OrderKey = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.OrderKey() + { + OrderNumberType = 2, + TransactionId = entity.transaction_id, + MerchantId = entity.merchant_id, + OutTradeNumber = entity.merchant_trade_no + }, + LogisticsType = entity.logistics_type, + IsFinishAll = entity.is_all_delivered, + ShippingList = shippingList, + Payer = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.Payer() { OpenId = entity.openid } + }; + + if (request.LogisticsType == (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送 && request.IsFinishAll == true) + { + if (shippingList.Count == 1) + { + request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; + } + else + { + request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.SPLIT_DELIVERY; + } + } + else if (request.LogisticsType == (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送 && request.IsFinishAll == false) + { + request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.SPLIT_DELIVERY; + } + else + { + request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; + } + + + + //构建请求 + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + + request.AccessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + + var response = await client.ExecuteWxaSecOrderUploadShippingInfoAsync(request, HttpContext.RequestAborted); + + if (response.IsSuccessful()) + { + jm.code = 0; + jm.data = new + { + response + }; + jm.msg = "提交成功"; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + + return jm; + } + #endregion + + #region 重新发货============================================================ + /// + /// 重新发货 + /// + /// + [HttpPost] + [Description("创建数据")] + public async Task GetUpdate([FromBody] FMStringId entity) + { + //返回数据 + var jm = new AdminUiCallBack { code = 0 }; + + var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.id); + if (paymentOrder == null) + { + jm.msg = "支付单获取失败"; + return jm; + } + + var status = EnumHelper.EnumToList(); + var logisticsType = EnumHelper.EnumToList(); + + + //构建请求 + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var request = new WxaSecOrderGetOrderRequest + { + AccessToken = accessToken, + TransactionId = entity.data.ToString(), + OutTradeNumber = entity.id + }; + + var deliveryCompany = await _weChatShippingDeliveryServices.GetCaChe(); + + + var response = await client.ExecuteWxaSecOrderGetOrderAsync(request, HttpContext.RequestAborted); + if (response.IsSuccessful()) + { + jm.code = 0; + jm.data = new + { + response.Order, + status, + logisticsType, + deliveryCompany + }; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + return jm; + } + #endregion + + #region 重新发货提交============================================================ + /// + /// 重新发货提交 + /// + /// + /// + [HttpPost] + [Description("创建提交")] + public AdminUiCallBack DoUpdate([FromBody] Object entity) + { + var jm = new AdminUiCallBack(); + + return jm; + } + #endregion + + #region 预览数据============================================================ + // POST: Api/CoreCmsAgent/GetDetails/10 + /// + /// 预览数据 + /// + /// + /// + [HttpPost] + [Description("预览数据")] + public async Task GetDetails([FromBody] FMStringId entity) + { + //返回数据 + var jm = new AdminUiCallBack { code = 0 }; + + var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.id); + if (paymentOrder == null) + { + jm.msg = "支付单获取失败"; + return jm; + } + + var orderTitle = string.Empty; + + if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Recharge) + { + orderTitle = "用户充值" + paymentOrder.money + "元"; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.FormOrder) + { + orderTitle = "表单订单"; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.FormPay) + { + orderTitle = "表单付款码支付"; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.ServiceOrder) + { + var id = Convert.ToInt32(paymentOrder.sourceId); + var serviceModel = await _servicesServices.QueryByClauseAsync(p => p.id == id); + if (serviceModel == null) + { + jm.msg = "服务项目获取失败"; + return jm; + } + + orderTitle = serviceModel.title; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Common + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Group + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Seckill + || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire + ) + { + var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); + if (!orderItems.Any()) + { + jm.msg = "订单详情获取失败"; + return jm; + } + else + { + if (orderItems.Count == 1) + { + orderTitle = orderItems.FirstOrDefault()?.name; + } + else + { + orderItems.ForEach(p => { orderTitle += p.name + ";"; }); + } + } + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Bargain) + { + orderTitle = "砍价活动"; + } + else if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Giveaway) + { + orderTitle = "购物赠品"; + } + else + { + jm.msg = "订单类型获取失败"; + return jm; + } + + var status = EnumHelper.EnumToList(); + var logisticsType = EnumHelper.EnumToList(); + + + //构建请求 + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var request = new WxaSecOrderGetOrderRequest + { + AccessToken = accessToken, + TransactionId = entity.data.ToString(), + OutTradeNumber = entity.id + }; + + var deliveryCompany = await _weChatShippingDeliveryServices.GetCaChe(); + + + var response = await client.ExecuteWxaSecOrderGetOrderAsync(request, HttpContext.RequestAborted); + if (response.IsSuccessful()) + { + jm.code = 0; + jm.data = new + { + response.Order, + status, + logisticsType, + orderTitle, + deliveryCompany + }; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + return jm; + } + #endregion + + } +} diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/create.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/create.html new file mode 100644 index 00000000..308652d6 --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/create.html @@ -0,0 +1,47 @@ + + diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/details.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/details.html new file mode 100644 index 00000000..cd8c7be1 --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/details.html @@ -0,0 +1,54 @@ + + \ No newline at end of file diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/edit.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/edit.html new file mode 100644 index 00000000..468dc04b --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/edit.html @@ -0,0 +1,48 @@ + + diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/index.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/index.html new file mode 100644 index 00000000..f98ecb0c --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/delivery/index.html @@ -0,0 +1,148 @@ +微信发货快递公司信息 + +
+
+ +
+
+ + + +
+
+
+ + + + + + + diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/create.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/create.html new file mode 100644 index 00000000..4110abb1 --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/create.html @@ -0,0 +1,236 @@ + + + + + + + + diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/details.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/details.html new file mode 100644 index 00000000..c9dbfe31 --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/details.html @@ -0,0 +1,104 @@ + + \ No newline at end of file diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/index.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/index.html new file mode 100644 index 00000000..ce13da14 --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/index.html @@ -0,0 +1,387 @@ +微信自动回复消息表 + +
+
+ +
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/update.html b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/update.html new file mode 100644 index 00000000..3a51aeda --- /dev/null +++ b/CoreCms.Net.Web.Admin/wwwroot/views/wechatshipping/order/update.html @@ -0,0 +1,241 @@ + + + + + + + + diff --git a/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.xml b/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.xml index 46020818..c791a721 100644 --- a/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.xml +++ b/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.xml @@ -1527,23 +1527,6 @@ - - - 微信小程序自定义交易组件 - - - - - - - - - - - 获取用户是否订阅 - - - 微信公众号消息推送对接 diff --git a/数据库/MySql/20231008/升级脚本/1、创建微信发货物流公司信息表.sql b/数据库/MySql/20231008/升级脚本/1、创建微信发货物流公司信息表.sql new file mode 100644 index 00000000..ad3d490a --- /dev/null +++ b/数据库/MySql/20231008/升级脚本/1、创建微信发货物流公司信息表.sql @@ -0,0 +1,20 @@ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for WeChatShippingDelivery +-- ---------------------------- +DROP TABLE IF EXISTS `WeChatShippingDelivery`; +CREATE TABLE `WeChatShippingDelivery` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序列', + `deliveryId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '快递公司编码', + `deliveryName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '快递公司名称', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信发货快递公司信息' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of WeChatShippingDelivery +-- ---------------------------- + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/数据库/MySql/20231008/升级脚本/2、创建后台管理菜单.sql b/数据库/MySql/20231008/升级脚本/2、创建后台管理菜单.sql new file mode 100644 index 00000000..87ea0600 --- /dev/null +++ b/数据库/MySql/20231008/升级脚本/2、创建后台管理菜单.sql @@ -0,0 +1,13 @@ +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2638, 0, 'wechatshipping', '微信发货信息', 'layui-icon layui-icon-ok-circle', '', '', 0, 90, '', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2639, 2638, 'delivery', '快递公司管理', '', 'wechatshipping/delivery/index', '', 0, 1, '', NULL, NULL, 0, 0,'2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2641, 2639, 'GetPageList', '获取列表', NULL, NULL, '/Api/WeChatShippingDelivery/GetPageList', 1, 0, 'WeChatShippingDelivery:GetPageList', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2642, 2639, 'GetIndex', '首页数据', NULL, NULL, '/Api/WeChatShippingDelivery/GetIndex', 1, 1, 'WeChatShippingDelivery:GetIndex', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2643, 2639, 'DoUpdateCompany', '单选删除', NULL, NULL, '/Api/WeChatShippingDelivery/DoUpdateCompany', 1, 2, 'WeChatShippingDelivery:DoUpdateCompany', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2644, 2638, 'order', '发货信息列表', '', 'wechatshipping/order/index', '', 0, 10, '', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2653, 2644, 'GetPageList', '获取列表', NULL, NULL, '/Api/WeChatShippingOrder/GetPageList', 1, 0, 'WeChatShippingOrder:GetPageList', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2654, 2644, 'GetIndex', '首页数据', NULL, NULL, '/Api/WeChatShippingOrder/GetIndex', 1, 1, 'WeChatShippingOrder:GetIndex', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2655, 2644, 'GetCreate', '创建数据', NULL, NULL, '/Api/WeChatShippingOrder/GetCreate', 1, 2, 'WeChatShippingOrder:GetCreate', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2656, 2644, 'DoCreate', '创建提交', NULL, NULL, '/Api/WeChatShippingOrder/DoCreate', 1, 3, 'WeChatShippingOrder:DoCreate', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2657, 2644, 'GetUpdate', '创建数据', NULL, NULL, '/Api/WeChatShippingOrder/GetUpdate', 1, 4, 'WeChatShippingOrder:GetUpdate', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2658, 2644, 'DoUpdate', '创建提交', NULL, NULL, '/Api/WeChatShippingOrder/DoUpdate', 1, 5, 'WeChatShippingOrder:DoUpdate', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); +INSERT INTO SysMenu (id, parentId, identificationCode, menuName, menuIcon, path, component, menuType, sortNumber, authority, target, iconColor, hide, deleted, createTime, updateTime) VALUES (2659, 2644, 'GetDetails', '预览数据', NULL, NULL, '/Api/WeChatShippingOrder/GetDetails', 1, 6, 'WeChatShippingOrder:GetDetails', NULL, NULL, 0, 0, '2023-09-15 23:14:27', null); \ No newline at end of file diff --git a/数据库/MySql/20231008/升级脚本/3、注意.txt b/数据库/MySql/20231008/升级脚本/3、注意.txt new file mode 100644 index 00000000..0078fac2 --- /dev/null +++ b/数据库/MySql/20231008/升级脚本/3、注意.txt @@ -0,0 +1 @@ +记得给角色权限 \ No newline at end of file diff --git a/数据库/MySql/20231008/完整数据库带商品演示20231008.rar b/数据库/MySql/20231008/完整数据库带商品演示20231008.rar new file mode 100644 index 00000000..e15d1956 Binary files /dev/null and b/数据库/MySql/20231008/完整数据库带商品演示20231008.rar differ diff --git a/数据库/MySql/数据库更新日志.txt b/数据库/MySql/数据库更新日志.txt index 875b5b68..05db41d5 100644 --- a/数据库/MySql/数据库更新日志.txt +++ b/数据库/MySql/数据库更新日志.txt @@ -1,3 +1,6 @@ +20231008 +【新增】表【WeChatShippingDelivery】微信发货快递公司信息表 + 2023-09-02 【移除】移除旧版自定义组件相关的业务表。 【移除】WeChatTransactionComponentAuditCategory; diff --git a/数据库/SqlServer/20231008/升级脚本/1、创建微信发货物流公司信息表.sql b/数据库/SqlServer/20231008/升级脚本/1、创建微信发货物流公司信息表.sql new file mode 100644 index 00000000..9300f4f9 --- /dev/null +++ b/数据库/SqlServer/20231008/升级脚本/1、创建微信发货物流公司信息表.sql @@ -0,0 +1,25 @@ + +CREATE TABLE [dbo].[WeChatShippingDelivery]( + [id] [int] IDENTITY(1,1) NOT NULL, + [deliveryId] [nvarchar](50) NOT NULL, + [deliveryName] [nvarchar](50) NOT NULL, + CONSTRAINT [PK_WeChatShippingDelivery] PRIMARY KEY CLUSTERED +( + [id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +GO + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WeChatShippingDelivery', @level2type=N'COLUMN',@level2name=N'id' +GO + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ݹ˾' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WeChatShippingDelivery', @level2type=N'COLUMN',@level2name=N'deliveryId' +GO + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ݹ˾' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WeChatShippingDelivery', @level2type=N'COLUMN',@level2name=N'deliveryName' +GO + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'΢ŷݹ˾Ϣ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WeChatShippingDelivery' +GO + + diff --git a/数据库/SqlServer/20231008/升级脚本/2、创建后台管理菜单.sql b/数据库/SqlServer/20231008/升级脚本/2、创建后台管理菜单.sql new file mode 100644 index 00000000..0b69f8b2 Binary files /dev/null and b/数据库/SqlServer/20231008/升级脚本/2、创建后台管理菜单.sql differ diff --git a/数据库/SqlServer/20231008/完整数据库带商品演示20231008.rar b/数据库/SqlServer/20231008/完整数据库带商品演示20231008.rar new file mode 100644 index 00000000..f7fc074f Binary files /dev/null and b/数据库/SqlServer/20231008/完整数据库带商品演示20231008.rar differ diff --git a/数据库/SqlServer/数据库更新日志.txt b/数据库/SqlServer/数据库更新日志.txt index 3bd0b2bf..01f17e60 100644 --- a/数据库/SqlServer/数据库更新日志.txt +++ b/数据库/SqlServer/数据库更新日志.txt @@ -1,3 +1,6 @@ +20231008 +【新增】表【WeChatShippingDelivery】微信发货快递公司信息表 + 2023-09-02 【移除】移除旧版自定义组件相关的业务表。 【移除】WeChatTransactionComponentAuditCategory; diff --git a/数据库/数据库文档/CoreShopProfessional表结构信息20231008.rar b/数据库/数据库文档/CoreShopProfessional表结构信息20231008.rar new file mode 100644 index 00000000..3bb9858c Binary files /dev/null and b/数据库/数据库文档/CoreShopProfessional表结构信息20231008.rar differ