From 821af8301009019a0f0e81a3ea2a0ae7952b5025 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期三, 28 一月 2026 11:43:30 +0800
Subject: [PATCH] 更新

---
 项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs |  208 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 205 insertions(+), 3 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
index 8789af7..abcbd34 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -22,6 +22,7 @@
 using NPOI.XSSF.UserModel;
 using RYB_PTL_API;
 using SqlSugar;
+using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.DirectoryServices.Protocols;
 using System.Linq;
@@ -199,6 +200,7 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
+                WriteLog.Write_Log("瀹瑰櫒鍏ュ簱鍒涘缓浠诲姟", $"杈撻�佺嚎淇℃伅", "寮�濮嬪叆搴�", $"鎵樼洏鍙穥containerFlowDTO.ContainerCode}锛岃澶噞deviceCode}");
                 List<Dt_LocationInfo> locationInfos = _locationInfoRepository.QueryData();
                 Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.PalletCode == containerFlowDTO.ContainerCode);
                 if (locationInfo != null) throw new Exception($"搴撲綅鏂欑鍙穥containerFlowDTO.ContainerCode}宸插瓨鍦�");
@@ -220,13 +222,14 @@
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { taskOld.TaskNum }, $"{oldSlotCode}鎹㈣嚦{containerFlowDTO.SlotCode}鍏ュ簱");
                     return content.OK();
                 }
-                else if(taskOld != null)
+                else if (taskOld != null)
                 {
-                    throw new Exception($"鏂欑鍙穥containerFlowDTO.ContainerCode}" + (taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() ? "鍏ュ簱AGV鎵ц涓�": "鍑哄簱AGV鎵ц涓�"));
+                    throw new Exception($"鏂欑鍙穥containerFlowDTO.ContainerCode}" + (taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() ? "鍏ュ簱AGV鎵ц涓�" : "鍑哄簱AGV鎵ц涓�"));
                 }
                 Dt_LocationInfo? noInLocation = locationInfos.FirstOrDefault(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt());
                 if (noInLocation == null) throw new Exception($"鍙敤璐т綅涓嶈冻!");
                 Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && x.StationDeviceCode == deviceCode);
+                WriteLog.Write_Log("瀹瑰櫒鍏ュ簱鍒涘缓浠诲姟", $"绔欏彴淇℃伅", "鏌ヨ绔欏彴", $"绔欏彴鍙穥stationManger.StationCode}锛岃澶噞stationManger.StationDeviceCode}");
                 //鍒涘缓浠诲姟
                 Dt_Task task = new Dt_Task();
                 task.PalletCode = containerFlowDTO.ContainerCode;
@@ -241,7 +244,8 @@
                 task.TaskState = TaskStatusEnum.CL_Executing.ObjToInt();
                 
                 //娣诲姞浠诲姟
-                BaseDal.AddData(task);
+                int taskId = BaseDal.AddData(task);
+                WriteLog.Write_Log("瀹瑰櫒鍏ュ簱鍒涘缓浠诲姟", $"浠诲姟淇℃伅", "鍒涘缓鍏ュ簱", $"浠诲姟鍙凤細{taskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                 if (type > 0)
                 {
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, "鎵嬪姩鎸夐挳鍏ュ簱");
@@ -254,6 +258,7 @@
             }
             catch (Exception ex)
             {
+                WriteLog.Write_Log("瀹瑰櫒鍏ュ簱鍒涘缓浠诲姟", $"浠诲姟", "鍒涘缓鍏ュ簱", $"澶辫触锛歿ex.Message}");
                 content.Error($"閿欒淇℃伅:{ex.Message}");
             }
             return content;
@@ -808,6 +813,176 @@
             return content;
         }
         /// <summary>
+        /// 浜哄伐鎵嬪姩鍙栨秷鎸囧畾浠诲姟
+        /// </summary>
+        /// <param name="taskNum">浠诲姟缂栧彿</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public WebResponseContent ManualTaskCancellation(int taskNum)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                // 1. 鑾峰彇浠诲姟淇℃伅
+                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+                if (task == null)return content.Error($"浠诲姟{taskNum}涓嶅瓨鍦�");
+
+                TaskTypeGroup group = task.TaskType.GetTaskTypeGroup();
+                if (group == TaskTypeGroup.InboundGroup)// 鍏ュ簱浠诲姟鍙栨秷
+                {
+                    // 鑾峰彇鐩爣璐т綅
+                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+                    if (locationInfo == null)return content.Error($"鐩爣璐т綅{task.TargetAddress}涓嶅瓨鍦�");
+                    // 楠岃瘉璐т綅鐘舵��
+                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+                        return content.Error($"{task.TargetAddress}璐т綅鐘舵�佸紓甯革紝鏃犳硶鍙栨秷");
+
+                    // 鎭㈠璐т綅鐘舵��
+                    locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); // 鎭㈠涓虹┖闂茬姸鎬�
+                    locationInfo.PalletCode = ""; // 娓呯┖鎵樼洏鍙�
+                    // 鏇存柊鏁版嵁搴�
+                    _unitOfWorkManage.BeginTran();
+                    _locationInfoRepository.UpdateData(locationInfo);
+                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+                    _unitOfWorkManage.CommitTran();
+                    // 璁板綍鐘舵�佸彉鏇�
+                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(
+                        locationInfo,
+                        LocationStatusEnum.Lock,
+                        LocationStatusEnum.Free,
+                        LocationChangeType.InboundCancelled,
+                        task.TaskNum
+                    );
+                    content.OK("浠诲姟鍙栨秷鎴愬姛");
+                }
+                else
+                {
+                    content.Error("鍙兘鍏ュ簱浠诲姟鍙栨秷锛�");
+                }
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error($"鍙栨秷澶辫触: {ex.Message}");
+                // 璁板綍璇︾粏閿欒
+                _taskExecuteDetailService.AddTaskExecuteDetail(
+                    new Dt_Task { TaskNum = taskNum },
+                    $"浠诲姟鍙栨秷寮傚父: {ex.Message}"
+                );
+            }
+            return content;
+        }
+        /// <summary>
+        /// 浠诲姟鍙栨秷
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent TaskCancelCompleted(int taskNum)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//鍑哄簱浠诲姟瀹屾垚閫昏緫
+                {
+                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
+                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+                    {
+                        return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
+                    }
+                    task.TaskState = TaskStatusEnum.Cancel.ObjToInt();
+                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+                    _unitOfWorkManage.BeginTran();
+                    _locationInfoRepository.UpdateData(locationInfo);
+                    BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                    _unitOfWorkManage.CommitTran();
+                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted, task.TaskNum);
+                    content.OK();
+                }
+                else
+                {
+                    content.Error($"鏈壘鍒板嚭搴撲换鍔taskNum}");
+                }
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 浠诲姟鍙栨秷
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent TaskCancel(List<TaskCancel> taskCancels)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                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>();
+                //鍒ゆ柇鏄惁鏈変换鍔″瓨鍦�
+                foreach (var item in taskCancels)
+                {
+                    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode== item.ContainerCode);
+                    if (taskExist==null)
+                    {
+                        content.Message += $"{item.ContainerCode}浠诲姟涓嶅瓨鍦�";
+                        continue;
+                    }
+                    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}浠诲姟鐘舵�佷笉鍙彇娑堬紒");
+                    }
+                    
+                }
+                _unitOfWorkManage.BeginTran();
+                BaseDal.UpdateData(cancelTasks);
+                foreach (var item in cancelTasksCompleted)
+                {
+                    WebResponseContent responseContent = TaskCancelCompleted(item.TaskNum);
+                    if (!responseContent.Status)
+                    {
+                        throw new Exception(responseContent.Message);
+                    }
+                }
+                _unitOfWorkManage.CommitTran();
+                cancelTasks.AddRange(cancelTasksCompleted);
+                foreach (var item in cancelTasks)
+                {
+                    AgvTaskCancelDTO agvTaskCancel = new AgvTaskCancelDTO()
+                    {
+                        RequestId= DateTime.Now.ToString("yyMMddHHmmssfff"),
+                        MissionCode=item.GroupId,
+                        ContainerCode=item.PalletCode,
+                        Position="",
+                        CancelMode= "CTU_REDIRECT_START",
+                        Reason=""
+                    };
+                    AgvCancelTask(agvTaskCancel);
+                }
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
         /// 浜屾湡鎾澧欏洖浼�
         /// </summary>
         /// <returns></returns>
@@ -939,5 +1114,32 @@
             }
             return content;
         }
+        /// <summary>
+        /// 閲嶇疆鎵�鏈夊紓甯镐换鍔�
+        /// </summary>
+        public WebResponseContent ResetAllExceptionTask(int taskNum)
+        {
+            // 鑾峰彇寮傚父浠诲姟990淇敼涓篈GV寰呮墽琛�300
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
+                if (task.TaskState != (int)TaskStatusEnum.Exception)
+                {
+                    return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙噸缃�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
+                }
+                task.TaskState = (int)TaskStatusEnum.AGV_Execute;
+                BaseDal.UpdateData(task);
+                //_taskExecuteDetailService.AddTaskExecuteDetail(task, $"浜哄伐閲嶇疆寮傚父浠诲姟,閲嶇疆鍚庝换鍔$姸鎬併�恵task.TaskState}銆�");
+                content = WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+
     }
 }

--
Gitblit v1.9.3