ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -141,6 +141,7 @@
                {
                    return content.Error($"未找到可分配巷道");
                }
                //生成任务
                Dt_Task newTask = new Dt_Task()
                {
                    CurrentAddress = stationCode,
@@ -154,6 +155,7 @@
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType,
                    TaskLength = (int)stockInfo.MaterielWide
                };
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
@@ -277,28 +279,34 @@
                }
                string roadwayNo = "";
                //限制直径
                if (stockInfo.MaterielThickness > 800)
                if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
                {
                    //获取分配
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    if (stockInfo.MaterielWide > 2200)
                    //限制直径
                    if (stockInfo.MaterielThickness <= 1250)
                    {
                        locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo=="SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
                    }
                    List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                    && locationCounts.Select(j => j.RoadwayNo).Contains(x.Roadway)
                    && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                    foreach (var item in locationCounts)
                    {
                        LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                        if (count != null)
                        {
                            item.Count -= count.Count;
                        }
                    }
                    roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                else
                {
                    //限制直径
                    if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1450)
                    {
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        if (stockInfo.MaterielWide > 2200)
                        {
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo == "SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        }
                        roadwayNo = HandleRoadway(locationCounts, warehouse);
                    }
                }
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
            catch (Exception ex)
@@ -306,6 +314,23 @@
                _unitOfWorkManage.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        //处理分配巷道 ä»»åŠ¡æ•°é‡
        public string HandleRoadway(List<LocationCount> locationCounts, Dt_Warehouse warehouse)
        {
            //巷道任务分配数量
            List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
            && locationCounts.Select(j => j.RoadwayNo).Distinct().Contains(x.Roadway)
            && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
            foreach (var item in locationCounts)
            {
                LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                if (count != null)
                {
                    item.Count -= count.Count;
                }
            }
            return locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
        }
        /// <summary>
        /// å…¥åº“完成
@@ -316,7 +341,7 @@
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString() || warehouse.WarehouseCode == WarehouseEnum.LLDFL.ToString()) //成品/辅料完成
                {
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
@@ -396,21 +421,23 @@
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    //if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt())
                    //{
                    //    int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                    //    BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
                    //    {
                    //        Barcode = stockInfo.PalletCode,
                    //        BarcodeQty = Qty,
                    //        Rfid = stockInfo.PalletCode
                    //    };
                    //    BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
                    //    if (bSTResponse.Code==500)
                    //    {
                    //        throw new Exception($"BST一期ERP同步入库信息失败,错误信息{bSTResponse.Msg}");
                    //    }
                    //}
                    //上报老厂ERP
                    if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt())
                    {
                        int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                        BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
                        {
                            Barcode = stockInfo.PalletCode,
                            BarcodeQty = Qty,
                            Rfid = stockInfo.PalletCode,
                            RfidUpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                        };
                        BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
                        if (bSTResponse.Code == 500)
                        {
                            throw new Exception($"BST一期ERP同步入库信息失败,错误信息:{bSTResponse.Msg}");
                        }
                    }
                    _unitOfWorkManage.CommitTran();
                }
                return content.OK();
@@ -430,16 +457,11 @@
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == 2);
                if (warehouse == null)
                {
                    throw new Exception($"未找到巷道对应仓库信息");
                }
                string roadwayNo = "";
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                //获取巷道可分配的货位数量
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                //筛选当前入库任务中已分配巷道任务数量
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => (x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt()|| x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt())
                && locationCounts.Select(j=>j.RoadwayNo).Contains(x.Roadway)
                && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                foreach (var item in locationCounts)
@@ -450,6 +472,7 @@
                        item.Count -= count.Count;
                    }
                }
                //通过可用货位数量排序,最多的优先分配
                roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
@@ -498,7 +521,6 @@
                    task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
                }
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                //更新锁定货位
                _unitOfWorkManage.BeginTran();
@@ -514,54 +536,7 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        public WebResponseContent AssignInboundTaskLocationByHeight(int taskNum, string roadwayNo, int heightType)
        {
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该入库任务");
                }
                if (_basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress) != null)
                {
                    return WebResponseContent.Instance.OK(data: task.TargetAddress);
                }
                Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId, heightType: heightType);
                if (locationInfo == null)
                {
                    return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
                }
                task.Roadway = roadwayNo;
                task.TargetAddress = locationInfo.LocationCode;
                task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
                BaseDal.UpdateData(task);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK(data: locationInfo.LocationCode);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// ç©ºæ¡†å›žåº“
        /// </summary>
@@ -600,15 +575,13 @@
                //分配巷道
                string roadWay=AssignCPRoadwayNo();
                
                //获取成品库
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.LLDCP.ToString());
                Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                {
                    PalletCode=barCode,
                    ProStockAttribute=ProStockAttributeEnum.空托.ObjToInt(),
                    PalletType=1,
                    LocationCode="",
                    WarehouseId=warehouse.WarehouseId,
                    WarehouseId= WarehouseEnum.LLDFL.ObjToInt(),
                    StockStatus=StockStatusEmun.MES空托退库.ObjToInt()
                }; 
@@ -623,7 +596,7 @@
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.EmptyProductBack.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId,
                    WarehouseId = WarehouseEnum.LLDFL.ObjToInt(),
                    PalletType = 1
                };
                _unitOfWorkManage.BeginTran();
@@ -644,7 +617,7 @@
        }
        private readonly static object _lockerFLorCP = new object();
        /// <summary>
        /// è¾…料成品入库
        /// è¾…æ–™/成品临时入库
        /// </summary>
        /// <returns></returns>
        public WebResponseContent InboundFLOrCPTask(string barCode, string startPoint,string matCode,int matCount)
@@ -660,7 +633,8 @@
                    //{
                    //    return content.Error($"框码格式错误{barCode}");
                    //}
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt());
                    //获取物料
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && (x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt() || x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()));
                    if (materielInfo == null)
                    {
                        return content.Error($"未找到物料信息{matCode}");
@@ -690,7 +664,7 @@
                    string roadWay = AssignCPRoadwayNo();
                    //获取成品库
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.LLDCP.ToString());
                    WarehouseEnum warehouseEnum = materielInfo.MaterielSourceType == MaterielTypeEnum.成品.ObjToInt() ? WarehouseEnum.LLDCP : WarehouseEnum.LLDFL;
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = materielInfo.MaterielCode,
@@ -706,7 +680,7 @@
                        ProStockAttribute = materielInfo.MaterielSourceType,
                        PalletType = 1,
                        LocationCode = "",
                        WarehouseId = warehouse.WarehouseId,
                        WarehouseId = warehouseEnum.ObjToInt(),
                        StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(),
                        proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
                    };
@@ -722,7 +696,7 @@
                        TargetAddress = "",
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = warehouse.WarehouseId,
                        WarehouseId = warehouseEnum.ObjToInt(),
                        PalletType = 1
                    };
                    _unitOfWorkManage.BeginTran();