hutongqing
2025-01-13 34188c3cfee5194a6a0d49b75013407838d9d81a
板材仓
已删除5个文件
已修改24个文件
已添加2个文件
1044 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7304d95e-cf1e-4631-bf79-37f693467d29.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9322c121-b454-4586-9898-3e1db55e94db.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/b490258b-026c-4d98-a082-39d118a7d7ba.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/HostedService/WarehouseHostedService.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService_Operate.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/ConveyorLineJob_GM.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/StackerCraneJob_GM.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/ConveyorLineJob_BC.cs 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/RGVJob_BC.cs 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/StackerCraneJob_BC.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/测试架仓/StackerCraneJob_CSJ.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/2ad7410e-7b16-4692-8ca2-e7055946c8fa.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ddab6c09-d32a-4e10-9c68-7904d199b1b7.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_BC.cs 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/ILocationInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/AssignInboundTaskLocation_BC.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7304d95e-cf1e-4631-bf79-37f693467d29.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9322c121-b454-4586-9898-3e1db55e94db.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/b490258b-026c-4d98-a082-39d118a7d7ba.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -67,16 +67,22 @@
        ProductionReturn = 550,
        /// <summary>
        /// MES退料
        /// </summary>
        [Description("MES退料")]
        MesMatReturn = 560,
        /// <summary>
        /// çº¿è¾¹ä»“入库
        /// </summary>
        [Description("线边仓入库")]
        InboundXB = 560,
        InboundXB = 580,
        /// <summary>
        /// æœºå°å…¥åº“
        /// </summary>
        [Description("机台入库")]
        InboundJT = 570,
        InboundJT = 590,
        /// <summary>
        /// ç©ºç®±å…¥åº“
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -65,6 +65,21 @@
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress);
        /// <summary>
        ///
        /// </summary>
        /// <param name="palletCode"></param>
        /// <param name="sourceAddress"></param>
        /// <returns></returns>
        WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress);
        /// <summary>
        ///
        /// </summary>
        /// <param name="palletCode"></param>
        /// <param name="sourceAddress"></param>
        /// <param name="roadway"></param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway);
        /// <summary>
@@ -75,6 +90,20 @@
        /// <returns></returns>
        string? RequestAssignLocation(int taskNum, string roadwayNo);
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        string? RequestAssignLocationByHeight(int taskNum, string roadwayNo, int heightType);
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        WebResponseContent TaskCompleted(int taskNum);
        /// <summary>
@@ -173,7 +202,7 @@
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "");
        void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "");
        /// <summary>
        /// è¯·æ±‚分配巷道
@@ -187,6 +216,15 @@
        /// 
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <param name="taskNum"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        WebResponseContent RequestWMSAssignRoadway(List<string> roadwayNos, int taskNum, int heightType);
        /// <summary>
        ///
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <returns></returns>
        WebResponseContent RequestWMSAssignRoadway(List<string> roadwayNos);
    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -45,6 +45,15 @@
        [ExporterHeader(DisplayName = "任务号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务号")]
        public int TaskNum { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [ImporterHeader(Name = "仓库主键")]
        [ExporterHeader(DisplayName = "仓库主键")]
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId {  get; set; }
        /// <summary>
        /// AGV任务号
        /// </summary>
@@ -52,6 +61,7 @@
        [ExporterHeader(DisplayName = "AGV任务号")]
        [SugarColumn(IsNullable = true,Length =50, ColumnDescription = "AGV任务号")]
        public string AgvTaskNum { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç¼–号
        /// </summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/HostedService/WarehouseHostedService.cs
@@ -35,14 +35,18 @@
                    DbType = DbType.SqlServer
                });
                //List<Dt_Warehouse> warehouses = sugarClient.Queryable<Dt_Warehouse>().ToList();
                List<Dt_Warehouse> warehouses = sugarClient.Queryable<Dt_Warehouse>().ToList();
                //_dbContext.Db.Deleteable<Dt_Warehouse>().ExecuteCommand();
                _dbContext.Db.Deleteable<Dt_Warehouse>().ExecuteCommand();
                //_dbContext.Db.Insertable(warehouses).ExecuteCommand();
                _dbContext.Db.Insertable(warehouses).ExecuteCommand();
                List<Dt_ApiInfo> apiInfos = _dbContext.Db.Queryable<Dt_ApiInfo>().ToList();
                List<Dt_WarehouseDevice> warehouseDevices = _dbContext.Db.Queryable<Dt_WarehouseDevice>().ToList();
                _cacheService.AddOrUpdate(nameof(Dt_WarehouseDevice), warehouseDevices);
                _cacheService.AddOrUpdate(nameof(apiInfos), apiInfos);
            }
            catch (Exception ex)
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -146,21 +146,19 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_WarehouseDevice> warehouseDevices = Db.Queryable<Dt_WarehouseDevice>().ToList();
                bool flag = false;
                List<Dt_Task> tasks = new List<Dt_Task>();
                foreach (var item in taskDTOs)
                {
                    if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode) != null)
                    {
                        flag = true;
                        continue;
                    }
                    Dt_Task task = _mapper.Map<Dt_Task>(item);
                    task.Creater = "WMS";
                    task.TaskState = (int)TaskStatusEnum.New;
                    task.CurrentAddress = item.SourceAddress;
                    List<Dt_WarehouseDevice> wades = warehouseDevices.Where(x => x.WarehouseId == item.WarehouseId).ToList();
                    Dt_Router? router;
@@ -195,6 +193,11 @@
                                task.NextAddress = router.NextPosi;
                                task.DeviceCode = stationManger.StationDeviceCode;
                            }
                            else if (item.TaskType == TaskTypeEnum.MesMatReturn.ObjToInt() && !router.IsEnd)
                            {
                                task.NextAddress = router.NextPosi;
                                task.DeviceCode = router.ChildPosi;
                            }
                            else if (item.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                            {
                                task.NextAddress = router.NextPosi;
@@ -221,7 +224,7 @@
                            if (dt_Routers != null && dt_Routers.Count > 0)
                            {
                                task.NextAddress = dt_Routers.FirstOrDefault().NextPosi;
                                task.DeviceCode = dt_Routers.FirstOrDefault().ChildPosiDeviceCode;
                                task.DeviceCode = dt_Routers.FirstOrDefault().ChildPosi;
                            }
                            else
                            {
@@ -274,7 +277,7 @@
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务");
                content = tasks.Count > 0 ? WebResponseContent.Instance.OK("成功") : WebResponseContent.Instance.Error("失败");
                content = (flag || tasks.Count > 0) ? WebResponseContent.Instance.OK("成功") : WebResponseContent.Instance.Error("失败");
            }
            catch (Exception ex)
            {
@@ -323,6 +326,35 @@
            return content;
        }
        public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway)
        {
            WebResponseContent content = new WebResponseContent();
@@ -352,6 +384,12 @@
            return content;
        }
        /// <summary>
        /// åˆ†é…å··é“
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNos"></param>
        /// <returns></returns>
        public WebResponseContent RequestWMSAssignRoadway(int taskNum, List<string> roadwayNos)
        {
            WebResponseContent content = new WebResponseContent();
@@ -377,6 +415,43 @@
            return content;
        }
        /// <summary>
        /// åˆ†é…å··é“
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <param name="taskNum"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        public WebResponseContent RequestWMSAssignRoadway(List<string> roadwayNos, int taskNum, int heightType)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Post($"{address}/api/Task/AssignRoadway?taskNum={taskNum}&heightType={heightType}", roadwayNos.Serialize());
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    return responseContent;
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åˆ†é…å··é“
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <returns></returns>
        public WebResponseContent RequestWMSAssignRoadway(List<string> roadwayNos)
        {
            WebResponseContent content = new WebResponseContent();
@@ -424,6 +499,29 @@
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public string? RequestAssignLocationByHeight(int taskNum, string roadwayNo, int heightType)
        {
            string address = AppSettings.Get("WMSApiAddress");
            if (string.IsNullOrEmpty(address)) throw new Exception("未找到WMSApi地址");
            string responseStr = HttpHelper.Get($"{address}/api/Task/AssignInboundTaskLocationByHeight?taskNum={taskNum}&roadwayNo={roadwayNo}&heightType={heightType}");
            WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
            if (responseContent != null && responseContent.Status && responseContent.Data != null)
            {
                return responseContent.Data.ToString();
            }
            return "";
        }
        /// <summary>
        /// æ ¹æ®è®¾å¤‡ç¼–号、任务类型分组(可选)按照优先级以及创建时间排序查询任务池新增的任务
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService_Operate.cs
@@ -24,7 +24,7 @@
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        public void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "")
        public void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "")
        {
            StringBuilder stringBuilder = new StringBuilder(App.User?.UserId == 0 ? $"系统自动流程" : "人工手动流程");
            if (task.DeviceCode != deviceCode && !string.IsNullOrEmpty(deviceCode))
@@ -51,6 +51,11 @@
            {
                stringBuilder.Append($",下一位置由{task.NextAddress}变更为{nextAddress}");
                task.NextAddress = nextAddress;
            }
            if (task.Roadway != roadwayNo && !string.IsNullOrEmpty(roadwayNo))
            {
                stringBuilder.Append($",巷道号由{task.Roadway}变更为{roadwayNo}");
                task.Roadway = roadwayNo;
            }
            if (task.TaskState != taskStatus.ObjToInt())
            {
@@ -95,10 +100,8 @@
            string address = AppSettings.Get("WMSApiAddress");
            if (!string.IsNullOrEmpty(address))
            {
                //HttpHelper.Post($"{address}/api/Task/UpdateTaskInfo", task.Serialize());
                HttpHelper.Post($"{address}/api/Task/UpdateTaskInfo", task.Serialize());
            }
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineTaskCommand.cs
@@ -99,12 +99,12 @@
        /// <summary>
        /// é¢„ç•™
        /// </summary>
        public short Sapre1 { get; set; }
        public short Spare1 { get; set; }
        /// <summary>
        /// é¢„ç•™
        /// </summary>
        public short Sapre2 { get; set; }
        public short Spare2 { get; set; }
        /// <summary>
        /// äº¤äº’信号
@@ -213,12 +213,12 @@
        /// <summary>
        /// é¢„ç•™
        /// </summary>
        public short Sapre1 { get; set; }
        public short Spare1 { get; set; }
        /// <summary>
        /// é¢„ç•™
        /// </summary>
        public short Sapre2 { get; set; }
        public short Spare2 { get; set; }
        /// <summary>
        /// äº¤äº’信号
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/ConveyorLineJob_GM.cs
@@ -84,10 +84,10 @@
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && x.PalletCode == conveyorLineInfoRead.Barcode && x.DeviceCode == item.StationDeviceCode);
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && x.PalletCode == conveyorLineInfoRead.Barcode && x.DeviceCode == item.StationDeviceCode && x.TaskState == TaskStatusEnum.New.ObjToInt());
                                if (task != null)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: item.StackerCraneStationCode);
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: item.StackerCraneStationCode, deviceCode: task.Roadway, nextAddress: task.TargetAddress);
                                }
                                device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/StackerCraneJob_GM.cs
@@ -148,7 +148,7 @@
                        task.TaskState = TaskStatusEnum.Line_Execute.ObjToInt();
                        task.CurrentAddress = stationManger.StationCode;
                        _taskRepository.UpdateData(task);
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,,任务状态从【{oldStatus}】转到【{task.TaskState}】");
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,任务状态从【{oldStatus}】转到【{task.TaskState}】");
                        //todo å®Œæˆ
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup || task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
@@ -233,7 +233,7 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.WMSIsReloaction.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/ConveyorLineJob_BC.cs
@@ -1,4 +1,6 @@
using Quartz;
using Newtonsoft.Json;
using Quartz;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -9,6 +11,7 @@
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Caches;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
@@ -19,14 +22,16 @@
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class ConveyorLineJob_BC : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
@@ -34,9 +39,11 @@
        private readonly IRouterRepository _routerRepository;
        private readonly IRouterService _routerService;
        private readonly IRouterExtension _routerExtension;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        public ConveyorLineJob_BC(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
        public ConveyorLineJob_BC(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
@@ -44,6 +51,16 @@
            _routerRepository = routerRepository;
            _routerService = routerService;
            _routerExtension = routerExtension;
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
                warehouseDevices = JsonConvert.DeserializeObject<List<Dt_WarehouseDevice>>(warehouseDevicesStr) ?? new List<Dt_WarehouseDevice>();
            }
            else
            {
                warehouseDevices = new List<Dt_WarehouseDevice>();
            }
        }
        public Task Execute(IJobExecutionContext context)
@@ -52,6 +69,12 @@
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                Dt_WarehouseDevice? warehouseDevice = warehouseDevices.FirstOrDefault(x => x.DeviceCode == device.DeviceCode);
                if (warehouseDevice == null)
                {
                    WriteError(device.DeviceName, $"请配置仓库设备信息");
                    return Task.CompletedTask;
                }
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
@@ -78,18 +101,40 @@
                        if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                        {
                            {
                                #region ç”Ÿæˆä»»åŠ¡åŽç»™è¾“é€çº¿å¯åŠ¨ä¿¡å·
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) /*&& x.DeviceCode == item.StationDeviceCode*/ && (x.TaskState == TaskStatusEnum.New.ObjToInt()) && x.WarehouseId == warehouseDevice.WarehouseId);
                                if (task != null && conveyorLineInfoWrite.Spare2 == 0)
                                {
                                    List<string> stations = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt()).Select(x => x.NextPosi).ToList();
                                    WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations, task.TaskNum, conveyorLineInfoRead.Spare2);
                                    if (responseContent.Status)
                                    {
                                        device.SetValue(W_ConveyorLineDB.Spare2, 1, item.StationCode);
                                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: item.StationDeviceCode, roadwayNo: responseContent.Data.ToString() ?? "");
                                    }
                                }
                                #endregion
                            }
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)
                            {
                                if (conveyorLineInfoRead.TaskNum == 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))//采购入库
                                {
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && (x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() || x.TaskState == TaskStatusEnum.New.ObjToInt()));
                                    #region ä»»åŠ¡å·ä¸º0,且有托盘号,则是采购入库
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && (x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt()) && x.PalletCode == conveyorLineInfoRead.Barcode && x.WarehouseId == warehouseDevice.WarehouseId);
                                    if (task != null)
                                    {
                                        device.SetValue(W_ConveyorLineDB.Spare2, 0, item.StationCode);
                                        string currentAddress = task.CurrentAddress;
                                        string nextAddress = task.NextAddress;
                                        string targetAddress = task.TargetAddress;
                                        string deviceCode = task.DeviceCode;
                                        TaskStatusEnum taskState = TaskStatusEnum.Line_Executing;
                                        List<Dt_Router> routers = _routerService.QueryNextRoutes(item.StationCode, task.Roadway, task.TaskType);
                                        if (routers == null || routers.Count == 0)
                                        Dt_Router? router = routers.FirstOrDefault();
                                        if (routers == null || routers.Count == 0 || router == null)
                                        {
                                            WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
@@ -99,13 +144,24 @@
                                            WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        Dt_Router router = routers.FirstOrDefault();
                                        if (router.IsEnd)
                                        {
                                            currentAddress = item.StackerCraneStationCode;
                                            nextAddress = task.TargetAddress;
                                            taskState = TaskStatusEnum.SC_Execute;
                                            device.SetValue(W_ConveyorLineDB.EndPos, task.CurrentAddress, item.StationCode);
                                            string? targetLoca = _taskService.RequestAssignLocationByHeight(task.TaskNum, task.Roadway, conveyorLineInfoRead.Spare2);
                                            if (!string.IsNullOrEmpty(targetLoca))
                                            {
                                                currentAddress = item.StackerCraneStationCode;
                                                targetAddress = targetLoca;
                                                nextAddress = targetLoca;
                                                taskState = TaskStatusEnum.SC_Execute;
                                                deviceCode = item.StackerCraneCode;
                                                device.SetValue(W_ConveyorLineDB.EndPos, task.CurrentAddress, item.StationCode);
                                            }
                                            else
                                            {
                                                WriteError(item.StationName, $"请求分配货位失败,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                continue;
                                            }
                                        }
                                        else
                                        {
@@ -115,95 +171,65 @@
                                        device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress);
                                        _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress, deviceCode: deviceCode);
                                    }
                                    else
                                    {
                                        List<Dt_Router> routers = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt());
                                        List<string> stations = routers.Select(x => x.NextPosi).ToList();
                                        WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations);
                                        if (responseContent.Status)
                                        {
                                            WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode, responseContent.Data.ToString());
                                            if (content.Status)
                                            {
                                                task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && (x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() || x.TaskState == TaskStatusEnum.New.ObjToInt()));
                                                if (task != null)
                                                {
                                                    Dt_Router router = _routerRepository.QueryFirst(x => x.InOutType == task.TaskType && x.StartPosi == item.StationCode);
                                                    if (router == null)
                                                    {
                                                        WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                        continue;
                                                    }
                                                    string currentAddress = task.CurrentAddress;
                                                    string nextAddress = task.NextAddress;
                                                    TaskStatusEnum taskState = TaskStatusEnum.Line_Executing;
                                                    device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode);
                                                    if (router.NextPosi != task.NextAddress)
                                                    {
                                                        currentAddress = item.StackerCraneStationCode;
                                                        nextAddress = task.TargetAddress;
                                                        taskState = TaskStatusEnum.SC_Execute;
                                                        device.SetValue(W_ConveyorLineDB.EndPos, task.CurrentAddress, item.StationCode);
                                                    }
                                                    else
                                                    {
                                                        device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress, item.StationCode);
                                                    }
                                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                                    _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress);
                                                    //continue;
                                                    //_taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                                    //device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                                    //device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode);
                                                    //device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress, item.StationCode);
                                                    //device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode);
                                                    //device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                                }
                                            }
                                        }
                                    }
                                    #endregion
                                }
                                else//生产退库
                                {
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNum && x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType)); // å¸¦ä»»åŠ¡å·æŸ¥è¯¢ä»»åŠ¡
                                    #region ç”Ÿäº§é€€åº“,带任务号查询任务
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNum && x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.WarehouseId == warehouseDevice.WarehouseId); // å¸¦ä»»åŠ¡å·æŸ¥è¯¢ä»»åŠ¡
                                    if (task != null)
                                    {
                                        Dt_Router router = _routerRepository.QueryFirst(x => x.InOutType == task.TaskType && x.StartPosi == item.StationCode);
                                        if (router == null)
                                        List<string> stations = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt()).Select(x => x.NextPosi).ToList();
                                        WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations, task.TaskNum, conveyorLineInfoRead.Spare2);
                                        if (responseContent.Status)
                                        {
                                            WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                            string currentAddress = task.CurrentAddress;
                                            string nextAddress = task.NextAddress;
                                            string targetAddress = task.TargetAddress;
                                            TaskStatusEnum taskState = TaskStatusEnum.Line_Executing;
                                            List<Dt_Router> routers = _routerService.QueryNextRoutes(item.StationCode, task.Roadway, task.TaskType);
                                            Dt_Router? router = routers.FirstOrDefault();
                                            if (routers == null || routers.Count == 0 || router == null)
                                            {
                                                WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                continue;
                                            }
                                            if (routers.Count > 1)
                                            {
                                                WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                continue;
                                            }
                                            if (router.IsEnd)
                                            {
                                                string? targetLoca = _taskService.RequestAssignLocationByHeight(task.TaskNum, task.Roadway, conveyorLineInfoRead.Spare2);
                                                if (!string.IsNullOrEmpty(targetLoca))
                                                {
                                                    currentAddress = item.StackerCraneStationCode;
                                                    nextAddress = targetAddress;
                                                    taskState = TaskStatusEnum.SC_Execute;
                                                    targetAddress = targetLoca;
                                                    device.SetValue(W_ConveyorLineDB.EndPos, task.CurrentAddress, item.StationCode);
                                                }
                                                else
                                                {
                                                    WriteError(item.StationName, $"请求分配货位失败,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress, item.StationCode);
                                            }
                                            device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                            _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress);
                                        }
                                        Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
                                        if (stationManger == null)
                                        {
                                            WriteError(item.StationName, $"未找到对应站台信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        string? locationCode = _taskService.RequestAssignLocation(task.TaskNum, router.NextPosi);
                                        if (string.IsNullOrEmpty(locationCode))
                                        {
                                            WriteError(item.StationName, $"请求分配货位返回信息错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: stationManger.StackerCraneCode, targetAddress: locationCode, currentAddress: stationManger.StackerCraneStationCode, nextAddress: locationCode);
                                        device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        #endregion
                                    }
                                }
                            }
@@ -213,7 +239,7 @@
                            }
                            else if (!conveyorLineSignalRead.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.STB && !conveyorLineSignalWrite.ACK && conveyorLineInfoRead.TaskNum == 0)//出库
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt());
                                Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.WarehouseId == warehouseDevice.WarehouseId);
                                if (task != null)
                                {
                                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
@@ -224,18 +250,18 @@
                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode);
                                    device.SetValue(W_ConveyorLineDB.STB, true, item.StationCode);
                                }
                                else
                                {
                                    task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && string.IsNullOrEmpty(x.DeviceCode) && x.TaskState == TaskStatusEnum.New.ObjToInt());
                                    if (task != null)
                                    {
                                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.CurrentAddress);
                                        if (stationManger != null)
                                        {
                                            _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: stationManger.StackerCraneCode, currentAddress: stationManger.StackerCraneStationCode, nextAddress: task.TargetAddress);
                                        }
                                    }
                                }
                                //else
                                //{
                                //    task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && string.IsNullOrEmpty(x.DeviceCode) && x.TaskState == TaskStatusEnum.New.ObjToInt() && x.WarehouseId == warehouseDevice.WarehouseId);
                                //    if (task != null)
                                //    {
                                //        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.CurrentAddress);
                                //        if (stationManger != null)
                                //        {
                                //            _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: stationManger.StackerCraneCode, currentAddress: stationManger.StackerCraneStationCode, nextAddress: task.TargetAddress);
                                //        }
                                //    }
                                //}
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.STB && !conveyorLineSignalWrite.ACK)
                            {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/RGVJob_BC.cs
@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
@@ -10,6 +11,7 @@
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Caches;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
@@ -27,22 +29,34 @@
    [DisallowConcurrentExecution]
    public class RGVJob_BC : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly IRouterService _routerService;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        public RGVJob_BC(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService)
        public RGVJob_BC(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
            _routerService = routerService;
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
                warehouseDevices = JsonConvert.DeserializeObject<List<Dt_WarehouseDevice>>(warehouseDevicesStr) ?? new List<Dt_WarehouseDevice>();
            }
            else
            {
                warehouseDevices = new List<Dt_WarehouseDevice>();
            }
        }
        public Task Execute(IJobExecutionContext context)
@@ -51,6 +65,14 @@
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                Dt_WarehouseDevice? warehouseDevice = warehouseDevices.FirstOrDefault(x => x.DeviceCode == device.DeviceCode);
                if (warehouseDevice == null)
                {
                    WriteError(device.DeviceName, $"请配置仓库设备信息");
                    return Task.CompletedTask;
                }
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
@@ -79,86 +101,102 @@
                        {
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode) && conveyorLineInfoRead.TaskNum == 0)//入库
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.SourceAddress == item.StationDeviceCode && x.TaskState == TaskStatusEnum.New.ObjToInt() && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.PalletCode == conveyorLineInfoRead.Barcode && string.IsNullOrEmpty(x.DeviceCode) && string.IsNullOrEmpty(x.NextAddress) && string.IsNullOrEmpty(x.TargetAddress));
                                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                                WebResponseContent content = _taskService.RequestWMSTaskSimple(conveyorLineInfoRead.Barcode, item.StationCode);
                                if (content.Status)
                                {
                                    Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
                                    if (stationManger == null)
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == conveyorLineInfoRead.Barcode && x.CurrentAddress == item.StationCode && x.DeviceCode == device.DeviceCode && x.TaskState == TaskStatusEnum.New.ObjToInt());
                                    if (task != null)
                                    {
                                        WriteError(item.StationName, $"未找到对应站台信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && (task.Roadway == x.ChildPosiDeviceCode || task.Roadway == x.ChildPosi));
                                    Dt_Router? router = routers.FirstOrDefault();
                                    if (router == null)
                                    {
                                        WriteError(device.DeviceName, $"未找到任务类型{task.TaskType}对应的路由信息");
                                    }
                                    else
                                    {
                                        if (routers.Count == 1)
                                        {
                                            task.Dispatchertime = DateTime.Now;
                                            _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: router.ChildPosi, targetAddress: router.NextPosi, nextAddress: router.StartPosi, currentAddress: item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.StartPos, item.StationCode, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.EndPos, router.StartPosi, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        }
                                        else
                                        {
                                            List<string> canInboundStations = new List<string>();
                                            List<string> stations = routers.Select(x => x.NextPosi).ToList();
                                            foreach (string station in stations)
                                            {
                                                Dt_StationManger stationManger1 = _stationMangerRepository.QueryFirst(x => x.StationCode == station);
                                                if (stationManger1 != null)
                                                {
                                                    IDevice? device1 = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger1.StationDeviceCode);
                                                    if (device1 != null)
                                                    {
                                                        OtherDevice otherDevice = (OtherDevice)device1;
                                                        //short workType = otherDevice.GetValue<R_ConveyorLineWorkType, short>(R_ConveyorLineWorkType.ConveyorLineWorkType, item.StationCode);
                                                        //if (workType == ConveyorWorkTypeEnum.Undefined.ObjToInt() || workType == ConveyorWorkTypeEnum.Inbound.ObjToInt())
                                                        {
                                                            canInboundStations.Add(stationManger1.Remark);
                                                        }
                                                    }
                                                }
                                            }
                                            WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(task.TaskNum, canInboundStations);
                                            if (responseContent.Status)
                                            {
                                                List<Dt_Router> dt_Routers = _routerService.QueryNextRoutes(item.StationCode, responseContent.Data.ToString() ?? "", task.TaskType);
                                                Dt_Router? routerTemp = _routerService.QueryNextRoutes(item.StationCode, responseContent.Data.ToString() ?? "", task.TaskType).FirstOrDefault();
                                                if (routerTemp != null)
                                                {
                                                    task.Dispatchertime = DateTime.Now;
                                                    task.Roadway = responseContent.Data.ToString() ?? task.Roadway;
                                                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: routerTemp.ChildPosiDeviceCode, targetAddress: routerTemp.NextPosi, nextAddress: routerTemp.NextPosi, currentAddress: item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.StartPos, item.StationCode, item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.EndPos, routerTemp.NextPosi, item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                                    device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                                }
                                                else
                                                {
                                                    WriteError(device.DeviceName, $"未找到任务类型{task.TaskType},起点{item.StationCode},终点{responseContent.Data.ToString()}的路由信息");
                                                }
                                            }
                                            else
                                            {
                                                WriteError(device.DeviceName, responseContent.Message);
                                            }
                                        }
                                        device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                    }
                                }
                                #region
                                //Dt_Task task = _taskRepository.QueryFirst(x => x.SourceAddress == item.StationDeviceCode && x.TaskState == TaskStatusEnum.New.ObjToInt() && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.PalletCode == conveyorLineInfoRead.Barcode && string.IsNullOrEmpty(x.DeviceCode) && string.IsNullOrEmpty(x.NextAddress) && string.IsNullOrEmpty(x.TargetAddress));
                                //if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                                //{
                                //    Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
                                //    if (stationManger == null)
                                //    {
                                //        WriteError(item.StationName, $"未找到对应站台信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                //        continue;
                                //    }
                                //    List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && (task.Roadway == x.ChildPosiDeviceCode || task.Roadway == x.ChildPosi));
                                //    Dt_Router? router = routers.FirstOrDefault();
                                //    if (router == null)
                                //    {
                                //        WriteError(device.DeviceName, $"未找到任务类型{task.TaskType}对应的路由信息");
                                //    }
                                //    else
                                //    {
                                //        if (routers.Count == 1)
                                //        {
                                //            task.Dispatchertime = DateTime.Now;
                                //            _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: router.ChildPosi, targetAddress: router.NextPosi, nextAddress: router.StartPosi, currentAddress: item.StationCode);
                                //            device.SetValue(W_ConveyorLineDB.StartPos, item.StationCode, item.StationCode);
                                //            device.SetValue(W_ConveyorLineDB.EndPos, router.StartPosi, item.StationCode);
                                //            device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                //            device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                //            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                //        }
                                //        else
                                //        {
                                //            List<string> canInboundStations = new List<string>();
                                //            List<string> stations = routers.Select(x => x.NextPosi).ToList();
                                //            foreach (string station in stations)
                                //            {
                                //                Dt_StationManger stationManger1 = _stationMangerRepository.QueryFirst(x => x.StationCode == station);
                                //                if (stationManger1 != null)
                                //                {
                                //                    IDevice? device1 = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger1.StationDeviceCode);
                                //                    if (device1 != null)
                                //                    {
                                //                        OtherDevice otherDevice = (OtherDevice)device1;
                                //                        //short workType = otherDevice.GetValue<R_ConveyorLineWorkType, short>(R_ConveyorLineWorkType.ConveyorLineWorkType, item.StationCode);
                                //                        //if (workType == ConveyorWorkTypeEnum.Undefined.ObjToInt() || workType == ConveyorWorkTypeEnum.Inbound.ObjToInt())
                                //                        {
                                //                            canInboundStations.Add(stationManger1.Remark);
                                //                        }
                                //                    }
                                //                }
                                //            }
                                //            WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(task.TaskNum, canInboundStations);
                                //            if (responseContent.Status)
                                //            {
                                //                List<Dt_Router> dt_Routers = _routerService.QueryNextRoutes(item.StationCode, responseContent.Data.ToString() ?? "", task.TaskType);
                                //                Dt_Router? routerTemp = _routerService.QueryNextRoutes(item.StationCode, responseContent.Data.ToString() ?? "", task.TaskType).FirstOrDefault();
                                //                if (routerTemp != null)
                                //                {
                                //                    task.Dispatchertime = DateTime.Now;
                                //                    task.Roadway = responseContent.Data.ToString() ?? task.Roadway;
                                //                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: routerTemp.ChildPosiDeviceCode, targetAddress: routerTemp.NextPosi, nextAddress: routerTemp.NextPosi, currentAddress: item.StationCode);
                                //                    device.SetValue(W_ConveyorLineDB.StartPos, item.StationCode, item.StationCode);
                                //                    device.SetValue(W_ConveyorLineDB.EndPos, routerTemp.NextPosi, item.StationCode);
                                //                    device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode);
                                //                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt(), item.StationCode);
                                //                    device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                //                }
                                //                else
                                //                {
                                //                    WriteError(device.DeviceName, $"未找到任务类型{task.TaskType},起点{item.StationCode},终点{responseContent.Data.ToString()}的路由信息");
                                //                }
                                //            }
                                //            else
                                //            {
                                //                WriteError(device.DeviceName, responseContent.Message);
                                //            }
                                //        }
                                //    }
                                //}
                                #endregion
                            }
                            else if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK && conveyorLineInfoRead.TaskNum > 0)//出库
                            {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/StackerCraneJob_BC.cs
@@ -28,6 +28,7 @@
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_QuartzJob.Repository;
using Autofac.Core;
namespace WIDESEAWCS_Tasks
{
@@ -42,6 +43,7 @@
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        private List<Dt_ApiInfo> apiInfos;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
        public StackerCraneJob_BC(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository)
        {
@@ -66,6 +68,17 @@
                    apiInfos = infos;
                }
            }
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
                warehouseDevices = JsonConvert.DeserializeObject<List<Dt_WarehouseDevice>>(warehouseDevicesStr) ?? new List<Dt_WarehouseDevice>();
            }
            else
            {
                warehouseDevices = new List<Dt_WarehouseDevice>();
            }
        }
        public Task Execute(IJobExecutionContext context)
@@ -75,6 +88,13 @@
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    Dt_WarehouseDevice? warehouseDevice = warehouseDevices.FirstOrDefault(x => x.DeviceCode == commonStackerCrane.DeviceCode);
                    if (warehouseDevice == null)
                    {
                        WriteError(commonStackerCrane.DeviceName, $"请配置仓库设备信息");
                        return Task.CompletedTask;
                    }
                    if (!commonStackerCrane.IsEventSubscribed)
                    {
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
@@ -234,15 +254,15 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
                    WriteError(commonStackerCrane.DeviceCode, $"未找到WMS移库判断接口");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到WMS移库判断接口");
                    return null;
                }
                HttpHelper.Post($"{url}?taskNum={task.TaskNum}&locationCode={task.NextAddress}", "");//todo è°ƒç”¨WMS任务完成方法
                //string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.WMSIsReloaction.ToString())?.ApiAddress;
                //if (string.IsNullOrEmpty(url))
                //{
                //    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
                //    WriteError(commonStackerCrane.DeviceCode, $"未找到WMS移库判断接口");
                //    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到WMS移库判断接口");
                //    return null;
                //}
                //HttpHelper.Post($"{url}?taskNum={task.TaskNum}&locationCode={task.NextAddress}", "");//todo è°ƒç”¨WMS任务完成方法
            }
            return task;
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/²âÊԼܲÖ/StackerCraneJob_CSJ.cs
@@ -222,7 +222,7 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.WMSIsReloaction.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/package.json
@@ -16,9 +16,11 @@
    "core-js": "^3.6.5",
    "echarts": "^5.0.2",
    "element-plus": "^2.2.14",
    "jsbarcode": "^3.11.6",
    "less": "^4.1.1",
    "qrcode": "^1.5.4",
    "vue": "^3.2.37",
    "vue-barcode": "^1.3.0",
    "vue-draggable-next": "^2.0.1",
    "vue-qrcode": "^2.2.2",
    "vue-router": "^4.0.0-0",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/2ad7410e-7b16-4692-8ca2-e7055946c8fa.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ddab6c09-d32a-4e10-9c68-7904d199b1b7.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/AssignLocation/LocationInfoService_BC.cs
@@ -29,7 +29,7 @@
        /// æ‰˜ç›˜ç±»åž‹
        /// </param>
        /// <returns></returns>
        public Dt_LocationInfo? AssignLocation_BC(string roadwayNo, int palletType, Dt_PalletTypeInfo palletTypeInfo, string beRelocationCode = "")
        public Dt_LocationInfo? AssignLocation_BC(string roadwayNo, int palletType, Dt_PalletTypeInfo palletTypeInfo, string beRelocationCode = "", int heightType = 0)
        {
            lock (_locker_BC)
            {
@@ -67,14 +67,33 @@
                    }
                }
                //已定义货位类型的货位
                List<Dt_LocationInfo> definedTypeLocations = locationInfos.Where(x => x.LocationType == palletType.ObjToInt()).ToList();
                //未定义类型的空货位
                List<Dt_LocationInfo> undefinedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Column).ThenBy(x => x.Row).ToList();
                List<Dt_LocationInfo> definedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == palletType.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Column).ThenBy(x => x.Row).ToList();
                if(heightType == 1)
                {
                    undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x=>x.Layer <= 3).ToList();
                    definedTypeEmptyLocations = definedTypeEmptyLocations.Where(x => x.Layer <= 3).ToList();
                }
                else if(heightType == 2)
                {
                    undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Layer == 4).ToList();
                    definedTypeEmptyLocations = definedTypeEmptyLocations.Where(x => x.Layer == 4).ToList();
                }
                else if (heightType == 3)
                {
                    undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Layer == 5).ToList();
                    definedTypeEmptyLocations = definedTypeEmptyLocations.Where(x => x.Layer == 5).ToList();
                }
                else
                {
                    undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => false).ToList();
                    definedTypeEmptyLocations = definedTypeEmptyLocations.Where(x => false).ToList();
                }
                if (palletTypeInfo.LocaitonCount == 2)
                {
                    if (roadwayNo != "SC01_BC")
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs
@@ -26,7 +26,7 @@
    public partial class LocationInfoService
    {
        public Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId)
        public Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId, string beRelocationCode = "", int heightType = 0)
        {
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
            if (warehouse == null)
@@ -51,11 +51,11 @@
            return warehouse.WarehouseCode switch
            {
                "HA57" => AssignLocation_BC(roadwayNo, palletType, palletTypeInfo),
                "HA58" => AssignLocation_PP(roadwayNo, palletType, palletTypeInfo),
                "HA152" => AssignLocation_GM(roadwayNo, palletType, palletTypeInfo),
                "HA64" => AssignLocation_CSJ(roadwayNo, palletType, palletTypeInfo),
                "阻焊仓" => AssignLocation_ZH(roadwayNo, palletType, palletTypeInfo),
                "HA57" => AssignLocation_BC(roadwayNo, palletType, palletTypeInfo, beRelocationCode, heightType),
                "HA58" => AssignLocation_PP(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                "HA152" => AssignLocation_GM(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                "HA64" => AssignLocation_CSJ(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                "阻焊仓" => AssignLocation_ZH(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                "HA153" => AssignLocation(roadwayNo),
                "HA71" => AssignLocation(roadwayNo),
                "HA60" => AssignLocation(roadwayNo),
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs
@@ -53,6 +53,9 @@
        [Description("拣选完成")]
        æ‹£é€‰å®Œæˆ =14,
        [Description("退库")]
        MES退库 = 21,
        [Description("组盘撤销")]
        ç»„盘撤销 = 99,
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/ILocationInfoService.cs
@@ -58,7 +58,7 @@
        /// <param name="roadwayNo">巷道号</param>
        /// <param name="palletType">托盘类型</param>
        /// <returns></returns>
        Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId);
        Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId, string beRelocationCode = "", int heightType = 0);
        /// <summary>
        /// ä¿®æ”¹è´§ä½çŠ¶æ€åŠç±»åž‹
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -89,6 +89,14 @@
        WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode);
        /// <summary>
        /// ä»…申请任务,让WCS根据路由确定下一地址
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        WebResponseContent DeviceRequestInboundTask(string stationCode, string palletCode);
        /// <summary>
        /// å…¥åº“任务申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
@@ -96,6 +104,15 @@
        /// <param name="palletType">托盘类型</param>
        /// <returns></returns>
        WebResponseContent AssignInboundTaskLocation(int taskNum, string roadwayNo);
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        WebResponseContent AssignInboundTaskLocationByHeight(int taskNum, string roadwayNo, int heightType);
        /// <summary>
        /// 
@@ -198,6 +215,15 @@
        MesResponseContent SubstrateBack(SubstrateBackModel model);
        /// <summary>
        ///
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <param name="taskNum"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        WebResponseContent AssignRoadway(List<string> roadwayNos, int taskNum, int heightType = 0);
        /// <summary>
        /// åˆ†é…å··é“
        /// </summary>
        /// <param name="taskNum"></param>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/AssignInboundTaskLocation_BC.cs
@@ -20,6 +20,57 @@
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNos">巷道号</param>
        /// <returns></returns>
        public WebResponseContent AssignRoadway(List<string> roadwayNos, int taskNum,  int heightType = 0)
        {
            try
            {
                if(heightType == 0 || heightType > 3)
                {
                    return WebResponseContent.Instance.Error($"高度错误");
                }
                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);
                }
                string roadwayNo = "";
                if (heightType == 1)
                {
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => (x.LocationType == task.PalletType || x.LocationType == LocationTypeEnum.Undefined.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && roadwayNos.Contains(x.RoadwayNo) && x.Layer <= 3).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                else if (heightType == 2)
                {
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => (x.LocationType == task.PalletType || x.LocationType == LocationTypeEnum.Undefined.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && roadwayNos.Contains(x.RoadwayNo) && x.Layer == 4).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                else if (heightType == 3)
                {
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => (x.LocationType == task.PalletType || x.LocationType == LocationTypeEnum.Undefined.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && roadwayNos.Contains(x.RoadwayNo) && x.Layer == 5).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                return !string.IsNullOrEmpty(roadwayNo) ? WebResponseContent.Instance.OK(data: roadwayNo) : WebResponseContent.Instance.Error("未找到可分配巷道");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å…¥åº“任务申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNos">巷道号</param>
        /// <returns></returns>
        public WebResponseContent AssignRoadway(int taskNum, List<string> roadwayNos)
        {
            try
@@ -51,7 +102,6 @@
        /// <summary>
        /// å…¥åº“任务申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNos">巷道号</param>
        /// <returns></returns>
        public WebResponseContent AssignRoadway(List<string> roadwayNos)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -455,27 +455,27 @@
                    OutboundQuantity = 0,
                    SerialNumber = stockInfoDetail_Hty?.SerialNumber ?? "0",
                    StockQuantity = model.Quantity,
                    Status = StockStatusEmun.组盘暂存.ObjToInt(),
                    Status = StockStatusEmun.MES退库.ObjToInt(),
                    Unit = model.Unit
                };
                Dt_Task task = new Dt_Task()
                {
                    PalletCode = stockInfo.PalletCode,
                    CurrentAddress = "",
                    NextAddress = "",
                    PalletType = stockInfo.PalletType,
                    Roadway = "RGV01_BC",
                    SourceAddress = "RGV01_BC",
                    TargetAddress = "",
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId
                };
                //Dt_Task task = new Dt_Task()
                //{
                //    PalletCode = stockInfo.PalletCode,
                //    CurrentAddress = "",
                //    NextAddress = "",
                //    PalletType = stockInfo.PalletType,
                //    Roadway = "RGV01_BC",
                //    SourceAddress = "RGV01_BC",
                //    TargetAddress = "",
                //    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                //    TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(),
                //    WarehouseId = warehouse.WarehouseId
                //};
                _unitOfWorkManage.BeginTran();
                Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
                BaseDal.AddData(task);
                //BaseDal.AddData(task);
                _unitOfWorkManage.CommitTran();
                return MesResponseContent.Instance.OK();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -423,7 +423,7 @@
                if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                {
                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, mesOutboundOrders.FirstOrDefault().OrderQuantity);
                    UploadMesMaterialLotaAcept(model);
                     UploadMesMaterialLotaAcept(model);
                }
                return WebResponseContent.Instance.OK();
            }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -22,8 +22,7 @@
        /// <summary>
        /// ç”³è¯·å…¥åº“任务(PDA使用,仅托盘绑定入库站台,不分配货位)
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="stationCode">站台号</param>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public WebResponseContent RequestInboundTask(SaveModel saveModel)
        {
@@ -111,9 +110,13 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å…¥ç©ºç®±
        /// </summary>
        /// <param name="barcode"></param>
        /// <param name="address"></param>
        /// <param name="WarehouseId"></param>
        /// <returns></returns>
        public WebResponseContent InEmpty(string barcode, string address, int WarehouseId)
        {
@@ -173,6 +176,15 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="qty"></param>
        /// <param name="address"></param>
        /// <param name="WarehouseId"></param>
        /// <param name="barcode"></param>
        /// <returns></returns>
        public WebResponseContent OutEmpty(int qty, string address, int WarehouseId, string barcode)
        {
            try
@@ -216,6 +228,14 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        {
            try
@@ -223,6 +243,7 @@
                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
                if (task != null)
                {
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
                }
@@ -236,7 +257,7 @@
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt())
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
                }
@@ -266,9 +287,14 @@
                    PalletType = stockInfo.PalletType
                };
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
                }
                else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt())
                {
                    newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt();
                }
                else
                {
@@ -278,6 +304,89 @@
                _unitOfWorkManage.BeginTran();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, newTask.PalletType, LocationStatusEnum.Lock, newTask.WarehouseId);
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _unitOfWorkManage.CommitTran();
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
                PushTasksToWCS(new List<Dt_Task> { newTask });
                if (newTask.WarehouseId == 5) PutFinish(stationCode);
                return WebResponseContent.Instance.OK(data: wMSTaskDTO);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// ä»…申请任务,让WCS根据路由确定下一地址
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string palletCode)
        {
            try
            {
                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
                if (task != null)
                {
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
                }
                if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
                {
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
                }
                if (!string.IsNullOrEmpty(stockInfo.LocationCode))
                {
                    return WebResponseContent.Instance.Error($"该托盘已绑定货位");
                }
                Dt_Task newTask = new Dt_Task()
                {
                    CurrentAddress = stationCode,
                    Grade = 0,
                    NextAddress = "",
                    PalletCode = palletCode,
                    Roadway = "",
                    SourceAddress = stationCode,
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                };
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
                }
                else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt())
                {
                    newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt();
                }
                else
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                }
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
@@ -341,5 +450,53 @@
                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);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -67,10 +67,29 @@
            return Service.OutEmpty(qty, address, WarehouseId, barcode);
        }
        /// <summary>
        /// WCS申请入库任务(分配货位)
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("DeviceRequestInboundTask"), AllowAnonymous]
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        {
            return Service.DeviceRequestInboundTask(stationCode, roadwayNo, palletCode);
        }
        /// <summary>
        /// WCS申请入库任务(不分配货位)
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("DeviceRequestInboundTaskSimple"), AllowAnonymous]
        public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode)
        {
            return Service.DeviceRequestInboundTask(stationCode, palletCode);
        }
        /// <summary>
@@ -83,6 +102,19 @@
        public WebResponseContent AssignInboundTaskLocation(int taskNum, string roadwayNo)
        {
            return Service.AssignInboundTaskLocation(taskNum, roadwayNo);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AssignInboundTaskLocationByHeight"), AllowAnonymous]
        public WebResponseContent AssignInboundTaskLocationByHeight(int taskNum, string roadwayNo, int heightType)
        {
            return Service.AssignInboundTaskLocationByHeight(taskNum, roadwayNo, heightType);
        }
        /// <summary>
@@ -188,7 +220,20 @@
        }
        /// <summary>
        /// åˆ†é…å··é“
        /// åˆ†é…å··é“(带任务号及高度)
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <param name="taskNum"></param>
        /// <param name="heightType"></param>
        /// <returns></returns>
        [HttpPost, Route("AssignRoadwayByHeight"), AllowAnonymous]
        public WebResponseContent AssignRoadwayByHeight([FromBody] List<string> roadwayNos, int taskNum, int heightType = 0)
        {
            return Service.AssignRoadway(roadwayNos, taskNum, heightType);
        }
        /// <summary>
        /// åˆ†é…å··é“(带任务号)
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="roadwayNos"></param>
@@ -199,6 +244,11 @@
            return Service.AssignRoadway(taskNum, roadwayNos);
        }
        /// <summary>
        /// åˆ†é…å··é“
        /// </summary>
        /// <param name="roadwayNos"></param>
        /// <returns></returns>
        [HttpPost, Route("SingleAssignRoadway"), AllowAnonymous]
        public WebResponseContent AssignRoadway([FromBody] List<string> roadwayNos)
        {