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<Order>(request.OrderId).ToOne(o => new { o.Id, o.ShopId, o.OrderSn });
+            var dbOrder = fsql.Select<Order>(request.OrderId).ToOne();
             if (dbOrder == null)
                 throw new BusinessException($"订单号{request.OrderId}不存在");
 
             var shopIds = dbOrder.ShopId.ToString();
             var shop = fsqlManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == shopIds).ToOne();
 
-            var oldPeo = fsql.Select<PurchaseExpressOrder>(request.OldWaybillNo).ToOne();
-            if (oldPeo == null)
-                throw new BusinessException($"旧快递单号{request.OldWaybillNo}不存在");
+            var orderPurchaseInfoList = fsql.Select<OrderPurchaseInfo>().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<PurchaseExpressOrder>(request.NewWaybillNo).ToOne();
-            if (newPeo != null && newPeo.PurchaseOrderId == request.PurchaseOrderId)
-                throw new BusinessException("不能为同一采购单设置重复的快递单号");
 
             IInsert<PurchaseExpressOrder> insertPEO = null;
             IInsert<ExpressOrderRelationInfo> insertEORI = null;
+            IDelete<ExpressOrderRelationInfo> deleteEORI = null;
+            IDelete<PurchaseExpressOrder> deletePEO = null;
+            IUpdate<OrderPurchaseSkuInfo> updatePurchaseOrderSku = null;
+            IUpdate<OrderPurchaseInfo> updatePurchaseOrder = null;
+            IUpdate<Order> updateOrder = null;
+
+            var waybillNos = new List<string>() { request.OldWaybillNo, request.NewWaybillNo };
+            var expressOrderRelationList = fsql.Select<ExpressOrderRelationInfo>().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<PurchaseExpressOrder>(request.OldWaybillNo);
+            deleteEORI = fsql.Delete<ExpressOrderRelationInfo>().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<OrderPurchaseSkuInfo> 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<OrderPurchaseSkuInfo>().Where(posku => posku.PurchaseOrderId == request.PurchaseOrderId).ToList();
+                foreach (var posku in orderPurchaseSkuList)
+                {
+                    if (posku.WaybillNo == request.OldWaybillNo)
+                        posku.WaybillNo = request.NewWaybillNo;
+                }
+                updatePurchaseOrderSku = fsql.Update<OrderPurchaseSkuInfo>().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<ExpressOrderRelationInfo, PurchaseExpressOrder>()
+                                               .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<OrderPurchaseInfo>(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<Order>(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<PurchaseExpressOrder>(request.OldWaybillNo).ExecuteAffrows();
-                fsql.Update<OrderPurchaseSkuInfo>().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();
             });
         }