ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -23,6 +23,7 @@
using RYB_PTL_API;
using SqlSugar;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices.Protocols;
using System.Linq;
@@ -120,6 +121,7 @@
            {
                lock (lock_taskReceive)
                {
                    WriteLog.Write_Log("入库任务下发", "WMS入库任务接收参数", "接收参数", $"参数:{taskDTO.ToJson()}");
                    List<Dt_Task> tasks = new List<Dt_Task>();
                    List<Dt_Task> taskOlds = BaseDal.QueryData(x=> taskDTO.Tasks.Select(x => x.TaskDescribe.ContainerCode).Contains(x.PalletCode));
                    List<Dt_LocationInfo> locationInfos = _locationInfoRepository.GetCanOut(taskDTO.Tasks.Select(x=>x.TaskDescribe.ContainerCode).ToList());
@@ -252,6 +254,7 @@
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, "创建入库任务");
                }
                WriteLog.Write_Log("入库任务下发", "容器入库任务添加任务", "添加任务", $"任务:{task.ToJson()}");
                content.OK("成功");
            }
            catch (Exception ex)
@@ -487,6 +490,7 @@
                    _unitOfWorkManage.CommitTran();
                    _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, $"分配货位{locationInfo.LocationCode}");
                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Free, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation, task.TaskNum);
                    WriteLog.Write_Log("入库任务下发", "申请入库接口", "更新任务", $"任务:{task.ToJson()}");
                    content.OK("成功");
                }
            }
@@ -542,7 +546,7 @@
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task, task.ExceptionMessage);
                WriteLog.Write_Log("更新任务异常信息", "更新任务接口", "更新任务", $"任务:{task.ToJson()}");
                content = WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -645,6 +649,7 @@
        {
            try
            {
                WriteLog.Write_Log("接受WMS手动完成任务", "接受WMS手动完成任务接口", "任务号", $"任务号:{taskNum}");
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                {
@@ -667,6 +672,7 @@
            WebResponseContent content=new WebResponseContent();
            try
            {
                WriteLog.Write_Log("AGV任务放行", "AGV任务放行接口", "料箱号", $"料箱:{code}");
                string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.AgvTaskFlow.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url)) throw new Exception($"{code},未找到AGV任务放行接口,请检查接口配置");
                AgvTaskFlowDTO agvTaskFlowDTO = new AgvTaskFlowDTO()
@@ -676,6 +682,7 @@
                };
                string request = JsonConvert.SerializeObject(agvTaskFlowDTO, settings);
                string response = HttpHelper.Post(url, request);
                WriteLog.Write_Log("AGV任务放行接口请求AGV", "AGV任务放行接口", $"请求:{request},回传:{response}");
                AgvResponseContent agvResponse = JsonConvert.DeserializeObject<AgvResponseContent>(response) ?? throw new Exception($"{code},未接收到AGV任务放行返回值");
                if (!agvResponse.Success) throw new Exception($"料箱{code},AGV任务放行错误,信息:{agvResponse.Message}");
                content.OK();
@@ -695,6 +702,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                WriteLog.Write_Log("WMS料箱到达拣选位上报", "WMS料箱到达拣选位上报成接口", "信息", $"拣选位:{stationCode},料箱:{pickCode}");
                string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSPickArrivedUp.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url)) throw new Exception($"未找到WMS料箱到达拣选位上报接口,请检查接口配置");
                ContainerArriveDTO containerArriveDTO = new ContainerArriveDTO()
@@ -704,6 +712,7 @@
                };
                string request = JsonConvert.SerializeObject(containerArriveDTO, settings);
                string response = HttpHelper.Post(url, request);
                WriteLog.Write_Log("上报WMS料箱到达", "上报WMS料箱到达", "信息", $"请求:{request},回传:{response}");
                WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{pickCode},未接收到WMS料箱到达拣选位上报返回值");
                if (wMSResponse.Code != "0") throw new Exception($"料箱{pickCode}WMS料箱到达拣选位上报错误,信息:{wMSResponse.Msg}");
                content.OK();
@@ -724,6 +733,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                WriteLog.Write_Log("任务完成", "任务完成接口", "任务号", $"任务:{taskNum}");
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//出库任务完成逻辑
                {
@@ -752,7 +762,7 @@
                        CompleteType = 1
                    };
                    string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
                    _unitOfWorkManage.BeginTran();
                    _locationInfoRepository.UpdateData(locationInfo);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
@@ -760,6 +770,7 @@
                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, task.TaskNum);
                    //调用接口
                    string response = HttpHelper.Post(url, request);
                    WriteLog.Write_Log("WMS出库任务完成回传", "任务完成接口", "任务信息", $"请求:{request},回传:{response}");
                    WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},未接收到WMS出库上报返回值");
                    if (wMSResponse.Code != "0") content.Message=$"出库任务{task.TaskNum}WMS出库上报错误,信息:{wMSResponse.Msg}";
                }
@@ -781,7 +792,7 @@
                        CompleteType = 2
                    };
                    string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
                    {
@@ -797,6 +808,7 @@
                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted, task.TaskNum);
                    //调用接口
                    string response = HttpHelper.Post(url, request);
                    WriteLog.Write_Log("WMS入库任务完成回传", "任务完成接口", "任务信息", $"请求:{request},回传:{response}");
                    WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},未接收到WMS入库上报返回值");
                    if (wMSResponse.Code != "0") content.Message = $"入库任务{task.TaskNum}WMS入库上报错误,信息:{wMSResponse.Msg}";
                }
@@ -819,6 +831,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                WriteLog.Write_Log("任务取消接收", "人工手动取消指定任务", "任务号", $"任务:{taskNum}");
                // 1. èŽ·å–ä»»åŠ¡ä¿¡æ¯
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)return content.Error($"任务{taskNum}不存在");
@@ -877,6 +890,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                WriteLog.Write_Log("任务取消接收", "任务取消接口", "任务号", $"任务:{taskNum}");
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//出库任务完成逻辑
                {
@@ -914,38 +928,129 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (taskCancels==null || taskCancels.Count<=0)
                // å‚数验证
                if (taskCancels == null || taskCancels.Count == 0)
                {
                    return content.Error("传入不能为空");
                    return content.Error("传入参数不能为空");
                }
                //获取所有料箱
                List<Dt_Task> outTasks = BaseDal.QueryData(x=>x.TaskType==TaskTypeEnum.Outbound.ObjToInt());
                WriteLog.Write_Log("任务取消接收", "任务取消接口", "任务取消", $"任务:{taskCancels.ToJson()}");
                // èŽ·å–æ‰€æœ‰å‡ºåº“ä»»åŠ¡ï¼ˆåªæŸ¥è¯¢ä¸€æ¬¡ï¼‰
                List<Dt_Task> outTasks = BaseDal.QueryData(x =>
                    x.TaskType == TaskTypeEnum.Outbound.ObjToInt());
                if (outTasks.Count == 0)
                {
                    return content.Error("未找到对应的任务");
                }
                // æŒ‰GroupId分组处理
                var tasksByGroup = outTasks.GroupBy(x => x.GroupId)
                                           .Where(g => !string.IsNullOrEmpty(g.Key))
                                           .ToDictionary(g => g.Key, g => g.ToList());
                List<Dt_Task> cancelTasks = new List<Dt_Task>();
                List<Dt_Task> cancelTasksCompleted = new List<Dt_Task>();
                //判断是否有任务存在
                foreach (var item in taskCancels)
                // æ”¶é›†æ‰€æœ‰éœ€è¦æ£€æŸ¥çš„任务组
                var groupsToCheck = new List<List<Dt_Task>>();
                foreach (var taskCancel in taskCancels)
                {
                    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode== item.ContainerCode);
                    if (taskExist==null)
                    // æ‰¾åˆ°è¯¥ä»»åŠ¡æ‰€åœ¨çš„ç»„
                    var group = tasksByGroup.Values.FirstOrDefault(g =>
                        g.Any(t => t.PalletCode == taskCancel.ContainerCode));
                    if (group != null && !groupsToCheck.Contains(group))
                    {
                        content.Message += $"{item.ContainerCode}任务不存在";
                        continue;
                        groupsToCheck.Add(group);
                    }
                    if (taskExist.TaskState==TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                    {
                        taskExist.IsCancel = 1;
                        cancelTasks.Add(taskExist);
                    }
                    else if(taskExist.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
                    {
                        cancelTasksCompleted.Add(taskExist);
                    }
                    else
                    {
                        return content.Error($"任务取消失败{item.TaskCode}任务状态不可取消!");
                    }
                }
                // éªŒè¯ä»»åŠ¡çŠ¶æ€
                foreach (var group in groupsToCheck)
                {
                    var firstTask = group.FirstOrDefault();
                    if (firstTask == null) continue;
                    // æ£€æŸ¥ç»„内所有任务状态
                    foreach (var task in group)
                    {
                        if (task.TaskState == TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                        {
                            task.IsCancel = 1;
                            cancelTasks.Add(task);
                        }
                        else if (task.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
                        {
                            cancelTasksCompleted.Add(task);
                        }
                        else
                        {
                            return content.Error($"任务取消失败{task.PalletCode}任务状态不可取消!");
                        }
                    }
                }
                //WriteLog.Write_Log("任务取消接收", "任务取消接口", "任务取消", $"任务:{taskCancels.ToJson()}");
                //if (taskCancels==null || taskCancels.Count<=0)
                //{
                //    return content.Error("传入不能为空");
                //}
                ////获取所有料箱
                //List<Dt_Task> outTasks = BaseDal.QueryData(x=>x.TaskType==TaskTypeEnum.Outbound.ObjToInt());
                //List<Dt_Task> cancelTasks = new List<Dt_Task>();
                //List<Dt_Task> cancelTasksCompleted = new List<Dt_Task>();
                //HashSet<string> processedGroups = new HashSet<string>();
                ////判断是否有任务存在
                //foreach (var item in taskCancels)
                //{
                //    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode == item.ContainerCode);
                //    if (taskExist==null)
                //    {
                //        content.Message += $"{item.ContainerCode}任务不存在";
                //        WriteLog.Write_Log("任务取消接收", "任务取消接口", "任务不存在", $"任务:{item.ContainerCode}");
                //        continue;
                //    }
                //    if (string.IsNullOrEmpty(taskExist.GroupId))
                //    {
                //        continue;
                //    }
                //    processedGroups.Add(taskExist.GroupId);
                //    //if (taskExist.TaskState == TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                //    //{
                //    //    taskExist.IsCancel = 1;
                //    //    cancelTasks.Add(taskExist);
                //    //}
                //    //else if(taskExist.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
                //    //{
                //    //    cancelTasksCompleted.Add(taskExist);
                //    //}
                //    //else
                //    //{
                //    //    return content.Error($"任务取消失败{item.TaskCode}任务状态不可取消!");
                //    //}
                //}
                //// å–消整个组
                //foreach(var processed in processedGroups)
                //{
                //    List<Dt_Task> groupTask = BaseDal.QueryData(x => x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.GroupId == processed);
                //    foreach (var group in groupTask)
                //    {
                //        if (group.TaskState == TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                //        {
                //            group.IsCancel = 1;
                //            cancelTasks.Add(group);
                //        }
                //        else if (group.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
                //        {
                //            cancelTasksCompleted.Add(group);
                //        }
                //        else
                //        {
                //            return content.Error($"任务取消失败{group.PalletCode}任务状态不可取消!");
                //        }
                //    }
                //}
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(cancelTasks);
                foreach (var item in cancelTasksCompleted)