using Infrastructure; using Infrastructure.Attribute; using Infrastructure.Enums; using Infrastructure.Model; using Mapster; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using ARW.Admin.WebApi.Extensions; using ARW.Admin.WebApi.Filters; using ARW.Common; using ARW.Model.Dto.Business.OrderManage.Orders; using ARW.Service.Business.IBusinessService.OrderManage.Orders; using ARW.Admin.WebApi.Controllers; using ARW.Model.Models.Business.OrderManage.Orders; using ARW.Model.Vo.Business.OrderManage.Orders; using Microsoft.AspNetCore.Authorization; using ARW.Admin.WebApi.Framework; using ARW.Service.Api.IBusinessService.OrderManage.Orders; using Geocoding; using ARW.Service.Business.IBusinessService.OrderManage.OrderGoodss; using ARW.Service.Business.IBusinessService.OrderManage.OrderCustomerAddreses; using ARW.Service.Business.IBusinessService.ShopManager.Shops; using ARW.Repository.Business.OrderManage.Orders; using ARW.Repository.Business.Payments; using Infrastructure.WeChat.TenPay; using System.Net.Http; using Senparc.CO2NET.HttpUtility; using ARW.Service.Business.IBusinessService.Payments; using ARW.Model.Models.Business.Payments; namespace ARW.WebApi.Controllers.Business.OrderManage.Orders { /// /// 订单控制器 /// /// @author lwh /// @date 2023-08-29 /// [Verify] [Route("business/[controller]")] public class OrderController : BaseController { private readonly IShopService _ShopService; private readonly IOrderService _OrderService; private readonly IOrderGoodsService _OrderGoodsService; private readonly IOrderCustomerAddressService _OrderCustomerAddressService; private readonly IPaymentService _PaymentService; private readonly SenparcHttpClient _httpClient; /// /// 依赖注入 /// /// 订单服务 public OrderController(IOrderService OrderService, IOrderGoodsService orderGoodsService, IOrderCustomerAddressService orderCustomerAddressService, IShopService shopService, SenparcHttpClient httpClient, IPaymentService paymentService) { _OrderService = OrderService; _OrderGoodsService = orderGoodsService; _OrderCustomerAddressService = orderCustomerAddressService; _ShopService = shopService; _httpClient = httpClient; _PaymentService = paymentService; } /// /// 获取订单列表 /// /// 查询参数 /// [HttpGet("getOrderList")] [ActionPermissionFilter(Permission = "business:order:list")] public async Task GetOrderList([FromQuery] OrderQueryDto parm) { var user = JwtUtil.GetLoginUser(App.HttpContext); if (user.UserId != 1) { var shop = await _ShopService.GetFirstAsync(s => s.ShopUserId == user.UserId); if (shop == null) throw new Exception("当前用户没有店铺"); parm.ShopGuid = shop.ShopGuid; } var res = await _OrderService.GetOrderList(parm); return SUCCESS(res); } /// /// 获取订单详情 /// /// 查询参数 /// [HttpGet("getOrderDetails")] public async Task GetOrderDetails([FromQuery] OrderDetailDto parm) { //if (parm == null) throw new CustomException("参数错误!"); var res = await _OrderService.GetOrderDetails(parm); if (res != "[]") { var data = res.FromJSON(); return SUCCESS(data); } else { return SUCCESS(res); } } /// /// 发货 /// /// /// [HttpPost("deliver")] [Log(Title = "发货", BusinessType = BusinessType.ADDORUPDATE)] public async Task Deliver([FromBody] OrderDeliverDto parm) { if (parm == null) { throw new CustomException("请求参数错误"); } var res = await _OrderService.Deliver(parm); return SUCCESS(res); } /// /// 订单改价 /// /// /// [HttpPost("changePrice")] [Log(Title = "订单改价", BusinessType = BusinessType.ADDORUPDATE)] public async Task ChangePrice([FromBody] OrderChangePriceDto parm) { if (parm == null) { throw new CustomException("请求参数错误"); } var res = await _OrderService.ChangePrice(parm); return SUCCESS(res); } /// /// 审核取消订单 /// /// /// [HttpPost("cancelOrder")] [Log(Title = "审核取消订单", BusinessType = BusinessType.ADDORUPDATE)] public async Task CancelOrder([FromBody] OrderCancelOrderDto parm) { if (parm == null) { throw new CustomException("请求参数错误"); } var order = await _OrderService.GetFirstAsync(s => s.OrderGuid == parm.OrderGuid); var payment = await _PaymentService.GetFirstAsync(s => s.PaymentGuid == order.PaymentGuid); if (parm.IsAgree) { Pay pay = new Pay(_httpClient); var transactionId = payment.PaymentWeixinNumber; string paymentRefundNumber = ""; if (!string.IsNullOrEmpty(payment.PaymentRefundNumber)) { paymentRefundNumber = payment.PaymentRefundNumber; } var totalFee = payment.PaymentMoney * 100; var canleRes = await pay.Refund(transactionId, totalFee, paymentRefundNumber, "商品退款"); if (canleRes.ResultCode.Success == false) throw new CustomException("订单退款失败!"); else { var respones = _PaymentService.UpdateAsync(f => new Payment { PaymentRefundNumber = canleRes.out_refund_no, }, f => f.PaymentNumber == canleRes.out_trade_no); } } var res = await _OrderService.CancelOrder(parm); return SUCCESS(res); } /// /// 添加或修改订单 /// /// /// [HttpPost("addOrUpdateOrder")] [ActionPermissionFilter(Permission = "business:order:addOrUpdate")] [Log(Title = "添加或修改订单", BusinessType = BusinessType.ADDORUPDATE)] public async Task AddOrUpdateOrder([FromBody] OrderDto parm) { if (parm == null) { throw new CustomException("请求参数错误"); } var modal = new Order(); if (parm.OrderId != 0) modal = parm.Adapt().ToUpdate(HttpContext); else modal = parm.Adapt().ToCreate(HttpContext); var res = await _OrderService.AddOrUpdateOrder(modal); return SUCCESS(res); } /// /// 删除订单 /// /// [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 不能为空")); } //foreach (var item in idsArr) //{ // var order = await _OrderService.GetFirstAsync(s => s.OrderId == item); // await _OrderCustomerAddressService.DeleteAsync(s => s.OrderGuid == order.OrderGuid); // await _OrderGoodsService.DeleteAsync(s => s.OrderGuid == order.OrderGuid); //} var response = _OrderService.Delete(idsArr); return SUCCESS("删除成功!"); } /// /// 导出订单 /// /// [Log(Title = "订单导出", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)] [HttpGet("exportOrder")] [ActionPermissionFilter(Permission = "business:order:export")] public async Task ExportExcel([FromQuery] OrderQueryDto parm) { parm.PageSize = 10000; var list = await _OrderService.GetOrderList(parm); var data = list.Result; // 选中数据 if (!string.IsNullOrEmpty(parm.ids)) { int[] idsArr = Tools.SpitIntArrary(parm.ids); var selectDataList = new List(); foreach (var item in idsArr) { var select_data = data.Where(s => s.OrderId == item).First(); selectDataList.Add(select_data); } data = selectDataList; } // 导出数据处理 var handleData = await _OrderService.HandleExportData(data); string sFileName = ExportExcel(handleData, "Order", "订单列表"); return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName }); } } }