public TransportOrderMaster TransferFlow2Order(string flowCode) { if (string.IsNullOrEmpty(flowCode)) { throw new BusinessException("运输路线代码不能为空"); } TransportFlowMaster transportFlowMaster = this.genericMgr.FindAll<TransportFlowMaster>("from TransportFlowMaster where Code = ?", flowCode).SingleOrDefault(); TransportOrderMaster transportOrderMaster = new TransportOrderMaster(); return transportOrderMaster; }
public string GetTransportOrderNo(TransportOrderMaster transportOrderMaster) { string numberSuffix = GetNextSequence(BusinessConstants.NUMBERCONTROL_TRANSPORTATION); numberSuffix = numberSuffix.PadLeft(10, '0'); return "T" + numberSuffix; }
public void StartTransportOrderMaster(TransportOrderMaster transportOrderMaster) { if (transportOrderMaster == null) { throw new BusinessException("运单不存在。"); } if (transportOrderMaster.Status != TransportStatus.Submit) { throw new BusinessException("运单{0}不是释放状态不能放行。", transportOrderMaster.OrderNo); } transportOrderMaster.Status = TransportStatus.InProcess; transportOrderMaster.StartDate = DateTime.Now; transportOrderMaster.StartUserId = SecurityContextHolder.Get().Id; transportOrderMaster.StartUserName = SecurityContextHolder.Get().FullName; this.genericMgr.Update(transportOrderMaster); }
private void ReleaseTransportOrderMaster(TransportOrderMaster transportOrderMaster) { #region 运单校验 if (transportOrderMaster.Status != TransportStatus.Create) { throw new BusinessException("运单{0}不是创建状态不能释放。", transportOrderMaster.OrderNo); } if (transportOrderMaster.TransportOrderRouteList.Count < 2) { throw new BusinessException("运单{0}至少应该包含2个运输站点。", transportOrderMaster.OrderNo); } if (!transportOrderMaster.MultiSitePick && transportOrderMaster.TransportOrderDetailList.Count == 0) { throw new BusinessException("运单{0}没有添加ASN。", transportOrderMaster.OrderNo); } if (string.IsNullOrWhiteSpace(transportOrderMaster.Carrier)) { throw new BusinessException("运单{0}的承运商不能为空。", transportOrderMaster.OrderNo); } if (transportOrderMaster.TransportMode == TransportMode.Land) { if (string.IsNullOrWhiteSpace(transportOrderMaster.Vehicle)) { throw new BusinessException("运单{0}的运输工具不能为空。", transportOrderMaster.OrderNo); } if (string.IsNullOrWhiteSpace(transportOrderMaster.Driver)) { throw new BusinessException("运单{0}的驾驶员不能为空。", transportOrderMaster.OrderNo); } if (!transportOrderMaster.MultiSitePick && transportOrderMaster.MinLoadRate.HasValue && string.IsNullOrWhiteSpace(transportOrderMaster.Tonnage)) { throw new BusinessException("运输工具{0}的吨位不能为空。", transportOrderMaster.Vehicle); } } Carrier carrier = this.genericMgr.FindAll<Carrier>("from Carrier where Code = ?", transportOrderMaster.Carrier).SingleOrDefault(); if (carrier == null) { throw new BusinessException("承运商代码{0}不存在。", transportOrderMaster.Carrier); } #region 计算装载率 this.CalculateShipLoad(transportOrderMaster.TransportOrderDetailList); TransportOrderRoute firstTransportOrderRoute = transportOrderMaster.TransportOrderRouteList.OrderBy(r => r.Sequence).First(); firstTransportOrderRoute.WeightRate = transportOrderMaster.TransportOrderDetailList.Sum(d => d.Weight) / transportOrderMaster.LoadWeight; firstTransportOrderRoute.LoadRate = transportOrderMaster.TransportOrderDetailList.Sum(d => d.Volume) / transportOrderMaster.LoadWeight; if (transportOrderMaster.MinLoadRate.HasValue && transportOrderMaster.MinLoadRate.Value > firstTransportOrderRoute.LoadRate) { throw new BusinessException("运输单{0}不满足最小装载率{1}。", transportOrderMaster.OrderNo, transportOrderMaster.MinLoadRate); } #endregion #endregion #region 确定运输站点 if (!transportOrderMaster.MultiSitePick) { IList<TransportOrderRoute> removeTransportOrderRouteList = new List<TransportOrderRoute>(); IList<TransportOrderRoute> targetTransportOrderRouteList = new List<TransportOrderRoute>(); int seq = 2; foreach (TransportOrderRoute transportOrderRoute in transportOrderMaster.TransportOrderRouteList) { if (transportOrderRoute.Sequence == 1) { //不能更改始发站点 continue; } if (transportOrderMaster.TransportOrderDetailList.Where(d => d.ShipFrom == transportOrderRoute.ShipAddress || d.ShipTo == transportOrderRoute.ShipAddress).Count() > 0) { transportOrderRoute.Sequence = seq++; targetTransportOrderRouteList.Add(transportOrderRoute); } else { removeTransportOrderRouteList.Add(transportOrderRoute); } } if (targetTransportOrderRouteList.Count <= 1) { throw new BusinessException("运单{0}的站点不行小于2个。", transportOrderMaster.OrderNo); } transportOrderMaster.TransportOrderRouteList = targetTransportOrderRouteList; foreach (TransportOrderRoute transportOrderRoute in transportOrderMaster.TransportOrderRouteList) { this.genericMgr.Update(transportOrderRoute); } foreach (TransportOrderRoute removeTransportOrderRoute in removeTransportOrderRouteList) { this.genericMgr.Delete(removeTransportOrderRoute); } } #endregion #region 释放运单 transportOrderMaster.ShipFrom = transportOrderMaster.TransportOrderRouteList.First().ShipAddress; transportOrderMaster.ShipFromAddress = transportOrderMaster.TransportOrderRouteList.First().ShipAddressDescription; transportOrderMaster.ShipTo = transportOrderMaster.TransportOrderRouteList.Last().ShipAddress; transportOrderMaster.ShipToAddress = transportOrderMaster.TransportOrderRouteList.Last().ShipAddressDescription; transportOrderMaster.CurrentArriveSiteId = transportOrderMaster.TransportOrderRouteList.First().Id; transportOrderMaster.CurrentArriveShipAddress = transportOrderMaster.TransportOrderRouteList.First().ShipAddress; transportOrderMaster.CurrentArriveShipAddressDescription = transportOrderMaster.TransportOrderRouteList.First().ShipAddressDescription; transportOrderMaster.Status = TransportStatus.Submit; transportOrderMaster.SubmitDate = DateTime.Now; transportOrderMaster.SubmitUserId = SecurityContextHolder.Get().Id; transportOrderMaster.SubmitUserName = SecurityContextHolder.Get().FullName; this.genericMgr.Update(transportOrderMaster); #endregion if (transportOrderMaster.IsAutoStart) { StartTransportOrderMaster(transportOrderMaster); } }
public string CreateTransportOrder(TransportOrderMaster transportOrderMaster, IDictionary<int, string> shipAddressDic, IList<string> ipNoList) { #region 是否生成运输单号校验 if (!string.IsNullOrWhiteSpace(transportOrderMaster.OrderNo)) { throw new TechnicalException("已经生成运输单号。"); } #endregion #region 必输字段校验 if (string.IsNullOrWhiteSpace(transportOrderMaster.Flow)) { throw new BusinessException("运输路线代码不能为空"); } if (string.IsNullOrWhiteSpace(transportOrderMaster.Vehicle)) { throw new BusinessException("运输工具不能为空。"); } if (string.IsNullOrWhiteSpace(transportOrderMaster.Carrier)) { throw new BusinessException("承运商不能为空。"); } #endregion #region 字段合法性校验 TransportFlowMaster transportFlowMaster = this.genericMgr.FindAll<TransportFlowMaster>("from TransportFlowMaster where Code = ?", transportOrderMaster.Flow).SingleOrDefault(); if (transportFlowMaster == null) { throw new BusinessException("运输路线{0}不存在。", transportOrderMaster.Flow); } else { transportOrderMaster.FlowDescription = transportFlowMaster.Description; transportOrderMaster.MinLoadRate = transportFlowMaster.MinLoadRate; transportOrderMaster.IsAutoRelease = transportFlowMaster.IsAutoRelease; //transportOrderMaster.IsAutoStart = transportFlowMaster.IsAutoStart; transportOrderMaster.MultiSitePick = transportFlowMaster.MultiSitePick; } //IList<TransportFlowRoute> transportFlowRouteList = this.genericMgr.FindAll<TransportFlowRoute>("from TransportFlowRoute where Flow = ? order by Sequence", transportOrderMaster.Flow); //if (transportFlowRouteList == null || transportFlowRouteList.Count < 2) //{ // throw new BusinessException("运输路线{0}没有维护足够的运输站点。", transportOrderMaster.Flow); //} //else //{ // transportOrderMaster.ShipFrom = transportFlowRouteList.First().ShipAddress; // transportOrderMaster.ShipFromAddress = transportFlowRouteList.First().ShipAddressDescription; // transportOrderMaster.ShipTo = transportFlowRouteList.Last().ShipAddress; // transportOrderMaster.ShipToAddress = transportFlowRouteList.Last().ShipAddressDescription; //} //Carrier carrier = genericMgr.FindAll<Carrier>("from Carrier where Code = ?", transportOrderMaster.Carrier).FirstOrDefault(); //if (carrier == null) //{ // throw new BusinessException("承运商代码{0}不存在。", transportOrderMaster.Carrier); //} //else //{ // transportOrderMaster.CarrierName = carrier.Name; //} TransportFlowCarrier transportFlowCarrier = genericMgr.FindAll<TransportFlowCarrier>("from TransportFlowCarrier where Flow = ? and Carrier = ? and TransportMode = ?", new object[] { transportFlowMaster.Code, transportOrderMaster.Carrier, transportOrderMaster.TransportMode }).FirstOrDefault(); if (transportFlowCarrier != null) { transportFlowCarrier.PriceList = transportFlowCarrier.PriceList; transportFlowCarrier.BillAddress = transportFlowCarrier.BillAddress; } //if (!string.IsNullOrWhiteSpace(transportOrderMaster.Vehicle)) //{ // Vehicle vehicle = genericMgr.FindAll<Vehicle>("from Vehicle where Code = ?", transportOrderMaster.Vehicle).FirstOrDefault(); // if (vehicle == null) // { // throw new BusinessException("运输工具{0}不存在。", transportOrderMaster.Vehicle); // } // if (vehicle.Carrier != carrier.Code) // { // throw new BusinessException("运输工具{0}不属于承运商{1}。", transportOrderMaster.Vehicle, transportOrderMaster.Carrier); // } // Tonnage tonnage = genericMgr.FindAll<Tonnage>("from Tonnage where Code = ?", vehicle.Tonnage).FirstOrDefault(); // if (tonnage == null) // { // throw new BusinessException("运输工具{0}的吨位代码{1}不存在。", vehicle.Code, transportOrderMaster.Tonnage); // } // transportOrderMaster.Tonnage = tonnage.Code; // transportOrderMaster.LoadVolume = tonnage.LoadVolume; // transportOrderMaster.LoadWeight = tonnage.LoadWeight; // transportOrderMaster.DrivingNo = vehicle.DrivingNo; // if (string.IsNullOrWhiteSpace(transportOrderMaster.Driver) && !string.IsNullOrWhiteSpace(vehicle.Driver)) // { // Driver driver = genericMgr.FindAll<Driver>("from Driver where Code = ?", vehicle.Driver).FirstOrDefault(); // if (driver != null) // { // transportOrderMaster.Driver = driver.Code; // transportOrderMaster.DriverMobilePhone = driver.MobilePhone; // transportOrderMaster.LicenseNo = driver.LicenseNo; // } // } //} //if (!string.IsNullOrWhiteSpace(transportOrderMaster.Driver)) //{ // Driver driver = genericMgr.FindAll<Driver>("from Driver where Code = ?", transportOrderMaster.Driver).FirstOrDefault(); // if (driver == null) // { // throw new BusinessException("驾驶员{0}不存在。", transportOrderMaster.Driver); // } // transportOrderMaster.Driver = driver.Code; // transportOrderMaster.DriverMobilePhone = driver.MobilePhone; // transportOrderMaster.LicenseNo = driver.LicenseNo; //} #endregion #region 准备运单 string orderNo = numberControlMgr.GetTransportOrderNo(transportOrderMaster); transportOrderMaster.OrderNo = orderNo; if (ipNoList != null) { ipNoList = ipNoList.Distinct().ToArray(); } IList<TransportOrderRoute> transportOrderRouteList = PrepareTransportOrderRoute(orderNo, transportOrderMaster.TransportMode, shipAddressDic); IList<TransportOrderDetail> transportOrderDetailList = PrepareTransportOrderDetail(orderNo, transportOrderMaster.TransportMode, transportOrderMaster.MultiSitePick, ipNoList, transportOrderRouteList); if (transportOrderRouteList == null || transportOrderRouteList.Count < 2) { throw new BusinessException("运输站点不能小于2个。"); } else { transportOrderMaster.ShipFrom = transportOrderRouteList.First().ShipAddress; transportOrderMaster.ShipFromAddress = transportOrderRouteList.First().ShipAddressDescription; transportOrderMaster.ShipTo = transportOrderRouteList.Last().ShipAddress; transportOrderMaster.ShipToAddress = transportOrderRouteList.Last().ShipAddressDescription; } #endregion #region 创建运单 this.genericMgr.Create(transportOrderMaster); foreach (TransportOrderRoute transportOrderRoute in transportOrderRouteList) { this.genericMgr.Create(transportOrderRoute); } transportOrderMaster.TransportOrderRouteList = transportOrderRouteList; foreach (TransportOrderDetail transportOrderDetail in transportOrderDetailList) { TransportOrderRoute transportOrderRouteFrom = transportOrderRouteList.Where(r => r.ShipAddress == transportOrderDetail.ShipFrom).OrderBy(r => r.Sequence).First(); transportOrderDetail.OrderRouteFrom = transportOrderRouteFrom.Id; transportOrderDetail.OrderRouteTo = transportOrderRouteList.Where(r => r.ShipAddress == transportOrderDetail.ShipTo && r.Sequence > transportOrderRouteFrom.Sequence).OrderBy(r => r.Sequence).First().Id; this.genericMgr.Create(transportOrderDetail); } transportOrderMaster.TransportOrderDetailList = transportOrderDetailList; #endregion if (transportOrderMaster.IsAutoRelease) { ReleaseTransportOrderMaster(transportOrderMaster); } return orderNo; }