From 90ad56e15b3574ca5b66ff73dbad5ddf64384eef Mon Sep 17 00:00:00 2001 From: "AERWEN\\26795" <123456789a> Date: Tue, 24 Oct 2023 17:35:58 +0800 Subject: [PATCH] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ARW.Model/Dto/Api/Pay/RepayDtoApi.cs | 44 ++++++++++++++++ .../Api/OrderManage/OrderRefunds/ButtonVO.cs | 2 +- .../Vo/Api/OrderManage/Orders/OrderApiVo.cs | 2 +- .../OrderManage/Orders/OrderServiceApi.cs | 35 ++++++++++--- .../PayManage/PayServiceApi.cs | 4 +- .../TaskScheduler/Business/OrderTask_Job.cs | 34 +++++++++++-- .../OrderManage/Orders/OrderApiController.cs | 20 ++++++++ .../Api/Wechat/WxPay/WxPayController.cs | 50 ++++++++++++++++++- .../OrderManage/Orders/OrderController.cs | 45 ++++++++++++++++- 9 files changed, 217 insertions(+), 19 deletions(-) create mode 100644 ARW.Model/Dto/Api/Pay/RepayDtoApi.cs diff --git a/ARW.Model/Dto/Api/Pay/RepayDtoApi.cs b/ARW.Model/Dto/Api/Pay/RepayDtoApi.cs new file mode 100644 index 0000000..d0047a4 --- /dev/null +++ b/ARW.Model/Dto/Api/Pay/RepayDtoApi.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using ARW.Model.Dto.Api.OrderManage.Orders; +using ARW.Model.Models.Business.Carts; + +namespace ARW.Model.Dto.Api.Pay +{ + + /// + /// 下单信息Dto对象Api + /// + /// @author lwh + /// @date 2023-10-24 + /// + public class RepayDtoApi + { + /// + /// 客户Guid + /// + public long UserId { get; set; } + + /// + /// 小程序用户OpenId + /// + public string OpenId { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } + + /// + /// 支付类型 + /// + public int PayType { get; set; } = 1; + + /// + /// 前端传递金额 + /// + public decimal TotalAmount { get; set; } + + } +} diff --git a/ARW.Model/Vo/Api/OrderManage/OrderRefunds/ButtonVO.cs b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/ButtonVO.cs index cf22ba1..8f3dc9c 100644 --- a/ARW.Model/Vo/Api/OrderManage/OrderRefunds/ButtonVO.cs +++ b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/ButtonVO.cs @@ -27,7 +27,7 @@ namespace ARW.Model.Vo.Api.OrderManage.Orders /// - /// 类型 (2撤销 3填写运单号 4修改运单号 5查看物流 ) + /// 类型 (2撤销 3填写运单号 4修改运单号 5查看物流 7删除订单 ) /// public int Type { get; set; } diff --git a/ARW.Model/Vo/Api/OrderManage/Orders/OrderApiVo.cs b/ARW.Model/Vo/Api/OrderManage/Orders/OrderApiVo.cs index 211518d..d4667e2 100644 --- a/ARW.Model/Vo/Api/OrderManage/Orders/OrderApiVo.cs +++ b/ARW.Model/Vo/Api/OrderManage/Orders/OrderApiVo.cs @@ -102,7 +102,7 @@ namespace ARW.Model.Vo.Api.OrderManage.Orders public int Status { get; set; } /// - /// 订单状态名称 (1待付款 2待发货 3待收货 4已完成) + /// 订单状态名称 (1待付款 2待发货 3待收货 4已完成 5已取消) /// public string StatusName { get; set; } diff --git a/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs b/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs index e4f25e2..80e3474 100644 --- a/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs +++ b/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs @@ -84,11 +84,11 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders //开始拼装查询条件d var predicate = Expressionable.Create(); + predicate = predicate.AndIF(parm.CustomerGuid != 0, s => s.CustomerGuid == parm.CustomerGuid); predicate = predicate.AndIF(parm.Status == 1, s => s.PayStatus == 1 && s.OrderStatus == 1); predicate = predicate.AndIF(parm.Status == 2, s => s.DeliveryStatus == 1 && s.PayStatus == 2 && s.OrderStatus == 1); predicate = predicate.AndIF(parm.Status == 3, s => s.ReceiptStatus == 1 && s.DeliveryStatus == 2 && s.PayStatus == 2 && s.OrderStatus == 1); predicate = predicate.AndIF(parm.Status == 4, s => s.PayStatus == 2 && s.OrderStatus == 4); - predicate = predicate.AndIF(parm.CustomerGuid != 0, s => s.CustomerGuid == parm.CustomerGuid); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.OrderNumber), s => s.OrderNumber.Contains(parm.OrderNumber)); var query = _OrderRepository .Queryable() @@ -138,7 +138,7 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders /* 处理订单状态 */ - if(item.PayStatus == 1 && item.OrderStatus == 1) + if (item.PayStatus == 1 && item.OrderStatus == 1) { item.Status = 1; item.StatusName = "待付款"; @@ -151,13 +151,14 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders var buttonVo1 = new ButtonVO() { Name = "付款", + Primary = true, Type = 1 }; buttonVoList.Add(buttonVo); buttonVoList.Add(buttonVo1); item.ButtonVOs = buttonVoList; } - if(item.DeliveryStatus == 1 && item.PayStatus == 2 && item.OrderStatus == 1) + if (item.DeliveryStatus == 1 && item.PayStatus == 2 && item.OrderStatus == 1) { item.Status = 2; item.StatusName = "待发货"; @@ -170,6 +171,7 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders var buttonVo1 = new ButtonVO() { Name = "再次购买", + Primary = true, Type = 9 }; buttonVoList.Add(buttonVo); @@ -184,6 +186,7 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders var buttonVo = new ButtonVO() { Name = "确认收货", + Primary = true, Type = 3 }; buttonVoList.Add(buttonVo); @@ -193,10 +196,10 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders { item.Status = 4; item.StatusName = "已完成"; - + var buttonVoList = new List(); var refund = await _OrderRefundRepository.GetFirstAsync(s => s.OrderGuid == item.OrderGuid); - if(refund != null) + if (refund == null) { var buttonVo = new ButtonVO() { @@ -205,17 +208,37 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders }; buttonVoList.Add(buttonVo); } - if (item.IsComment == 2) + if (item.IsComment == 1) { var buttonVo1 = new ButtonVO() { Name = "评价", + Primary = true, Type = 6 }; buttonVoList.Add(buttonVo1); } item.ButtonVOs = buttonVoList; } + if (item.OrderStatus == 2) + { + item.Status = 5; + item.StatusName = "已取消"; + + var buttonVoList = new List(); + var buttonVo = new ButtonVO() + { + Name = "删除订单", + Type = 7 + }; + buttonVoList.Add(buttonVo); + item.ButtonVOs = buttonVoList; + } + if (item.OrderStatus == 3) + { + item.Status = 5; + item.StatusName = "待取消"; + } } diff --git a/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs b/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs index 37d209a..59ed665 100644 --- a/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs +++ b/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs @@ -157,7 +157,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage jsApiUiPackage = payEntity, outTradeNo = orderNo, CreateTime = res.Create_time, - OverTime = res.Create_time.AddMinutes(2) + OverTime = res.Create_time.AddMinutes(30) }; return payRes; @@ -441,7 +441,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage { CustomerGuid = parm.UserId, OrderGuid = orderGuid, - EndTime = order.Create_time.AddMinutes(2), + EndTime = order.Create_time.AddMinutes(30), PayStatus = 1, CancelStatus = 1, }; diff --git a/ARW.Tasks/TaskScheduler/Business/OrderTask_Job.cs b/ARW.Tasks/TaskScheduler/Business/OrderTask_Job.cs index 6148041..92e1cb0 100644 --- a/ARW.Tasks/TaskScheduler/Business/OrderTask_Job.cs +++ b/ARW.Tasks/TaskScheduler/Business/OrderTask_Job.cs @@ -1,23 +1,29 @@ -using ARW.Common; +using Aliyun.OSS; +using ARW.Common; using ARW.Model.Models.Business.OrderManage.Orders; using ARW.Model.Models.Business.OrderTasks; +using ARW.Model.Models.Business.Payments; using ARW.Model.Models.Business.SubscribeTasks; using ARW.Model.System; using ARW.Service.Business.IBusinessService.Custom.Customers; using ARW.Service.Business.IBusinessService.OrderManage.Orders; using ARW.Service.Business.IBusinessService.OrderTasks; +using ARW.Service.Business.IBusinessService.Payments; using ARW.Service.Business.IBusinessService.SubscribeTasks; using ARW.Service.System.IService; using Infrastructure; using Infrastructure.Attribute; using Infrastructure.WeChat.SubScribe; +using Infrastructure.WeChat.TenPay; using Quartz; using Senparc.CO2NET.Extensions; +using Senparc.CO2NET.HttpUtility; using Senparc.Weixin.Entities.TemplateMessage; using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson; using SqlSugar; using System; using System.Collections.Generic; +using System.Net.Http; using System.Threading.Tasks; using SystemTime = System.SystemTime; @@ -36,15 +42,19 @@ namespace ARW.Tasks.TaskScheduler.Business private readonly IOrderTaskService _OrderTaskService; private readonly IOrderService _OrderService; private readonly ICustomerService _CustomerService; + private readonly IPaymentService _PaymentService; + private readonly SenparcHttpClient _httpClient; - public OrderTask_Job(ISysTasksLogService sysTasksLogService, ISysTasksQzService sysTasksQzService, IOrderTaskService orderTaskService, IOrderService orderService, ICustomerService customerService) + public OrderTask_Job(ISysTasksLogService sysTasksLogService, ISysTasksQzService sysTasksQzService, IOrderTaskService orderTaskService, IOrderService orderService, ICustomerService customerService, SenparcHttpClient httpClient, IPaymentService paymentService) { SysTasksLogService = sysTasksLogService; SysTasksQzService = sysTasksQzService; _OrderTaskService = orderTaskService; _OrderService = orderService; _CustomerService = customerService; + _httpClient = httpClient; + _PaymentService = paymentService; } public async Task Execute(IJobExecutionContext context) @@ -71,6 +81,23 @@ namespace ARW.Tasks.TaskScheduler.Business if (item.EndTime < DateTime.Now) { //logger.Info("推送结果:" + res); + Pay pay = new Pay(_httpClient); + + var customer = await _CustomerService.GetFirstAsync(s => s.CustomerGuid == item.CustomerGuid); + var order = await _OrderService.GetFirstAsync(s => s.OrderGuid == item.OrderGuid); + var payment = await _PaymentService.GetFirstAsync(s => s.PaymentGuid == order.PaymentGuid); + + var res = await pay.CloseOrder(payment.PaymentNumber); + if (res == null) + throw new CustomException("订单关闭失败!"); + else + { + var respones = _PaymentService.UpdateAsync(f => new Payment + { + PaymentStatus = 3, + Update_time = DateTime.Now + }, f => f.PaymentNumber == payment.PaymentNumber); + } // 修改订单状态 await _OrderService.UpdateAsync(f => new Order @@ -84,9 +111,6 @@ namespace ARW.Tasks.TaskScheduler.Business CancelStatus = 2 }, s => s.OrderGuid == item.OrderGuid); - var customer = await _CustomerService.GetFirstAsync(s => s.CustomerGuid == item.CustomerGuid); - var order = await _OrderService.GetFirstAsync(s => s.OrderGuid == item.OrderGuid); - taskList.Add("订单号:" + order.OrderNumber + " " + customer.CustomerNickname + "用户的订单已取消"); } } diff --git a/ARW.WebApi/Controllers/Api/OrderManage/Orders/OrderApiController.cs b/ARW.WebApi/Controllers/Api/OrderManage/Orders/OrderApiController.cs index 724d478..751c0e0 100644 --- a/ARW.WebApi/Controllers/Api/OrderManage/Orders/OrderApiController.cs +++ b/ARW.WebApi/Controllers/Api/OrderManage/Orders/OrderApiController.cs @@ -21,6 +21,7 @@ using ARW.Model.Models.Business.GoodsManager.GoodsComments; using ARW.Admin.WebApi.Framework; using ARW.Service.Business.IBusinessService.ShopManager.Shops; using ARW.Model.Vo.Api.GoodsManager.Goodss; +using ARW.Service.Business.IBusinessService.OrderManage.Orders; namespace ARW.WebApi.Controllers.Api.OrderManage.Orders { @@ -153,5 +154,24 @@ namespace ARW.WebApi.Controllers.Api.OrderManage.Orders } + + /// + /// 删除订单 + /// + /// + [HttpDelete("{ids}")] + [ActionPermissionFilter(Permission = "business:order:delete")] + [Log(Title = "订单删除", BusinessType = BusinessType.DELETE)] + public async Task Delete(string ids) + { + int[] idsArr = Tools.SpitIntArrary(ids); + if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } + + var response = _OrderServiceApi.Delete(idsArr); + + return SUCCESS("删除成功!"); + } + + } } diff --git a/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs b/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs index 2d4f7a0..ef375ae 100644 --- a/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs +++ b/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs @@ -15,6 +15,8 @@ using ARW.Service.Api.IBusinessService.PayManage; using ARW.Service.Api.BusinessService.PaymentManage; using ARW.Model.Dto.Api.Carts; using ARW.Model.Dto.Api.Pay; +using ARW.Repository.Business.Payments; +using ARW.Service.Business.IBusinessService.OrderManage.Orders; namespace ARW.WebApi.Controllers.Api.Wechat.WxPay { @@ -28,14 +30,16 @@ namespace ARW.WebApi.Controllers.Api.Wechat.WxPay private readonly ICustomerService _CustomerService; private readonly IPayServiceApi _PayServiceApi; + private readonly IOrderService _OrderServiceApi; private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly SenparcHttpClient _httpClient; - public WxPayController(ICustomerService customerService, SenparcHttpClient httpClient, IPayServiceApi payServiceApi) + public WxPayController(ICustomerService customerService, SenparcHttpClient httpClient, IPayServiceApi payServiceApi, IOrderService orderServiceApi) { _CustomerService = customerService; _httpClient = httpClient; _PayServiceApi = payServiceApi; + _OrderServiceApi = orderServiceApi; } @@ -60,6 +64,48 @@ namespace ARW.WebApi.Controllers.Api.Wechat.WxPay } + /// + /// 微信支付(取消后重新调起) + /// + /// + /// + [HttpPost("wxRepay")] + public async Task WxRepay([FromBody] RepayDtoApi parm) + { + if (parm == null) { throw new CustomException("请求参数错误"); } + + var user = JwtUtil.GetLoginUser(App.HttpContext); + parm.UserId = user.UserId; + var order = await _OrderServiceApi.GetFirstAsync(s => s.OrderNumber == parm.OrderNo); + var payment = await _PayServiceApi.GetFirstAsync(s => s.PaymentGuid == order.PaymentGuid); + + // 获取金额 + var price = 1;//单位:分 + //var price = payment.PaymentBeforeMoney;//单位:分 + + var orderNo = Common.Common.CreateNoQuery(); + + // 调用统一下单(接口) + Pay pay = new Pay(_httpClient); + var payEntity = await pay.PrePay(parm.OpenId, payment.PaymentNumber, parm.PayType, price); + + if (payEntity == null) + { + throw new CustomException("下单失败!"); + } + // 返回拼接好的支付调起信息 + PayParams payRes = new() + { + jsApiUiPackage = payEntity, + outTradeNo = orderNo, + CreateTime = payment.Create_time, + }; + + return SUCCESS(payRes); + + } + + /// /// 微信支付回调 /// @@ -159,7 +205,7 @@ namespace ARW.WebApi.Controllers.Api.Wechat.WxPay throw new CustomException("订单退款失败!"); else { - var respones = _PayServiceApi.UpdateAsync(f => new Payment + var respones = await _PayServiceApi.UpdateAsync(f => new Payment { PaymentRefundNumber = res.out_refund_no, }, f => f.PaymentNumber == res.out_trade_no); diff --git a/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs b/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs index 5b3ecde..450fdd6 100644 --- a/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs +++ b/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs @@ -27,6 +27,11 @@ using System.Net.Http; using Senparc.CO2NET.HttpUtility; using ARW.Service.Business.IBusinessService.Payments; using ARW.Model.Models.Business.Payments; +using ARW.Repository.Business.GoodsManager.Goodss; +using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSkus; +using ARW.Repository.Business.ShopManager.Shops; +using ARW.Service.Business.IBusinessService.GoodsManager.Goodss; +using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSkus; namespace ARW.WebApi.Controllers.Business.OrderManage.Orders { @@ -46,12 +51,15 @@ namespace ARW.WebApi.Controllers.Business.OrderManage.Orders private readonly IOrderCustomerAddressService _OrderCustomerAddressService; private readonly IPaymentService _PaymentService; private readonly SenparcHttpClient _httpClient; + private readonly IGoodsService _GoodsService; + private readonly IGoodsSkuService _GoodsSkuService; + /// /// 依赖注入 /// /// 订单服务 - public OrderController(IOrderService OrderService, IOrderGoodsService orderGoodsService, IOrderCustomerAddressService orderCustomerAddressService, IShopService shopService, SenparcHttpClient httpClient, IPaymentService paymentService) + public OrderController(IOrderService OrderService, IOrderGoodsService orderGoodsService, IOrderCustomerAddressService orderCustomerAddressService, IShopService shopService, SenparcHttpClient httpClient, IPaymentService paymentService, IGoodsService goodsService, IGoodsSkuService goodsSkuService) { _OrderService = OrderService; _OrderGoodsService = orderGoodsService; @@ -59,6 +67,8 @@ namespace ARW.WebApi.Controllers.Business.OrderManage.Orders _ShopService = shopService; _httpClient = httpClient; _PaymentService = paymentService; + _GoodsService = goodsService; + _GoodsSkuService = goodsSkuService; } @@ -170,10 +180,41 @@ namespace ARW.WebApi.Controllers.Business.OrderManage.Orders throw new CustomException("订单退款失败!"); else { - var respones = _PaymentService.UpdateAsync(f => new Payment + var respones = await _PaymentService.UpdateAsync(f => new Payment { PaymentRefundNumber = canleRes.out_refund_no, }, f => f.PaymentNumber == canleRes.out_trade_no); + + var orderGoodsList = await _OrderGoodsService.GetListAsync(s => s.OrderGuid == parm.OrderGuid); + // 库存加回来 + foreach (var orderGood in orderGoodsList) + { + var goods = await _GoodsService.GetFirstAsync(s => s.GoodsGuid == orderGood.GoodsGuid); + var shop = await _ShopService.GetFirstAsync(s => s.ShopGuid == goods.ShopGuid); + + goods.GoodsSalesActual += orderGood.GoodsTotalNum; + await _GoodsService.UpdateAsync(goods); + shop.ShopSalesOrderCount += orderGood.GoodsTotalNum; + await _ShopService.UpdateAsync(shop); + + if (goods.GoodsDeductStockType == 2) + { + if (orderGood.GoodsSkuId != 0) + { + var sku = await _GoodsSkuService.GetFirstAsync(s => s.GoodsSkuId == orderGood.GoodsSkuId); + sku.GoodsSkuStockNum += orderGood.GoodsTotalNum; + goods.GoodsTotalInventory += orderGood.GoodsTotalNum; + await _GoodsSkuService.UpdateAsync(sku); + await _GoodsService.UpdateAsync(goods); + } + else + { + goods.GoodsTotalInventory += orderGood.GoodsTotalNum; + await _GoodsService.UpdateAsync(goods); + } + } + } + } }