升级自定义交易组件常用商品接口,spu接口,品牌接口,订单接口,物流接口。

This commit is contained in:
大灰灰
2022-06-30 22:42:19 +08:00
parent 43a691d1be
commit dc408b8596
27 changed files with 1070 additions and 667 deletions

View File

@@ -0,0 +1,43 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2022/6/29 16:22:45
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 微信交易组件下单前置检查 接口实现
/// </summary>
public class CoreCmsCheckBeforeAddOrderServices : BaseServices<CoreCmsCheckBeforeAddOrder>, ICoreCmsCheckBeforeAddOrderServices
{
private readonly ICoreCmsCheckBeforeAddOrderRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsCheckBeforeAddOrderServices(IUnitOfWork unitOfWork, ICoreCmsCheckBeforeAddOrderRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
}
}

View File

@@ -15,6 +15,7 @@ using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AccressToken;
using CoreCms.Net.Caching.AutoMate.RedisCache;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
@@ -29,10 +30,15 @@ using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using CoreCms.Net.WeChat.Service.HttpClients;
using CoreCms.Net.WeChat.Service.TransactionComponent.Enum;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SKIT.FlurlHttpClient.Wechat.Api;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using SqlSugar;
using Yitter.IdGenerator;
namespace CoreCms.Net.Services
@@ -75,6 +81,9 @@ namespace CoreCms.Net.Services
private readonly IRedisOperationRepository _redisOperationRepository;
private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices;
private readonly IWeChatTransactionComponentOrderServices _tcOrderServices;
private readonly ICoreCmsCheckBeforeAddOrderServices _checkBeforeAddOrderServices;
private readonly IWeChatTransactionComponentOrderServices _chatTransactionComponentOrderServices;
private readonly WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
@@ -103,7 +112,7 @@ namespace CoreCms.Net.Services
, ICoreCmsPaymentsServices paymentsServices
, ICoreCmsBillRefundServices billRefundServices
, ICoreCmsBillLadingServices billLadingServices
, ICoreCmsBillReshipServices billReshipServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsGoodsCommentServices goodsCommentServices, ISysTaskLogServices taskLogServices, ICoreCmsPromotionRecordServices promotionRecordServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IWeChatTransactionComponentOrderServices tcOrderServices)
, ICoreCmsBillReshipServices billReshipServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsGoodsCommentServices goodsCommentServices, ISysTaskLogServices taskLogServices, ICoreCmsPromotionRecordServices promotionRecordServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IWeChatTransactionComponentOrderServices tcOrderServices, ICoreCmsCheckBeforeAddOrderServices checkBeforeAddOrderServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IWeChatTransactionComponentOrderServices chatTransactionComponentOrderServices)
{
this._dal = dal;
base.BaseDal = dal;
@@ -139,6 +148,9 @@ namespace CoreCms.Net.Services
_redisOperationRepository = redisOperationRepository;
_userWeChatInfoServices = userWeChatInfoServices;
_tcOrderServices = tcOrderServices;
_checkBeforeAddOrderServices = checkBeforeAddOrderServices;
_weChatApiHttpClientFactory = weChatApiHttpClientFactory;
_chatTransactionComponentOrderServices = chatTransactionComponentOrderServices;
}
@@ -200,8 +212,11 @@ namespace CoreCms.Net.Services
/// <param name="taxCode">发票税务编码</param>
/// <param name="objectId">关联非普通订单营销功能的序列</param>
/// <param name="teamId">拼团订单分组序列</param>
/// <param name="requireOrder">微信自定义组件是否需要推单1:需要0:不需要)</param>
/// <param name="requiredFundType">微信自定义组件requireOrder = 1时生效0非二级商户号订单1二级商户号订单2两种方式皆可后续只会存在1)</param>
/// <param name="traceId">微信自定义组件跟踪ID有效期十分钟会影响主播归因、分享员归因等需创建订单前调用调用生成订单 api 时需传入该参数)</param>
/// <returns></returns>
public async Task<WebApiCallBack> ToAdd(int userId, int orderType, string cartIds, int receiptType, int ushipId, int storeId, string ladingName, string ladingMobile, string memo, int point, string couponCode, int source, int scene, int taxType, string taxName, string taxCode, int objectId, int teamId)
public async Task<WebApiCallBack> ToAdd(int userId, int orderType, string cartIds, int receiptType, int ushipId, int storeId, string ladingName, string ladingMobile, string memo, int point, string couponCode, int source, int scene, int taxType, string taxName, string taxCode, int objectId, int teamId, int requireOrder, int requiredFundType, string traceId)
{
var jm = new WebApiCallBack() { methodDescription = "创建订单" };
@@ -253,6 +268,7 @@ namespace CoreCms.Net.Services
order.createTime = DateTime.Now;
order.scene = scene;
//不同的订单类型会有不同的操作
switch (orderType)
{
@@ -285,18 +301,22 @@ namespace CoreCms.Net.Services
//砍价模式
break;
default:
jm.status = false;
jm.data = 10000;
jm.msg = GlobalErrorCodeVars.Code10000;
break;
}
//开始事务处理
await _dal.InsertAsync(order);
//插入获取的下单前的微信视频号直接数据
var check = new CoreCmsCheckBeforeAddOrder();
check.orderId = order.orderId;
check.requireOrder = requireOrder;
check.requiredFundType = requiredFundType;
check.traceId = traceId;
check.createTime = DateTime.Now;
await _checkBeforeAddOrderServices.InsertAsync(check);
//上面保存好订单表,下面保存订单的其他信息
if (orderItems != null)
{
@@ -393,6 +413,102 @@ namespace CoreCms.Net.Services
order.taxTitle = taxName;
order.taxCode = taxCode;
if (requireOrder == (int)GlobalEnumVars.RequireOrderType.)
{
//获取小程序认证
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
var orderInfo = new ShopOrderAddRequest
{
AccessToken = accessToken,
Scene = scene,
//基础
CreateTime = new DateTimeOffset(DateTime.Now),
//FundType = (int)GlobalEnumVars.RequiredFundType.二级商户号订单,
FundType = (int)GlobalEnumVars.RequiredFundType., //新版自定义交易组件,必须要走二级商户订单模式
OutOrderId = order.orderId,
PagePath = UniAppConst.OrderPath(order.orderId)
};
var weChatUserInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == order.userId, true);
if (weChatUserInfo != null)
{
orderInfo.OpenId = weChatUserInfo.openid;
}
orderInfo.OutUserId = order.userId.ToString();
//收货人信息
orderInfo.Address = new ShopOrderAddRequest.Types.Address()
{
ReceiverName = order.shipName,
Detail = order.shipAddress,
TeleNumber = order.shipMobile,
};
//发货方式
orderInfo.Delivery = new ShopOrderAddRequest.Types.Delivery()
{
DeliveryType = (int)DeliveryTypeEnum.
};
orderInfo.OrderDetail = new ShopOrderAddRequest.Types.OrderDetail();
//支付信息
orderInfo.OrderDetail.Payment = new ShopOrderAddRequest.Types.OrderDetail.Types.Payment()
{
PayType = (int)GlobalEnumVars.PayMethodType.
};
//价格体系
orderInfo.OrderDetail.Amount = new ShopOrderAddRequest.Types.OrderDetail.Types.Amount()
{
OrderFee = Convert.ToInt32(order.orderAmount * 100),
FreightFee = Convert.ToInt32(order.costFreight * 100),
DiscountedFee = Convert.ToInt32((order.pointMoney + order.orderDiscountAmount + order.goodsDiscountAmount + order.couponDiscountAmount) * 100),
AdditionalPrice = 0,
AdditionalRemark = "无",
};
//商品信息
orderInfo.OrderDetail.ProductList = new List<ShopOrderAddRequest.Types.OrderDetail.Types.Product>();
foreach (var item in orderItems)
{
orderInfo.OrderDetail.ProductList.Add(new ShopOrderAddRequest.Types.OrderDetail.Types.Product()
{
OutProductId = item.goodsId.ToString(),
OutSKUId = item.productId.ToString(),
Count = item.nums,
SalePrice = Convert.ToInt32(item.amount * 100),
SKURealPrice = Convert.ToInt32(item.amount * 100),
PagePath = UniAppConst.GoodDetail(item.goodsId.ToString()),
Title = item.name,
HeadImageUrl = item.imageUrl
});
}
var shopOrderAddResponse = await client.ExecuteShopOrderAddAsync(orderInfo);
if (shopOrderAddResponse.IsSuccessful())
{
var tcOrder = new WeChatTransactionComponentOrder
{
orderId = shopOrderAddResponse.Data.OrderId,
outOrderId = shopOrderAddResponse.Data.OutOrderId,
createTime = DateTime.Now,
openid = orderInfo.OpenId
};
await _chatTransactionComponentOrderServices.InsertAsync(tcOrder);
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.Order, "自定义交易组件", "推送自定义交易组件创建订单成功");
}
else
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.Order, "自定义交易组件 ", "推送自定义交易组件创建订单失败");
}
jm.otherData = shopOrderAddResponse;
}
//发送消息
//推送消息
await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString(), JObject.FromObject(order));
@@ -1394,12 +1510,13 @@ namespace CoreCms.Net.Services
}
}
if (order.orderType == (int)GlobalEnumVars.OrderType.Common && order.scene > 0)
{
order.paymentItem = new List<CoreCmsBillPayments> { billPaymentInfo };
//自定义交易组件同步
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentPayOrderSync, JsonConvert.SerializeObject(order));
}
//新版自定义交易组件已经不需要同步订单支付状态。
//if (order.orderType == (int)GlobalEnumVars.OrderType.Common && order.scene > 0)
//{
// order.paymentItem = new List<CoreCmsBillPayments> { billPaymentInfo };
// //自定义交易组件同步
// await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentPayOrderSync, JsonConvert.SerializeObject(order));
//}
//结佣处理
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderAgentOrDistribution, JsonConvert.SerializeObject(order));
@@ -1495,6 +1612,10 @@ namespace CoreCms.Net.Services
{
_goodsServices.ChangeStock(item.productId, GlobalEnumVars.OrderChangeStockType.cancel.ToString(), item.nums);
}
var orderInfoIds = orderInfo.Select(p => p.orderId).ToList();
await CloseOrder(orderInfoIds);
jm.status = true;
jm.msg = "订单取消成功";
}
@@ -1939,8 +2060,9 @@ namespace CoreCms.Net.Services
/// <param name="orderId"></param>
/// <param name="score">有序队列积分</param>
/// <param name="remark"></param>
/// <param name="source">来源/system(系统)/wxpost微信消息推送</param>
/// <returns></returns>
public async Task<WebApiCallBack> CompleteOrder(string orderId, int score = 0, string remark = "后台订单完成操作")
public async Task<WebApiCallBack> CompleteOrder(string orderId, int score = 0, string remark = "后台订单完成操作", string source = "system")
{
var jm = new WebApiCallBack();
@@ -2003,9 +2125,11 @@ namespace CoreCms.Net.Services
//订单完成结算订单
await _redisOperationRepository.SortedSetAddAsync(RedisMessageQueueKey.OrderFinishCommand, orderInfo.orderId, score);
// 微信自定义交易组件-订单确认收货
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentOrderDeliveryRecieveSync, JsonConvert.SerializeObject(orderInfo));
if (source== "system")
{
// 微信自定义交易组件-订单确认收货
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentOrderDeliveryRecieveSync, JsonConvert.SerializeObject(orderInfo));
}
jm.status = true;
jm.msg = "订单完成";
@@ -2126,6 +2250,9 @@ namespace CoreCms.Net.Services
#endregion
#region
/// <summary>
/// 重写根据条件列表数据
@@ -2191,6 +2318,8 @@ namespace CoreCms.Net.Services
{
var ids = orderInfos.Select(p => p.orderId).ToArray();
jm = await CancelOrder(ids);
await CloseOrder(ids.ToList());
}
@@ -2441,5 +2570,45 @@ namespace CoreCms.Net.Services
}
#endregion
#region -
private async Task CloseOrder(ICollection<string> ids)
{
//判断是否是自定义交易订单
var coreCmsCheckBeforeAddOrders = await _checkBeforeAddOrderServices.QueryListByClauseAsync(p => ids.Contains(p.orderId) && p.requireOrder == (int)GlobalEnumVars.RequireOrderType.);
if (coreCmsCheckBeforeAddOrders.Any())
{
var dataIds = coreCmsCheckBeforeAddOrders.Select(p => p.orderId).ToList();
var orderInfos = await _dal.QueryListByClauseAsync(p => dataIds.Contains(p.orderId), p => p.createTime, OrderByType.Asc, true);
//获取小程序认证
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
foreach (var item in orderInfos)
{
var request = new ShopOrderCloseRequest();
request.AccessToken = accessToken;
request.OutOrderId = item.orderId;
var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == item.userId);
if (user == null)
{
break;
}
request.OutOrderId = item.orderId;
request.OpenId = user.openid;
var response = await client.ExecuteShopOrderCloseAsync(request);
NLogUtil.WriteAll(response.IsSuccessful() ? NLog.LogLevel.Info : NLog.LogLevel.Error,
LogType.Web, "自定义交易组件-关闭订单", JsonConvert.SerializeObject(response));
}
}
}
#endregion
}
}