diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index cc427f5..f149f2c 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -1088,69 +1088,167 @@ namespace BBWYB.Server.Business { nLogManager.Default().Info($"EditPurchaseExpressOrder {JsonConvert.SerializeObject(request)}"); - - var dbOrder = fsql.Select(request.OrderId).ToOne(o => new { o.Id, o.ShopId, o.OrderSn }); + var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException($"订单号{request.OrderId}不存在"); var shopIds = dbOrder.ShopId.ToString(); var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == shopIds).ToOne(); - var oldPeo = fsql.Select(request.OldWaybillNo).ToOne(); - if (oldPeo == null) - throw new BusinessException($"旧快递单号{request.OldWaybillNo}不存在"); + var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); + var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); + if (purchaseOrder == null) + throw new BusinessException($"未查询到采购单号{request.PurchaseOrderId}"); - var newPeo = fsql.Select(request.NewWaybillNo).ToOne(); - if (newPeo != null && newPeo.PurchaseOrderId == request.PurchaseOrderId) - throw new BusinessException("不能为同一采购单设置重复的快递单号"); IInsert insertPEO = null; IInsert insertEORI = null; + IDelete deleteEORI = null; + IDelete deletePEO = null; + IUpdate updatePurchaseOrderSku = null; + IUpdate updatePurchaseOrder = null; + IUpdate updateOrder = null; + + var waybillNos = new List() { request.OldWaybillNo, request.NewWaybillNo }; + var expressOrderRelationList = fsql.Select().Where(eori => waybillNos.Contains(eori.WayBillNo)).ToList(); + var oldWaybillNoRelationList = expressOrderRelationList.Where(eori => eori.WayBillNo == request.OldWaybillNo).ToList(); + var newWaybillNoRelationList = expressOrderRelationList.Where(eori => eori.WayBillNo == request.NewWaybillNo).ToList(); + + #region 旧快递单号验证 + if (!oldWaybillNoRelationList.Any()) + throw new BusinessException("未查询到旧快递单号"); + if (!oldWaybillNoRelationList.Any(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) + throw new BusinessException($"旧快递单号{request.OldWaybillNo}不属于采购单{request.PurchaseOrderId},无权修改"); + if (oldWaybillNoRelationList.Count() == oldWaybillNoRelationList.Count(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) + deletePEO = fsql.Delete(request.OldWaybillNo); + deleteEORI = fsql.Delete().Where(eori => eori.PurchaseOrderId == request.PurchaseOrderId && eori.WayBillNo == request.OldWaybillNo); + #endregion - newPeo = new PurchaseExpressOrder() + #region 新快递单号验证 + if (!newWaybillNoRelationList.Any(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) { - WaybillNo = request.NewWaybillNo, - TargetExpressId = request.NewExpressId, - TargetExpressName = request.NewExpressName, - CreateTime = DateTime.Now, - OrderId = request.OrderId, - PurchaseOrderId = request.PurchaseOrderId, - ShopId = oldPeo.ShopId, - ExpressState = kuaiDi100Manager.GetExpressState(1) //快递100发货状态值 默认揽收 - }; - try + var eori = new ExpressOrderRelationInfo() + { + Id = idGenerator.NewLong(), + OrderId = request.OrderId, + PurchaseOrderId = request.PurchaseOrderId, + CreateTime = DateTime.Now, + ShopId = dbOrder.ShopId, + WayBillNo = request.NewWaybillNo + }; + insertEORI = fsql.Insert(eori); + } + else + throw new BusinessException("请勿重复为同一采购单设置相同的快递单号"); + + PurchaseExpressOrder newPeo = null; + if (!newWaybillNoRelationList.Any()) + { + newPeo = new PurchaseExpressOrder() + { + WaybillNo = request.NewWaybillNo, + TargetExpressId = request.NewExpressId, + TargetExpressName = request.NewExpressName, + CreateTime = DateTime.Now, + ShopId = dbOrder.ShopId.Value, + IsSubscribeKD100 = false, + ExpressState = kuaiDi100Manager.GetExpressState(1) //快递100发货状态值 默认揽收 + }; + + try + { + kuaiDi100Manager.SubscribeKuaiDi100(request.NewWaybillNo, request.NewExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); + newPeo.IsSubscribeKD100 = true; + } + catch (Exception ex) + { + nLogManager.Default().Error(ex, $"EditPurchaseExpressOrder,Request:{JsonConvert.SerializeObject(request)}"); + + #region 订阅失败发送钉钉通知 + var dingdingMsg = new StringBuilder(); + dingdingMsg.AppendLine($"错误:{ex.Message}"); + dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); + dingdingMsg.AppendLine($"拳探订单号:{request.OrderId}"); + dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); + dingdingMsg.AppendLine($"源物流公司:无"); + dingdingMsg.AppendLine($"目标物流公司:{request.NewExpressName} {request.NewExpressId}"); + dingdingMsg.AppendLine($"快递单号:{request.NewWaybillNo}"); + dingdingMsg.AppendLine("触发环节:修改物流单号"); + dingdingMsg.Append($"店铺名:{shop.ShopName}"); + Task.Factory.StartNew(() => SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + #endregion + } + insertPEO = fsql.Insert(newPeo); + } + #endregion + + #region 更新采购sku使用的快递单号 + IList orderPurchaseSkuList = null; + if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { - kuaiDi100Manager.SubscribeKuaiDi100(request.NewWaybillNo, request.NewExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); - newPeo.IsSubscribeKD100 = true; + orderPurchaseSkuList = fsql.Select().Where(posku => posku.PurchaseOrderId == request.PurchaseOrderId).ToList(); + foreach (var posku in orderPurchaseSkuList) + { + if (posku.WaybillNo == request.OldWaybillNo) + posku.WaybillNo = request.NewWaybillNo; + } + updatePurchaseOrderSku = fsql.Update().Set(psku => psku.WaybillNo, request.NewWaybillNo) + .Where(psku => psku.PurchaseOrderId == request.PurchaseOrderId) + .Where(psku => psku.WaybillNo == request.OldWaybillNo); + } - catch (Exception ex) + #endregion + + #region 计算采购单状态 + var purchaseExpressOrderList = fsql.Select() + .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) + .Where((eori, peo) => eori.PurchaseOrderId == request.PurchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder + { + CreateTime = peo.CreateTime, + ExpressContent = peo.ExpressContent, + ExpressChangedTime = peo.ExpressChangedTime, + ExpressState = peo.ExpressState, + IsSubscribeKD100 = peo.IsSubscribeKD100, + //OrderId = eori.OrderId, + //PurchaseOrderId = eori.PurchaseOrderId, + ShopId = eori.ShopId.Value, + SourceExpressId = peo.SourceExpressId, + SourceExpressName = peo.SourceExpressName, + TargetExpressId = peo.TargetExpressId, + TargetExpressName = peo.TargetExpressName, + WaybillNo = peo.WaybillNo + }); + if (newPeo != null) + purchaseExpressOrderList.Add(newPeo); + var oldPurchaseOrderState = purchaseOrder.OrderState; + purchaseOrder.CalculationOrderState(fsql, orderPurchaseSkuList, purchaseExpressOrderList); + if (oldPurchaseOrderState != purchaseOrder.OrderState) + updatePurchaseOrder = fsql.Update(purchaseOrder.Id).Set(opi => opi.OrderState, purchaseOrder.OrderState); + #endregion + + #region 计算订单状态 + var oldOrderState = dbOrder.OrderState; + dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); + if (oldOrderState != dbOrder.OrderState) { - nLogManager.Default().Error(ex, $"EditPurchaseExpressOrder,Request:{JsonConvert.SerializeObject(request)}"); - - #region 订阅失败发送钉钉通知 - var dingdingMsg = new StringBuilder(); - dingdingMsg.AppendLine($"错误:{ex.Message}"); - dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); - dingdingMsg.AppendLine($"拳探订单号:{request.OrderId}"); - dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); - dingdingMsg.AppendLine($"源物流公司:无"); - dingdingMsg.AppendLine($"目标物流公司:{request.NewExpressName} {request.NewExpressId}"); - dingdingMsg.AppendLine($"快递单号:{request.NewWaybillNo}"); - dingdingMsg.AppendLine("触发环节:修改物流单号"); - dingdingMsg.Append($"店铺名:{shop.ShopName}"); - Task.Factory.StartNew(() => SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); + + #region 通知C端状态 + Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } + #endregion fsql.Transaction(() => { - fsql.Delete(request.OldWaybillNo).ExecuteAffrows(); - fsql.Update().Set(psku => psku.WaybillNo, request.NewWaybillNo) - .Where(psku => psku.PurchaseOrderId == request.PurchaseOrderId) - .Where(psku => psku.WaybillNo == request.OldWaybillNo) - .ExecuteAffrows(); - fsql.Insert(newPeo).ExecuteAffrows(); + insertPEO?.ExecuteAffrows(); + insertEORI?.ExecuteAffrows(); + deleteEORI?.ExecuteAffrows(); + deletePEO?.ExecuteAffrows(); + updatePurchaseOrderSku?.ExecuteAffrows(); + updatePurchaseOrder?.ExecuteAffrows(); + updateOrder?.ExecuteAffrows(); }); }