using System;
using System.Collections.Generic;
using CoreCms.Net.Configuration;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using SqlSugar;
using CoreCms.Net.Caching.AccressToken;
using CoreCms.Net.DTO.WeChatShipping;
using CoreCms.Net.IServices;
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.Web.Admin.Infrastructure;
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
}
}