hutongqing
2024-12-24 a9b3ce04ed59794b648db00bc85001a4fb96c932
分拣接口、货位分配及移库任务完成
已删除3个文件
已修改20个文件
已添加6个文件
489 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/671f6735-50dc-4160-a801-1403c5554dc0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6dfb708c-1dce-481d-8fd0-9391b26c11ff.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/APIEnum/APIEnum.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3391ef1a-b377-4e97-8ef2-e56d3ee99c44.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/52d14652-9578-4d37-be69-82ece695e359.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/9a102d22-50b2-4a33-9ca7-fb3c6c8dea03.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b0fe0eb0-0200-46f6-a7cd-e7eceefa6c9f.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/cf601b15-8665-4e91-bf55-55e9b66ed6a7.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/fc937dfc-f65e-4bef-aaa4-717ebb3be43e.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_BC.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_CSJ.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_GM.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_PP.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_ZH.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/CommonEnum/PalletTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/ILocationInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IRecordService/IStockQuantityChangeRecordService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService_Pick.cs 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/StockQuantityChangeRecordService.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutStockLockInfoController.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/671f6735-50dc-4160-a801-1403c5554dc0.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6dfb708c-1dce-481d-8fd0-9391b26c11ff.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -12,6 +12,10 @@
        [Description("AGV发送任务接口")]
        AgvSendTask,
        [Description("AGV安全信号回复")]
        AgvSecureReply
        AgvSecureReply,
        FeedBackWMSTaskCompleted,
        UploadWMSTaskStatus
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -87,8 +87,6 @@
        }
        /// <summary>
        /// æŽ¥æ”¶WMS任务信息
        /// </summary>
@@ -112,23 +110,40 @@
                    task.Creater = "WMS";
                    task.TaskState = (int)TaskStatusEnum.New;
                    task.CurrentAddress = item.SourceAddress;
                    task.NextAddress = item.TargetAddress;
                    List<Dt_WarehouseDevice> wades = warehouseDevices.Where(x => x.WarehouseId == item.WarehouseId).ToList();
                    Dt_Router? router = new Dt_Router();
                    if (string.IsNullOrEmpty(item.AGVArea))
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == item.SourceAddress || x.StackerCraneCode == item.RoadWay);
                        //stationManger.AGVStationCode
                        //stationManger.StackerCraneCode
                        //stationManger.StationDeviceCode
                        if (stationManger == null)
                        {
                            return WebResponseContent.Instance.Error($"未找到站台配置信息");
                        }
                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == item.TaskType && (stationManger.StationDeviceCode == x.StartPosi || stationManger.StackerCraneCode == x.StartPosi));
                        if (routers.FirstOrDefault() == null)
                        {
                            return WebResponseContent.Instance.Error($"未找到路由配置信息");
                        }
                        router = routers.FirstOrDefault();
                        if (routers.Count == 1)
                        {
                            task.NextAddress = router?.NextPosi ?? "";
                        }
                    }
                    else
                    {
                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == item.TaskType && item.AGVArea == x.StartPosi);
                        if (routers.FirstOrDefault() == null)
                        {
                            return WebResponseContent.Instance.Error($"未找到路由配置信息");
                        }
                        router = routers.FirstOrDefault();
                        task.NextAddress = router?.NextPosi ?? "";
                    }
                    tasks.Add(task);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3391ef1a-b377-4e97-8ef2-e56d3ee99c44.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/52d14652-9578-4d37-be69-82ece695e359.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/9a102d22-50b2-4a33-9ca7-fb3c6c8dea03.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b0fe0eb0-0200-46f6-a7cd-e7eceefa6c9f.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/cf601b15-8665-4e91-bf55-55e9b66ed6a7.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/fc937dfc-f65e-4bef-aaa4-717ebb3be43e.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_BC.cs
@@ -87,7 +87,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_BC(locationInfos, undefinedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_BC.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
@@ -101,7 +100,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_BC(locationInfos, definedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_BC.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_CSJ.cs
@@ -24,21 +24,21 @@
        /// <summary>
        /// æµ‹è¯•架仓货位分配 <br/>
        /// æ‰˜ç›˜ç±»åž‹ï¼š <br/>
        /// 1:最长 <br/>
        /// 2:长 <br/>
        /// 3:中等 <br/>
        /// 4:短 <br/>
        /// 3和4都是3深,且可以混放。 <br/>
        /// 1和2都是2深,且可以混放。 <br/>
        /// 1:短 <br/>
        /// 2:中等 <br/>
        /// 3:长 <br/>
        /// 4:特长 <br/>
        /// 1和2都是3深,且可以混放。 <br/>
        /// 3和4都是2深,且可以混放。 <br/>
        /// ç§»åº“时只能是同侧货位。
        /// </summary>
        /// <param name="roadwayNo">巷道号</param>
        /// <param name="palletType">
        /// æ‰˜ç›˜ç±»åž‹ <br/>
        /// 1:最长 <br/>
        /// 2:长 <br/>
        /// 3:中等 <br/>
        /// 4:短
        /// 1:短 <br/>
        /// 2:中等 <br/>
        /// 3:长 <br/>
        /// 4:特长
        /// </param>
        /// <returns></returns>
        public Dt_LocationInfo? AssignLocation_CSJ(string roadwayNo, PalletTypeEnum palletType, string beRelocationCode = "")
@@ -99,7 +99,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_CSJ(locationInfos, undefinedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_CSJ.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
@@ -113,7 +112,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_CSJ(locationInfos, definedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_CSJ.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_GM.cs
@@ -87,7 +87,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_GM(locationInfos, undefinedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_GM.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
@@ -101,7 +100,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_GM(locationInfos, definedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_GM.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_PP.cs
@@ -87,7 +87,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_PP(locationInfos, undefinedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_PP.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
@@ -101,7 +100,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_PP(locationInfos, definedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_PP.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_ZH.cs
@@ -87,7 +87,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_ZH(locationInfos, undefinedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_ZH.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
@@ -101,7 +100,6 @@
                        Dt_LocationInfo? locationInfo = GetUsableLocation_ZH(locationInfos, definedTypeEmptyLocation, palletType);
                        if (locationInfo != null)
                        {
                            UpdateLocationStatus(locationInfo, palletType, LocationStatusEnum.Lock, 3);
                            locationCaches_ZH.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now });
                            return locationInfo;
                        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs
@@ -45,27 +45,27 @@
            };
        }
        public bool LittleDepthLocationIsEmpty(Dt_LocationInfo locationInfo, PalletTypeEnum palletType)
        {
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == locationInfo.WarehouseId);
            if (warehouse == null)
            {
                throw new Exception($"未找到仓库信息");
            }
        //public bool LittleDepthLocationIsEmpty(Dt_LocationInfo locationInfo, PalletTypeEnum palletType)
        //{
        //    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == locationInfo.WarehouseId);
        //    if (warehouse == null)
        //    {
        //        throw new Exception($"未找到仓库信息");
        //    }
            return warehouse.WarehouseName switch
            {
                "板材仓" => false,
                "PP仓" => false,
                "干膜仓" => false,
                "测试架仓" => LittleDepthLocationIsEmpty_CSJ(locationInfo, palletType),
                "阻焊仓" => false,
                "油墨仓" => true,
                "成品仓" => true,
                "辅料仓" => true,
                _ => throw new Exception($"未找到仓库货位分配方法")
            };
        }
        //    return warehouse.WarehouseName switch
        //    {
        //        "板材仓" => false,
        //        "PP仓" => false,
        //        "干膜仓" => false,
        //        "测试架仓" => LittleDepthLocationIsEmpty_CSJ(locationInfo, palletType),
        //        "阻焊仓" => false,
        //        "油墨仓" => true,
        //        "成品仓" => true,
        //        "辅料仓" => true,
        //        _ => throw new Exception($"未找到仓库货位分配方法")
        //    };
        //}
        private readonly static object _locker = new object();
        private static List<LocationCache> locationCaches = new List<LocationCache>();
@@ -132,8 +132,40 @@
            {
                for (int i = 0; i < locations.Count; i++)
                {
                    locations[i].LocationStatus = locationStatus.ObjToInt();
                    locations[i].LocationType = palletType.ObjToInt();
                    if (locations[i].LocationType != palletType.ObjToInt())
                    {
                        locations[i].LocationType = palletType.ObjToInt();
                    }
                    if (locations[i].LocationCode == location.LocationCode)
                    {
                        locations[i].LocationStatus = locationStatus.ObjToInt();
                    }
                    else
                    {
                        if (locationStatus == LocationStatusEnum.Lock)
                        {
                            if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
                            }
                            else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
                            }
                        }
                        else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
                        {
                            if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                            }
                            else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
                            }
                        }
                    }
                }
                Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
@@ -142,11 +174,44 @@
                    List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
                    for (int i = 0; i < nearLocations.Count; i++)
                    {
                        nearLocations[i].LocationType = palletType.ObjToInt();
                        if (palletType == PalletTypeEnum.LargePallet)
                        if (nearLocations[i].LocationType != palletType.ObjToInt())
                        {
                            nearLocations[i].LocationStatus = locationStatus.ObjToInt();
                            nearLocations[i].LocationType = palletType.ObjToInt();
                        }
                        if (palletType.ObjToInt() >= PalletTypeEnum.LargePallet.ObjToInt())
                        {
                            if (nearLocations[i].LocationCode == nearLocation.LocationCode)
                            {
                                nearLocations[i].LocationStatus = locationStatus.ObjToInt();
                            }
                            else
                            {
                                if (locationStatus == LocationStatusEnum.Lock)
                                {
                                    if (nearLocations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
                                    }
                                    else if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
                                    }
                                }
                                else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
                                {
                                    if (nearLocations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                                    }
                                    else if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
                                    }
                                }
                            }
                        }
                    }
                    locations.AddRange(nearLocations);
                }
@@ -155,13 +220,46 @@
            {
                for (int i = 0; i < locations.Count; i++)
                {
                    locations[i].LocationStatus = locationStatus.ObjToInt();
                    locations[i].LocationType = palletType.ObjToInt();
                    if (locations[i].LocationCode == location.LocationCode)
                    {
                        locations[i].LocationStatus = locationStatus.ObjToInt();
                    }
                    else
                    {
                        if (locationStatus == LocationStatusEnum.Lock)
                        {
                            if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
                            }
                            else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
                            }
                        }
                        else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
                        {
                            if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                            }
                            else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
                            {
                                locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
                            }
                        }
                    }
                    if (locations[i].LocationType != palletType.ObjToInt())
                    {
                        locations[i].LocationType = palletType.ObjToInt();
                    }
                }
            }
            Repository.UpdateData(locations);
        }
        /// <summary>
        /// èŽ·å–ä¸åŒæ·±åº¦çš„åŒç»„è´§ä½ä¿¡æ¯
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/CommonEnum/PalletTypeEnum.cs
@@ -8,15 +8,17 @@
{
    public enum PalletTypeEnum
    {
        None = 0,
        /// <summary>
        /// å°æ‰˜ç›˜
        /// </summary>
        SmallPallet = 1,
        SmallPallet = 1,
        /// <summary>
        /// ä¸­æ‰˜ç›˜
        /// </summary>
        MediumPallet = 2,
        MediumPallet = 2,
        /// <summary>
        /// å¤§æ‰˜ç›˜
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs
@@ -24,6 +24,18 @@
        Lock = 1,
        /// <summary>
        /// æœ‰è´§é”å®š
        /// </summary>
        [Description("有货锁定")]
        InStockLock = 10,
        /// <summary>
        ///
        /// </summary>
        [Description("空闲锁定")]
        FreeLock = 20,
        /// <summary>
        /// æœ‰è´§
        /// </summary>
        [Description("有货")]
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/ILocationInfoService.cs
@@ -89,6 +89,6 @@
        /// <param name="locationInfo">货位信息</param>
        /// <param name="palletType">托盘类型</param>
        /// <returns></returns>
        bool LittleDepthLocationIsEmpty(Dt_LocationInfo locationInfo, PalletTypeEnum palletType);
        //bool LittleDepthLocationIsEmpty(Dt_LocationInfo locationInfo, PalletTypeEnum palletType);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs
@@ -22,5 +22,12 @@
        List<Dt_OutStockLockInfo> GetByOrderDetailId(int orderDetailId, OutLockStockStatusEnum outStockStatus);
        List<Dt_OutStockLockInfo> GetStockOutboundOrder(SaveModel saveModel);
        /// <summary>
        /// åˆ†æ‹£
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <returns></returns>
        WebResponseContent MaterialPick(string palletCode);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IRecordService/IStockQuantityChangeRecordService.cs
@@ -16,5 +16,7 @@
        IStockQuantityChangeRecordRepository Repository { get; }
        void AddStockChangeRecord(Dt_StockInfo stockInfo, List<Dt_StockInfoDetail> stockInfoDetails, float beforeQuantity, float totalQuantity, StockChangeTypeEnum changeType, int? taskNum = null);
        void AddStockChangeRecord(Dt_StockInfo stockInfo, List<Dt_StockInfoDetail> updateDetails, List<Dt_StockInfoDetail> deleteDetails, StockChangeTypeEnum changeType, int? taskNum = null);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -9,16 +9,25 @@
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_IOutboundRepository;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public partial class OutStockLockInfoService : ServiceBase<Dt_OutStockLockInfo, IOutStockLockInfoRepository>, IOutStockLockInfoService
    {
        private readonly IStockService _stockService;
        private readonly IRecordService _recordService;
        public IOutStockLockInfoRepository Repository => BaseDal;
        public OutStockLockInfoService(IOutStockLockInfoRepository BaseDal) : base(BaseDal)
        public OutStockLockInfoService(IOutStockLockInfoRepository BaseDal, IStockService stockService, IRecordService recordService) : base(BaseDal)
        {
            _recordService = recordService;
            _stockService = stockService;
        }
        public List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, List<Dt_StockInfo> outStocks, int? taskNum = null)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService_Pick.cs
@@ -9,15 +9,20 @@
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_IOutboundRepository;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public partial class OutStockLockInfoService : ServiceBase<Dt_OutStockLockInfo, IOutStockLockInfoRepository>, IOutStockLockInfoService
    public partial class OutStockLockInfoService
    {
        IStockService _stockService;
        /// <summary>
        /// åˆ†æ‹£
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <returns></returns>
        public WebResponseContent MaterialPick(string palletCode)
        {
            try
@@ -27,16 +32,50 @@
                {
                    return WebResponseContent.Instance.Error($"未找到该托盘库存信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该托盘还未出库完成");
                }
                List<Dt_OutStockLockInfo> outStockLockInfos = Repository.QueryData(x => x.PalletCode == palletCode);
                for (int i = 0; i < outStockLockInfos.Count; i++)
                {
                    float assignQuantity = outStockLockInfos[i].AssignQuantity;
                    List<Dt_StockInfoDetail> stockInfoDetails = stockInfo.Details.Where(x => x.MaterielCode == outStockLockInfos[i].MaterielCode).ToList();
                    for (int j = 0; j < stockInfoDetails.Count; j++)
                    outStockLockInfos[i].Status = OutLockStockStatusEnum.出库完成.ObjToInt();
                }
                List<Dt_StockInfoDetail> beforeDetaile = stockInfo.Details.GroupBy(x => x.MaterielCode).Select(x => new Dt_StockInfoDetail { MaterielCode = x.Key, StockQuantity = x.Sum(v => v.StockQuantity) }).ToList();
                List<Dt_StockInfoDetail> updateDetailList = new List<Dt_StockInfoDetail>();
                List<Dt_StockInfoDetail> deleteDetailList = new List<Dt_StockInfoDetail>();
                for (int i = 0; i < stockInfo.Details.Count; i++)
                {
                    if (stockInfo.Details[i].OutboundQuantity > 0)
                    {
                       // if(assignQuantity > stockInfoDetails[j])
                        if (stockInfo.Details[i].StockQuantity > stockInfo.Details[i].OutboundQuantity)
                        {
                            stockInfo.Details[i].StockQuantity -= stockInfo.Details[i].OutboundQuantity;
                            updateDetailList.Add(stockInfo.Details[i]);
                        }
                        else
                        {
                            deleteDetailList.Add(stockInfo.Details[i]);
                        }
                    }
                }
                List<string> mCodes = stockInfo.Details.GroupBy(x => x.MaterielCode).Select(x => x.Key).ToList();
                foreach (string code in mCodes)
                {
                    _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, updateDetailList, deleteDetailList, StockChangeTypeEnum.Outbound);
                }
                updateDetailList.ForEach(x =>
                {
                    x.OutboundQuantity = 0;
                });
                //_stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(deleteDetailList, OperateTypeEnum.自动完成);
                _stockService.StockInfoDetailService.Repository.UpdateData(updateDetailList);
                BaseDal.UpdateData(outStockLockInfos);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/StockQuantityChangeRecordService.cs
@@ -44,6 +44,7 @@
                    x.ChangeType = changeType.ObjToInt();
                    beforeQuantity += x.ChangeQuantity;
                    x.TaskNum = taskNum;
                    index++;
                });
                BaseDal.AddData(stockQuantityChangeRecords);
            }
@@ -52,5 +53,42 @@
                throw new Exception(ex.Message);
            }
        }
        public void AddStockChangeRecord(Dt_StockInfo stockInfo, List<Dt_StockInfoDetail> updateDetails, List<Dt_StockInfoDetail> deleteDetails, StockChangeTypeEnum changeType, int? taskNum = null)
        {
            try
            {
                List<Dt_StockQuantityChangeRecord> stockQuantityChangeRecords = new List<Dt_StockQuantityChangeRecord>();
                int index1 = 0;
                List<Dt_StockQuantityChangeRecord> records1 = _mapper.Map<List<Dt_StockQuantityChangeRecord>>(updateDetails);
                records1.ForEach(x =>
                {
                    x.PalleCode = stockInfo.PalletCode;
                    x.BeforeQuantity = deleteDetails[index1].StockQuantity + deleteDetails[index1].OutboundQuantity;
                    x.ChangeQuantity = -deleteDetails[index1].OutboundQuantity;
                    x.AfterQuantity = deleteDetails[index1].StockQuantity;
                    index1++;
                });
                stockQuantityChangeRecords.AddRange(records1);
                int index2 = 0;
                List<Dt_StockQuantityChangeRecord> records2 = _mapper.Map<List<Dt_StockQuantityChangeRecord>>(deleteDetails);
                records2.ForEach(x =>
                {
                    x.PalleCode = stockInfo.PalletCode;
                    x.BeforeQuantity = deleteDetails[index2].StockQuantity;
                    x.ChangeQuantity = -deleteDetails[index2].StockQuantity;
                    x.AfterQuantity = 0;
                    index2++;
                });
                stockQuantityChangeRecords.AddRange(records2);
                BaseDal.AddData(stockQuantityChangeRecords);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -92,7 +92,7 @@
        /// ä»»åŠ¡ä¿¡æ¯æŽ¨é€è‡³WCS
        /// </summary>
        /// <returns></returns>
        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription="")
        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription = "")
        {
            try
            {
@@ -179,7 +179,7 @@
                _unitOfWorkManage.BeginTran();
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                _basicService.LocationInfoService.Repository.UpdateData(locationInfo);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
@@ -252,7 +252,7 @@
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _basicService.LocationInfoService.Repository.UpdateData(locationInfo);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationChangeType.OutboundCompleted, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        //public WebResponseContent TaskCompleted(int taskNum)
        //{
        //    try
        //    {
        //        Dt_Task task = Repository.QueryFirst(x => x.TaskNum == taskNum);
        //        if (task == null)
        //        {
        //            return WebResponseContent.Instance.Error($"未找到任务信息");
        //        }
        //        if(task.TaskType.get)
        //    }
        //    catch (Exception ex)
        //    {
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -17,6 +17,12 @@
{
    public partial class TaskService
    {
        /// <summary>
        /// åˆ¤æ–­æ˜¯å¦éœ€è¦ç§»åº“
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="locationCode"></param>
        /// <returns></returns>
        public WebResponseContent IsRelocation(int taskNum, string locationCode)
        {
            try
@@ -32,19 +38,29 @@
                    return WebResponseContent.Instance.Error($"未找到任务信息");
                }
                if (!_basicService.LocationInfoService.LittleDepthLocationIsEmpty(locationInfo, (PalletTypeEnum)task.PalletType))
                List<Dt_LocationInfo> littleDepthLocations = _basicService.LocationInfoService.GetGroupLocations(locationInfo);
                Dt_LocationInfo? needRelocationItem = littleDepthLocations.Where(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.LocationStatus != LocationStatusEnum.PalletLock.ObjToInt() && x.LocationStatus != LocationStatusEnum.FreeLock.ObjToInt() && x.Depth < locationInfo.Depth).OrderBy(x => x.Depth).FirstOrDefault();
                if (needRelocationItem == null)
                {
                    return WebResponseContent.Instance.OK(data: _mapper.Map<WMSTaskDTO>(task));
                }
                else
                {
                    Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == locationCode);
                    Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == needRelocationItem.LocationCode);
                    if (stockInfo == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
                    }
                    Dt_LocationInfo? newLocation = _basicService.LocationInfoService.AssignLocation(task.Roadway, (PalletTypeEnum)task.PalletType, task.WarehouseId);
                    Dt_Task taskTemp = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                    if (taskTemp != null)
                    {
                        return WebResponseContent.Instance.OK(data: taskTemp);
                    }
                    Dt_LocationInfo? newLocation = _basicService.LocationInfoService.AssignLocation(needRelocationItem.RoadwayNo, (PalletTypeEnum)task.PalletType, task.WarehouseId);
                    if (newLocation != null)
                    {
                        Dt_Task newTask = new Dt_Task()
@@ -57,7 +73,7 @@
                            OrderNo = "",
                            PalletCode = stockInfo.PalletCode,
                            PalletType = stockInfo.PalletType,
                            SourceAddress = locationCode,
                            SourceAddress = needRelocationItem.LocationCode,
                            TargetAddress = newLocation.LocationCode,
                            TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            TaskStatus = 0,
@@ -68,20 +84,18 @@
                        Repository.AddData(newTask);
                        {
                            LocationStatusEnum lastStatus = (LocationStatusEnum)newLocation.LocationStatus;
                            newLocation.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
                            _basicService.LocationInfoService.UpdateLocationStatus(newLocation, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(newLocation, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                        }
                        {
                            LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                            locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
                            _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                            LocationStatusEnum lastStatus = (LocationStatusEnum)needRelocationItem.LocationStatus;
                            _basicService.LocationInfoService.UpdateLocationStatus(needRelocationItem, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(needRelocationItem, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                        }
                        stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                        _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                        _unitOfWorkManage.RollbackTran();
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK(data: _mapper.Map<WMSTaskDTO>(newTask));
                    }
@@ -93,6 +107,45 @@
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent RelocationTaskCompleted(Dt_Task task)
        {
            try
            {
                Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
                }
                Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (locationInfoStart == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
                }
                Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                if (locationInfoEnd == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                }
                _unitOfWorkManage.BeginTran();
                stockInfo.LocationCode = locationInfoEnd.LocationCode;
                _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs
@@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_Core.Enums;
@@ -68,5 +69,19 @@
        {
            return Service.LocationDisableStatus(keys); ;
        }
        [HttpPost, Route("UpdateLocationStatus"), AllowAnonymous]
        public WebResponseContent UpdateLocationStatus(string locationCode, PalletTypeEnum palletType, LocationStatusEnum locationStatus, int warehousId)
        {
            try
            {
                Service.UpdateLocationStatus(locationCode, palletType, locationStatus, warehousId);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception e)
            {
                return WebResponseContent.Instance.Error(e.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutStockLockInfoController.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
@@ -25,5 +26,11 @@
        {
            return Service.GetStockOutboundOrder(saveModel);
        }
        [HttpPost, HttpGet, Route("MaterialPick"), AllowAnonymous]
        public WebResponseContent MaterialPick(string palletCode)
        {
            return Service.MaterialPick(palletCode);
        }
    }
}