Example #1
0
        private IList<TransportOrderRoute> PrepareTransportOrderRoute(string orderNo, TransportMode transportMode, IDictionary<int, string> shipAddressDic)
        {
            IList<TransportOrderRoute> transportOrderRouteList = new List<TransportOrderRoute>();
            TransportOrderRoute prevTransportOrderRoute = null;
            IList<Address> addressList = null;

            if (shipAddressDic != null && shipAddressDic.Count > 0)
            {
                StringBuilder selectHql = null;
                IList<object> parms = new List<object>();
                foreach (var shipAddress in shipAddressDic)
                {
                    if (selectHql == null)
                    {
                        selectHql = new StringBuilder("from Address where Code in (?");
                    }
                    else
                    {
                        selectHql.Append(", ?");
                    }

                    parms.Add(shipAddress.Value);
                }
                selectHql.Append(")");
                addressList = genericMgr.FindAll<Address>(selectHql.ToString(), parms.ToArray());
            }

            foreach (var shipAddress in shipAddressDic.OrderBy(s => s.Key))
            {
                Address address = addressList.Where(a => a.Code == shipAddress.Value).SingleOrDefault();
                if (address == null)
                {
                    throw new BusinessException("站点{0}不存在。", shipAddress.Value);
                }

                TransportOrderRoute transportOrderRoute = new TransportOrderRoute();
                transportOrderRoute.OrderNo = orderNo;
                transportOrderRoute.Sequence = shipAddress.Key;
                transportOrderRoute.ShipAddress = address.Code;
                transportOrderRoute.ShipAddressDescription = address.CodeAddressContent;
                transportOrderRoute.Distance = prevTransportOrderRoute != null ?
                    CalculateShipDistance(prevTransportOrderRoute.ShipAddress, transportOrderRoute.ShipAddress, transportMode)
                    : 0;
                transportOrderRouteList.Add(transportOrderRoute);

                prevTransportOrderRoute = transportOrderRoute;
            }

            return transportOrderRouteList;
        }
Example #2
0
        public void AddTransportOrderRoute(string orderNo, int seq, string shipAddress)
        {
            if (string.IsNullOrWhiteSpace(orderNo))
            {
                throw new TechnicalException("运输单号不能为空。");
            }

            if (seq <= 0)
            {
                throw new TechnicalException("序号不能小于等于0。");
            }

            if (string.IsNullOrWhiteSpace(shipAddress))
            {
                throw new TechnicalException("站点不能为空。");
            }

            TransportOrderMaster transportOrderMaster = this.genericMgr.FindAll<TransportOrderMaster>("from TransportOrderMaster where OrderNo = ?", orderNo).SingleOrDefault();
            if (transportOrderMaster == null)
            {
                throw new BusinessException("运输单号{0}不存在。", orderNo);
            }

            if (transportOrderMaster.Status == TransportStatus.Close)
            {
                throw new BusinessException("运输单号{0}已经关闭,不能添加站点。", orderNo);
            }

            if (transportOrderMaster.Status == TransportStatus.Cancel)
            {
                throw new BusinessException("运输单号{0}已经取消,不能添加站点。", orderNo);
            }

            Address shipAddressInstance = genericMgr.FindAll<Address>("from Address where Code = ?", shipAddress).SingleOrDefault();

            if (shipAddressInstance == null)
            {
                throw new BusinessException("站点{0}不存在。", shipAddress);
            }

            if (!transportOrderMaster.MultiSitePick && seq == 1)
            {
                throw new BusinessException("不能改变运输单{0}的始发站点。", orderNo);
            }

            IList<TransportOrderRoute> transportOrderRouteList = genericMgr.FindAll<TransportOrderRoute>("from TransportOrderRoute where OrderNo = ? ", orderNo);

            var prevTransportOrderRoute = transportOrderRouteList.Where(r => r.Sequence < seq).SingleOrDefault();
            var nextTransportOrderRouteList = transportOrderRouteList.Where(r => r.Sequence >= seq);

            TransportOrderRoute transportOrderRoute = new TransportOrderRoute();
            transportOrderRoute.OrderNo = orderNo;
            transportOrderRoute.Sequence = nextTransportOrderRouteList.Count() > 0 ? seq : prevTransportOrderRoute.Sequence + 1;
            transportOrderRoute.ShipAddress = shipAddress;
            transportOrderRoute.ShipAddressDescription = shipAddressInstance.AddressContent;
            transportOrderRoute.Distance = prevTransportOrderRoute != null ?
                CalculateShipDistance(prevTransportOrderRoute.ShipAddress, transportOrderRoute.ShipAddress, transportOrderMaster.TransportMode)
                : 0;

            this.genericMgr.Create(transportOrderRoute);

            for (int i = 0; i < nextTransportOrderRouteList.Count(); i++)
            {
                TransportOrderRoute nextTransportOrderRoute = nextTransportOrderRouteList.ElementAt(i);
                nextTransportOrderRoute.Sequence++;
                if (i == 0)
                {
                    nextTransportOrderRoute.Distance = CalculateShipDistance(transportOrderRoute.ShipAddress, nextTransportOrderRoute.ShipAddress, transportOrderMaster.TransportMode);
                }

                this.genericMgr.Update(nextTransportOrderRoute);
            }
        }