diff --git a/ARW.Model/Models/Business/OrderManage/Orders/Order.cs b/ARW.Model/Models/Business/OrderManage/Orders/Order.cs index a702506..cdf4de6 100644 --- a/ARW.Model/Models/Business/OrderManage/Orders/Order.cs +++ b/ARW.Model/Models/Business/OrderManage/Orders/Order.cs @@ -328,8 +328,13 @@ namespace ARW.Model.Models.Business.OrderManage.Orders public int OrderSource { get; set; } - - + /// + /// 描述 :客户发货备注 + /// 空值 : false + /// + [EpplusTableColumn(Header = "客户发货备注")] + [SugarColumn(ColumnName = "customer_waybill_remark")] + public string CustomerWaybillRemark { get; set; } } diff --git a/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiDetailsVo.cs b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiDetailsVo.cs new file mode 100644 index 0000000..8950470 --- /dev/null +++ b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiDetailsVo.cs @@ -0,0 +1,162 @@ +using ARW.Model.Vo.Api.OrderManage.Orders; +using Newtonsoft.Json; +using OfficeOpenXml.Attributes; +using SqlSugar; +using System; +using System.Collections.Generic; + +namespace ARW.Model.Vo.Api.OrderManage.OrderRefunds +{ + /// + /// 售后单记录表详情展示对象Api + /// + /// @author lwh + /// @date 2023-10-21 + /// + public class OrderRefundApiDetailsVo + { + /// + /// 描述 : + /// + public int OrderRefundId { get; set; } + + /// + /// 描述 : + /// + [JsonConverter(typeof(ValueToStringConverter))] + public long OrderRefundGuid { get; set; } + + + /// + /// 描述 :订单guid + /// + [JsonConverter(typeof(ValueToStringConverter))] + public long OrderGuid { get; set; } + + + /// + /// 订单号 + /// + public string OrderNo { get; set; } + + + /// + /// 店铺名称 + /// + public string StoreName { get; set; } + + + /// + /// 订单商品列表 + /// + public List OrderRefundGoodList { get; set; } + + + /// + /// 地址 + /// + public Logistics LogisticsVO { get; set; } + + + /// + /// 物流状态 + /// + public TrajectoryVo TrajectoryVos { get; set; } + + + /// + /// 描述 :售后类型(1退货退款 2退货(无需退款) 3换货) + /// + public int RefundType { get; set; } + + + /// + /// 描述 : 申请退款金额 + /// + public decimal RefundRequestAmount { get; set; } + + + /// + /// 描述 :商家审核状态(1待审核 2已同意 3已拒绝) + /// + public int MerchantAuditStatus { get; set; } + + + /// + /// 描述 :实际退款金额 + /// + public decimal RefundMoney { get; set; } + + + /// + /// 售后订单状态描述 + /// + public string EserRightsStatusDesc { get; set; } + + + /// + /// 状态(1待审核 2已审核 3已发货 4已完成 ) + /// + public int Status { get; set; } + + + + /// + /// 描述 :用户是否发货(1未发货 2已发货) + /// + public int IsCustomerSend { get; set; } + + + /// + /// 描述 :售后单状态(1进行中 2已拒绝 3已完成 4已取消) + /// + public int OrderRefundStatus { get; set; } + + + /// + /// 商家是否收货(1未收货 2已收货) + /// + public int IsMerchantReceive { get; set; } + + /// + /// 商家退货地址guid + /// + public long? ShopAddressGuid { get; set; } + + + /// + /// 退款原因(字典) + /// + public int RefundReason { get; set; } + + + /// + /// 退款原因 + /// + public string Reason { get; set; } + + + /// + /// 描述 :客户退款说明 + /// + public string CustomerRefundDesc { get; set; } + + + /// + /// 描述 :客户退款凭证 + /// + public string CustomerRefundImg { get; set; } + + + /// + /// 快递公司guid + /// + public long? LogisticsCompanyGuid { get; set; } + + /// + /// 订单号 + /// + public string ExpressNo { get; set; } + } + +} diff --git a/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiVo.cs b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiVo.cs index fa4cd9b..82b5fd7 100644 --- a/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiVo.cs +++ b/ARW.Model/Vo/Api/OrderManage/OrderRefunds/OrderRefundApiVo.cs @@ -100,54 +100,4 @@ namespace ARW.Model.Vo.Api.OrderManage.OrderRefunds } - - /// - /// 售后单记录表详情展示对象Api - /// - public class OrderRefundApiDetailsVo - { - [EpplusIgnore] - public int OrderRefundId { get; set; } - [JsonConverter(typeof(ValueToStringConverter))] - [EpplusIgnore] - public long OrderRefundGuid { get; set; } - [JsonConverter(typeof(ValueToStringConverter))] - [EpplusTableColumn(Header = "订单guid")] - public long OrderGuid { get; set; } - [JsonConverter(typeof(ValueToStringConverter))] - [EpplusTableColumn(Header = "客户guid")] - public long CustomerGuid { get; set; } - [EpplusTableColumn(Header = "售后类型(1退货退款 2退货(无需退款) 3换货)")] - public int RefundType { get; set; } - [EpplusTableColumn(Header = "客户退货原因")] - public int RefundReason { get; set; } - [EpplusIgnore] - public string CustomerRefundDesc { get; set; } - [EpplusIgnore] - public string CustomerRefundImg { get; set; } - [EpplusTableColumn(Header = "商品收货状态(1未收到货 2已收到货)")] - public int GoodsReceiveStatus { get; set; } - [EpplusTableColumn(Header = "商家审核状态(1待审核 2已同意 3已拒绝)")] - public int MerchantAuditStatus { get; set; } - [EpplusIgnore] - public string MerchantRefuseDesc { get; set; } - [EpplusTableColumn(Header = "实际退款金额")] - public decimal RefundMoney { get; set; } - [JsonConverter(typeof(ValueToStringConverter))] - [EpplusIgnore] - public long? ShopRefundAddressGuid { get; set; } - [EpplusTableColumn(Header = "用户是否发货(1未发货 2已发货)")] - public int IsCustomerSend { get; set; } - [EpplusIgnore] - public DateTime? CustomerSendTime { get; set; } - [JsonConverter(typeof(ValueToStringConverter))] - [EpplusIgnore] - public long? LogisticsCompanyGuid { get; set; } - [EpplusIgnore] - public string ExpressNo { get; set; } - [EpplusTableColumn(Header = "售后单状态(1进行中 2已拒绝 3已完成 4已取消)")] - public int OrderRefundStatus { get; set; } - - } - } diff --git a/ARW.Model/Vo/Business/OrderManage/Orders/OrderDetailVo.cs b/ARW.Model/Vo/Business/OrderManage/Orders/OrderDetailVo.cs index c6b2b78..bf9768f 100644 --- a/ARW.Model/Vo/Business/OrderManage/Orders/OrderDetailVo.cs +++ b/ARW.Model/Vo/Business/OrderManage/Orders/OrderDetailVo.cs @@ -135,6 +135,11 @@ namespace ARW.Model.Vo.Business.OrderManage.Orders /// public OrderReceiveVo OrderReceive { get; set; } + + /// + /// 客户发货备注 + /// + public string CustomerWaybillRemark { get; set; } } } diff --git a/ARW.Service/Api/BusinessService/OrderManage/OrderRefunds/OrderRefundServiceApi.cs b/ARW.Service/Api/BusinessService/OrderManage/OrderRefunds/OrderRefundServiceApi.cs index 4068a2e..7fe983b 100644 --- a/ARW.Service/Api/BusinessService/OrderManage/OrderRefunds/OrderRefundServiceApi.cs +++ b/ARW.Service/Api/BusinessService/OrderManage/OrderRefunds/OrderRefundServiceApi.cs @@ -25,6 +25,17 @@ using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.SpecValues; using ARW.Repository.Business.GoodsManager.GoodsSpecs.SpecValues; using ARW.Service.Api.IBusinessService.OrderManage.Orders; using OfficeOpenXml; +using Newtonsoft.Json; +using ARW.Repository.Business.OrderManage.OrderCustomerAddreses; +using ARW.Service.Business.IBusinessService.Custom.Regions; +using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson; +using ARW.Repository.Business.ShopManager.ShopAddresss; +using ARW.Service.Api.IBusinessService.Custom.Regions; +using ARW.Model.Models.Business.OrderManage.Orders; +using ARW.Service.System.IService; +using Senparc.CO2NET.Extensions; +using ARW.Model.Models.Business.LogisticsManage.LogisticsCompanys; +using ARW.Repository.Business.LogisticsManage.LogisticsCompanys; namespace ARW.Service.Api.BusinessService.OrderManage.OrderRefunds { @@ -41,16 +52,24 @@ namespace ARW.Service.Api.BusinessService.OrderManage.OrderRefunds private readonly OrderRepository _OrderRepository; private readonly OrderGoodsRepository _OrderGoodsRepository; private readonly GoodsRepository _GoodsRepository; + private readonly ShopAddressRepository _ShopAddressRepository; + private readonly LogisticsCompanyRepository _LogisticsCompanyRepository; private readonly IOrderServiceApi _OrderServiceApi; + private readonly IRegionService _RegionService; + private readonly ISysDictDataService _SysDictDataService; - public OrderRefundServiceImplApi(OrderRefundRepository OrderRefundRepository, OrderRepository orderRepository, OrderGoodsRepository orderGoodsRepository, GoodsRepository goodsRepository, IOrderServiceApi orderServiceApi) + public OrderRefundServiceImplApi(OrderRefundRepository OrderRefundRepository, OrderRepository orderRepository, OrderGoodsRepository orderGoodsRepository, GoodsRepository goodsRepository, IOrderServiceApi orderServiceApi, ShopAddressRepository shopAddressRepository, IRegionService regionService, ISysDictDataService sysDictDataService, LogisticsCompanyRepository logisticsCompanyRepository) { this._OrderRefundRepository = OrderRefundRepository; _OrderRepository = orderRepository; _OrderGoodsRepository = orderGoodsRepository; _GoodsRepository = goodsRepository; _OrderServiceApi = orderServiceApi; + _ShopAddressRepository = shopAddressRepository; + _RegionService = regionService; + _SysDictDataService = sysDictDataService; + _LogisticsCompanyRepository = logisticsCompanyRepository; } #region Api接口代码 @@ -96,28 +115,7 @@ namespace ARW.Service.Api.BusinessService.OrderManage.OrderRefunds foreach (var item in list.Result) { - var orderRefundGood = new List(); - - /* 获取售后订单商品列表 */ - var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == item.OrderGuid); - foreach (var _item in orderGoodsList) - { - var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == _item.GoodsGuid); - var orderGood = new OrderGoodsApiVo - { - GoodsGuId = good.GoodsGuid, - Thumb = good.GoodsPicture.Split(',').First(), - Title = good.GoodsName, - SkuId = _item.GoodsSkuId, - Price = _item.GoodsPrice, - BuyQuantity = _item.GoodsTotalNum - }; - if (_item.GoodsSkuId != 0) - orderGood.Specifications = await _OrderServiceApi.GetGoodsSpecList(_item.GoodsSkuId); - - orderRefundGood.Add(orderGood); - } - item.OrderRefundGoodList = orderRefundGood; + item.OrderRefundGoodList = await GetOrderGoodsList(item.OrderGuid); /* 处理售后订单状态描述 */ @@ -210,30 +208,110 @@ namespace ARW.Service.Api.BusinessService.OrderManage.OrderRefunds var query = _OrderRefundRepository .Queryable() .Where(s => s.OrderRefundGuid == parm.OrderRefundGuid) - .Select(s => new OrderRefundApiDetailsVo + .LeftJoin((s, c) => s.ShopGuid == c.ShopGuid) + .LeftJoin((s, c, d) => s.OrderGuid == d.OrderGuid) + .Select((s, c, d) => new OrderRefundApiDetailsVo { OrderRefundId = s.OrderRefundId, OrderRefundGuid = s.OrderRefundGuid, + OrderNo = d.OrderNumber, + StoreName = c.ShopName, OrderGuid = s.OrderGuid, - CustomerGuid = s.CustomerGuid, RefundType = s.RefundType, + MerchantAuditStatus = s.MerchantAuditStatus, + RefundMoney = s.RefundMoney, + IsCustomerSend = s.IsCustomerSend, + OrderRefundStatus = s.OrderRefundStatus, + ShopAddressGuid = s.ShopRefundAddressGuid, RefundReason = s.RefundReason, CustomerRefundDesc = s.CustomerRefundDesc, CustomerRefundImg = s.CustomerRefundImg, - GoodsReceiveStatus = s.GoodsReceiveStatus, - MerchantAuditStatus = s.MerchantAuditStatus, - MerchantRefuseDesc = s.MerchantRefuseDesc, - RefundMoney = s.RefundMoney, - ShopRefundAddressGuid = s.ShopRefundAddressGuid, - IsCustomerSend = s.IsCustomerSend, - CustomerSendTime = s.CustomerSendTime, LogisticsCompanyGuid = s.LogisticsCompanyGuid, - ExpressNo = s.ExpressNo, - OrderRefundStatus = s.OrderRefundStatus, + ExpressNo = s.ExpressNo }).Take(1); - return await query.ToJsonAsync(); + var json = await query.ToJsonAsync(); + + + if (json != "[]") + { + json = json.Remove(0, 1); + json = json.Substring(0, json.Length - 1); + var data = JsonConvert.DeserializeObject(json); + + // 获取订单商品列表 + data.OrderRefundGoodList = await GetOrderGoodsList(data.OrderGuid); + + // 处理退款原因 + var dictList = _SysDictDataService.SelectDictDataByType("refund_reason"); + foreach (var item in dictList) + { + if(Convert.ToInt32(item.DictValue) == data.RefundReason) + { + data.Reason = item.DictLabel; + } + } + + + // 处理快递状态 + if(data.LogisticsCompanyGuid != null) + { + data.TrajectoryVos = new TrajectoryVo(); + var company = await _LogisticsCompanyRepository.GetFirstAsync(s => s.LogisticsCompanyGuid == data.LogisticsCompanyGuid); + data.TrajectoryVos.LogisticsCompanyCode = data.ExpressNo; + data.TrajectoryVos.LogisticsCompanyName = company.LogisticsCompanyName; + } + + + /* 处理售后订单状态描述 */ + // 待审核 + if (data.MerchantAuditStatus == 1) + { + data.Status = 1; + data.EserRightsStatusDesc = "商家将尽快确认您的退款申请"; + } + // 已审核 + if (data.MerchantAuditStatus == 2) + { + data.Status = 2; + data.EserRightsStatusDesc = "商家已审核确认,预计1小时内发起退款"; + } + // 已发货 + if (data.IsCustomerSend == 2) + { + data.Status = 3; + data.EserRightsStatusDesc = "商家已退款,退回资金将原路三个工作日内返回您的账户"; + } + if (data.OrderRefundStatus == 3) + { + data.Status = 4; + data.EserRightsStatusDesc = "退款/售后己完成"; + } + + // 商家地址 + var shopAddress = await _ShopAddressRepository.GetFirstAsync(s => s.ShopAddressGuid == data.ShopAddressGuid); + if (shopAddress != null) + { + var logistics = new Logistics + { + ReceiverAddressId = shopAddress.ShopAddressGuid, + ReceiverName = shopAddress.ShopAddressContactName, + ReceiverPhone = shopAddress.ShopAddressContactNumber, + ReceiverProvince = await _RegionService.GetRegionName(shopAddress.ProvinceId), + ReceiverCity = await _RegionService.GetRegionName(shopAddress.CityId), + receiverCountry = await _RegionService.GetRegionName(shopAddress.DistrictId), + ReceiverAddress = shopAddress.ShopAddressDetailedAddress + }; + data.LogisticsVO = logistics; + } + + json = data.ToJson(); + } + + + + return json; } @@ -242,39 +320,104 @@ namespace ARW.Service.Api.BusinessService.OrderManage.OrderRefunds /// - /// 处理售后订单状态描述 + /// 获取售后订单商品列表 + /// + /// + /// + public async Task> GetOrderGoodsList(long orderGuid) + { + var orderRefundGoodList = new List(); + var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == orderGuid); + foreach (var _item in orderGoodsList) + { + var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == _item.GoodsGuid); + var orderGood = new OrderGoodsApiVo + { + GoodsGuId = good.GoodsGuid, + Thumb = good.GoodsPicture.Split(',').First(), + Title = good.GoodsName, + SkuId = _item.GoodsSkuId, + Price = _item.GoodsPrice, + BuyQuantity = _item.GoodsTotalNum + }; + if (_item.GoodsSkuId != 0) + orderGood.Specifications = await _OrderServiceApi.GetGoodsSpecList(_item.GoodsSkuId); + + orderRefundGoodList.Add(orderGood); + } + return orderRefundGoodList; + } + + + /// + /// 处理物流状态 /// /// /// - //public OrderRefundVoApi GetOrderRefundStatus(OrderRefundVoApi data) + //public OrderRefundApiDetailsVo GetTrajectory(Order order, OrderRefundApiDetailsVo data) //{ - // // 待审核 - // if (data.MerchantAuditStatus == 1) + // data.TrajectoryVos = new TrajectoryVo(); + // var trajectoryList = new List(); + + // // 已下单(待发货) + // if (order.OrderStatus == 1) // { - // data.Status = 1; - // data.EserRightsStatusDesc = "商家将尽快确认您的退款申请"; - // } - // // 已审核 - // if (data.MerchantAuditStatus == 2) - // { - // data.Status = 2; - // data.EserRightsStatusDesc = "商家已审核确认,预计1小时内发起退款"; - // } - // // 已发货 - // if (data.IsCustomerSend == 2) - // { - // data.Status = 3; - // data.EserRightsStatusDesc = "商家已退款,退回资金将原路三个工作日内返回您的账户"; - // } - // if (data.OrderRefundStatus == 3) - // { - // data.Status = 4; - // data.EserRightsStatusDesc = "退款/售后己完成"; + // var trajectoryNodeList1 = new List { GetTrajectoryNode("订单已提交", order.Create_time) }; + // var trajectory1 = GetTrajectory("", "", trajectoryNodeList1, 3); + // trajectoryList.Add(trajectory1); + + // var trajectoryNodeList2 = new List { GetTrajectoryNode("订单已经支付成功,支付方式为:微信支付", order.PayTime) }; + // var trajectory2 = GetTrajectory("已下单", "https://cdn-we-retail.ym.tencent.com/web/trajectoryIcons/ordered.svg", trajectoryNodeList2, 2); + // trajectoryList.Add(trajectory2); + + // // 运输中(已发货,待收货) + // if (order.DeliveryStatus == 2 && order.ReceiptStatus == 1 && order.PayStatus == 2 && order.OrderStatus == 1) + // { + // data.TrajectoryVos.LogisticsCompanyCode = order.LogisticsTrackingNumber; + // data.TrajectoryVos.LogisticsCompanyName = order.LogisticsCompany; + + // var trajectoryNodeList3 = new List { GetTrajectoryNode($"商家已发货,物流承运商:{order.LogisticsCompany}", order.DeliveryTime) }; + + // // 对接快递100接口 + // //var company = _LogisticsCompanyRepository.GetFirst(s => s.LogisticsCompanyGuid == order.LogisticsCompanyGuid); + // //var trackRes = Kuaidi100.GetQueryTrack(company.LogisticsCompanyCode, order.LogisticsTrackingNumber); + + // var trajectory3 = GetTrajectory("已发货", "deliver", trajectoryNodeList3, 1); + // trajectoryList.Add(trajectory3); + // } // } + // //foreach (var item in trajectoryList) + // //{ + // // item.Nodes = item.Nodes.OrderBy(s => s.Sort).ToList(); + // //} + // trajectoryList = trajectoryList.OrderBy(s => s.Sort).ToList(); + // data.TrajectoryVos.Trajectorys = trajectoryList; // return data; //} + + //public Trajectory GetTrajectory(string title, string icon, List trajectoryNodeList, int sort) + //{ + // var trajectory = new Trajectory(); + // trajectory.Title = title; + // trajectory.Icon = icon; + // trajectory.Nodes = trajectoryNodeList; + // trajectory.Sort = sort; + + // return trajectory; + //} + + + //public TrajectoryNode GetTrajectoryNode(string status, DateTime? time) + //{ + // var trajectoryNode = new TrajectoryNode(); + // trajectoryNode.Status = status; + // trajectoryNode.Timestamp = time; + // return trajectoryNode; + //} + + #endregion diff --git a/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs b/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs index 6e38c97..f57ea51 100644 --- a/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs +++ b/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs @@ -169,7 +169,8 @@ namespace ARW.Service.Business.BusinessService.OrderManage.Orders TransactionId = s.TransactionId, IsComment = s.IsComment, OrderSource = s.OrderSource, - CreateTime = s.Create_time + CreateTime = s.Create_time, + CustomerWaybillRemark = s.CustomerWaybillRemark }).Take(1); var json = await query.ToJsonAsync(); diff --git a/ARW.WebApi/Controllers/Api/OrderManage/OrderRefunds/OrderRefundApiController.cs b/ARW.WebApi/Controllers/Api/OrderManage/OrderRefunds/OrderRefundApiController.cs index 1807dbd..36d38f9 100644 --- a/ARW.WebApi/Controllers/Api/OrderManage/OrderRefunds/OrderRefundApiController.cs +++ b/ARW.WebApi/Controllers/Api/OrderManage/OrderRefunds/OrderRefundApiController.cs @@ -79,8 +79,6 @@ namespace ARW.WebApi.Controllers.Api.OrderManage.OrderRefunds if (res != "[]") { - res = res.Remove(0, 1); - res = res.Substring(0, res.Length - 1); var data = res.FromJSON(); return SUCCESS(data); }