diff --git a/CoreCms.Net.Services/Order/CoreCmsOrderServices.cs b/CoreCms.Net.Services/Order/CoreCmsOrderServices.cs index 03b936b4..35d9de50 100644 --- a/CoreCms.Net.Services/Order/CoreCmsOrderServices.cs +++ b/CoreCms.Net.Services/Order/CoreCmsOrderServices.cs @@ -85,6 +85,7 @@ namespace CoreCms.Net.Services private readonly IWeChatTransactionComponentOrderServices _chatTransactionComponentOrderServices; private readonly WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; + private IUnitOfWork _unitOfWork; public CoreCmsOrderServices(ICoreCmsOrderRepository dal , IHttpContextAccessor httpContextAccessor @@ -110,7 +111,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, ICoreCmsCheckBeforeAddOrderServices checkBeforeAddOrderServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IWeChatTransactionComponentOrderServices chatTransactionComponentOrderServices) + , ICoreCmsBillReshipServices billReshipServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsGoodsCommentServices goodsCommentServices, ISysTaskLogServices taskLogServices, ICoreCmsPromotionRecordServices promotionRecordServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IWeChatTransactionComponentOrderServices tcOrderServices, ICoreCmsCheckBeforeAddOrderServices checkBeforeAddOrderServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IWeChatTransactionComponentOrderServices chatTransactionComponentOrderServices, IUnitOfWork unitOfWork) { this._dal = dal; base.BaseDal = dal; @@ -149,6 +150,7 @@ namespace CoreCms.Net.Services _checkBeforeAddOrderServices = checkBeforeAddOrderServices; _weChatApiHttpClientFactory = weChatApiHttpClientFactory; _chatTransactionComponentOrderServices = chatTransactionComponentOrderServices; + _unitOfWork = unitOfWork; } #region 查询团购秒杀下单数量(获取货品的秒杀团购数据) @@ -234,80 +236,89 @@ namespace CoreCms.Net.Services public async Task 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 = "创建订单" }; - - var order = new CoreCmsOrder + try { - orderId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.订单编号), - userId = userId, - orderType = orderType, - point = point, - coupon = couponCode, - receiptType = receiptType, - objectId = objectId - }; + //开始事务处理 + _unitOfWork.BeginTran(); + var order = new CoreCmsOrder + { + orderId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.订单编号), + userId = userId, + orderType = orderType, + point = point, + coupon = couponCode, + receiptType = receiptType, + objectId = objectId + }; - //生成收货信息 - var areaId = 0; - var deliveryRes = await FormatOrderDelivery(order, receiptType, ushipId, storeId, ladingName, ladingMobile); - if (!deliveryRes.status) - { - return deliveryRes; - } - else - { - areaId = Convert.ToInt32(deliveryRes.data); - } + //生成收货信息 + var areaId = 0; + var deliveryRes = await FormatOrderDelivery(order, receiptType, ushipId, storeId, ladingName, ladingMobile); + if (!deliveryRes.status) + { + _unitOfWork.RollbackTran(); + return deliveryRes; + } + else + { + areaId = Convert.ToInt32(deliveryRes.data); + } - //通过购物车生成订单信息和订单明细信息 - List orderItems; - var ids = CommonHelper.StringToIntArray(cartIds); - var orderRes = await FormatOrder(order, userId, ids, areaId, point, couponCode, ushipId, receiptType, objectId); - if (!orderRes.status) - { - return orderRes; - } - else - { - orderItems = orderRes.data as List; - } + //通过购物车生成订单信息和订单明细信息 + List orderItems; + var ids = CommonHelper.StringToIntArray(cartIds); + var orderRes = await FormatOrder(order, userId, ids, areaId, point, couponCode, ushipId, receiptType, objectId); + if (!orderRes.status) + { + _unitOfWork.RollbackTran(); + return orderRes; + } + else + { + orderItems = orderRes.data as List; + } - //以下值不是通过购物车得来的,是直接赋值的,就写这里吧,不写formatOrder里了。 - order.memo = memo; - order.source = source; - order.taxType = taxType; - order.taxTitle = taxName; - order.taxCode = taxCode; - order.shipStatus = (int)GlobalEnumVars.OrderShipStatus.No; - order.status = (int)GlobalEnumVars.OrderStatus.Normal; - order.confirmStatus = (int)GlobalEnumVars.OrderConfirmStatus.ReceiptNotConfirmed; - order.createTime = DateTime.Now; - order.scene = scene; + //以下值不是通过购物车得来的,是直接赋值的,就写这里吧,不写formatOrder里了。 + order.memo = memo; + order.source = source; + order.taxType = taxType; + order.taxTitle = taxName; + order.taxCode = taxCode; + order.shipStatus = (int)GlobalEnumVars.OrderShipStatus.No; + order.status = (int)GlobalEnumVars.OrderStatus.Normal; + order.confirmStatus = (int)GlobalEnumVars.OrderConfirmStatus.ReceiptNotConfirmed; + order.createTime = DateTime.Now; + order.scene = scene; - //开始事务处理 - 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; + //插入获取的下单前的微信视频号直接数据 + 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); + await _checkBeforeAddOrderServices.InsertAsync(check); + + //上面保存好订单表,下面保存订单的其他信息 + if (orderItems == null) + { + jm.msg = "订单明细获取失败"; + return jm; + } - //上面保存好订单表,下面保存订单的其他信息 - if (orderItems != null) - { jm.msg = "更改库存"; //更改库存 var avaliableOrderItems = orderItems.Where(item => { - var res = _goodsServices.ChangeStock(item.productId, GlobalEnumVars.OrderChangeStockType.order.ToString(), item.nums); + var res = _goodsServices.ChangeStock(item.productId, + GlobalEnumVars.OrderChangeStockType.order.ToString(), item.nums); if (res.status == false) { jm.msg += $"{item.name}库存不足"; } + return res.status; }).ToList(); @@ -316,14 +327,16 @@ namespace CoreCms.Net.Services await _orderItemServices.InsertCommandAsync(orderItems); await _dal.UpdateAsync(n => new CoreCmsOrder() - { - status = (int)GlobalEnumVars.OrderStatus.Cancel, - updateTime = DateTime.Now - }, + { + status = (int)GlobalEnumVars.OrderStatus.Cancel, + updateTime = DateTime.Now + }, m => m.orderId == order.orderId); //清除购物车信息 - await _cartServices.DeleteAsync(p => ids.Contains(p.id) && p.userId == userId && p.type == orderType); + _unitOfWork.RollbackTran(); + await _cartServices.DeleteAsync(p => + ids.Contains(p.id) && p.userId == userId && p.type == orderType); jm.msg = "下单失败,库存不足"; return jm; } @@ -333,10 +346,12 @@ namespace CoreCms.Net.Services var outItemsBool = outItems > 0; if (outItemsBool == false) { + _unitOfWork.RollbackTran(); jm.msg = "订单明细更新失败"; jm.data = outItems; return jm; } + //优惠券核销 if (!string.IsNullOrEmpty(couponCode)) { @@ -344,9 +359,11 @@ namespace CoreCms.Net.Services var couponRes = await _couponServices.UsedMultipleCoupon(arr, order.orderId); if (couponRes.status == false) { + _unitOfWork.RollbackTran(); return couponRes; } } + //积分核销 if (order.point > 0) { @@ -355,6 +372,7 @@ namespace CoreCms.Net.Services (int)GlobalEnumVars.UserPointSourceTypes.PointTypeDiscount, "订单" + order.orderId + "使用"); if (pointLogRes.status == false) { + _unitOfWork.RollbackTran(); return pointLogRes; } } @@ -370,22 +388,32 @@ namespace CoreCms.Net.Services var pinTuanRes = await _pinTuanRecordServices.OrderAdd(order, avaliableOrderItems, teamId); if (pinTuanRes.status == false) { + _unitOfWork.RollbackTran(); return pinTuanRes; } + break; case (int)GlobalEnumVars.OrderType.Group: - var groupRes = await _promotionRecordServices.OrderAdd(order, avaliableOrderItems, objectId, orderType); + var groupRes = + await _promotionRecordServices.OrderAdd(order, avaliableOrderItems, objectId, + orderType); if (groupRes.status == false) { + _unitOfWork.RollbackTran(); return groupRes; } + break; case (int)GlobalEnumVars.OrderType.Seckill: - var seckillRes = await _promotionRecordServices.OrderAdd(order, avaliableOrderItems, objectId, orderType); + var seckillRes = + await _promotionRecordServices.OrderAdd(order, avaliableOrderItems, objectId, + orderType); if (seckillRes.status == false) { + _unitOfWork.RollbackTran(); return seckillRes; } + break; case (int)GlobalEnumVars.OrderType.Bargain: //砍价模式 @@ -393,172 +421,183 @@ namespace CoreCms.Net.Services break; } - } - //清除购物车信息 - await _cartServices.DeleteAsync(p => ids.Contains(p.id) && p.userId == userId && p.type == orderType); + //校验后再创建订单 + await _dal.InsertAsync(order); - //订单记录 - var orderLog = new CoreCmsOrderLog - { - userId = userId, - orderId = order.orderId, - type = (int)GlobalEnumVars.OrderLogTypes.LOG_TYPE_CREATE, - msg = "订单创建", - data = JsonConvert.SerializeObject(order), - createTime = DateTime.Now - }; - await _orderLogServices.InsertAsync(orderLog); + //清除购物车信息 + await _cartServices.DeleteAsync(p => ids.Contains(p.id) && p.userId == userId && p.type == orderType); - //0元订单记录支付成功 - if (order.orderAmount <= 0) - { - orderLog = new CoreCmsOrderLog + //订单记录 + var orderLog = new CoreCmsOrderLog { userId = userId, orderId = order.orderId, - type = (int)GlobalEnumVars.OrderLogTypes.LOG_TYPE_PAY, - msg = "0元订单直接支付成功", + type = (int)GlobalEnumVars.OrderLogTypes.LOG_TYPE_CREATE, + msg = "订单创建", data = JsonConvert.SerializeObject(order), createTime = DateTime.Now }; await _orderLogServices.InsertAsync(orderLog); - } - //企业发票信息记录 - if (taxType == (int)GlobalEnumVars.OrderTaxType.Company) - { - var invoiceRecord = await _invoiceRecordServices.QueryByClauseAsync(p => p.code == taxCode && p.name == taxName); - if (invoiceRecord != null) + //0元订单记录支付成功 + if (order.orderAmount <= 0) { - invoiceRecord.frequency += 1; - await _invoiceRecordServices.UpdateAsync(invoiceRecord); - } - else - { - invoiceRecord = new CoreCmsInvoiceRecord { code = taxCode, name = taxName, frequency = 1 }; - await _invoiceRecordServices.InsertAsync(invoiceRecord); - } - } - 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(); - - - foreach (var item in orderItems) - { - orderInfo.OrderDetail.ProductList.Add(new ShopOrderAddRequest.Types.OrderDetail.Types.Product() + orderLog = new CoreCmsOrderLog { - 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 + userId = userId, + orderId = order.orderId, + type = (int)GlobalEnumVars.OrderLogTypes.LOG_TYPE_PAY, + msg = "0元订单直接支付成功", + data = JsonConvert.SerializeObject(order), + createTime = DateTime.Now }; - await _chatTransactionComponentOrderServices.InsertAsync(tcOrder); - NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.Order, "自定义交易组件", "推送自定义交易组件创建订单成功"); + await _orderLogServices.InsertAsync(orderLog); + } + + //企业发票信息记录 + if (taxType == (int)GlobalEnumVars.OrderTaxType.Company) + { + var invoiceRecord = await _invoiceRecordServices.QueryByClauseAsync(p => p.code == taxCode && p.name == taxName); + if (invoiceRecord != null) + { + invoiceRecord.frequency += 1; + await _invoiceRecordServices.UpdateAsync(invoiceRecord); + } + else + { + invoiceRecord = new CoreCmsInvoiceRecord { code = taxCode, name = taxName, frequency = 1 }; + await _invoiceRecordServices.InsertAsync(invoiceRecord); + } + } + 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(); + + + 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; + } + + //发送消息 + //0元订单记录支付成功 + if (order.orderAmount <= 0) + { + //用户升级处理 + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.UserUpGrade, JsonConvert.SerializeObject(order)); + //发送支付成功信息,增加发送内容 + await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString(), JObject.FromObject(order)); + await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString(), JObject.FromObject(order)); + //易联云打印机打印 + await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderPrint, JsonConvert.SerializeObject(order)); } else { - NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.Order, "自定义交易组件 ", "推送自定义交易组件创建订单失败"); + await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString(), JObject.FromObject(order)); } - jm.otherData = shopOrderAddResponse; - } - //发送消息 - //0元订单记录支付成功 - if (order.orderAmount <= 0) + _unitOfWork.CommitTran(); + + jm.status = true; + jm.data = order; + + } + catch (Exception e) { - //用户升级处理 - await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.UserUpGrade, JsonConvert.SerializeObject(order)); - //发送支付成功信息,增加发送内容 - await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString(), JObject.FromObject(order)); - await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString(), JObject.FromObject(order)); - //易联云打印机打印 - await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderPrint, JsonConvert.SerializeObject(order)); + _unitOfWork.RollbackTran(); + jm.status = false; + jm.otherData = e.ToString(); } - else - { - await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString(), JObject.FromObject(order)); - } - - jm.status = true; - jm.data = order; - return jm; } @@ -598,7 +637,7 @@ namespace CoreCms.Net.Services order.shipName = userShipInfo.name; order.shipMobile = userShipInfo.mobile; - var ship =await _shipServices.GetShip(userShipInfo.areaId); + var ship = await _shipServices.GetShip(userShipInfo.areaId); if (ship != null) { order.logisticsId = ship.id;