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;
        }