From c020f31a67fc5aa5644511bddff075f7ecc85234 Mon Sep 17 00:00:00 2001 From: qinchulong <qinchulong@hnkhzn.com> Date: 星期二, 27 五月 2025 15:35:27 +0800 Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/HuaYiZhongHeng/ZhongHeLiTiKu --- 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs | 772 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 772 insertions(+), 0 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" new file mode 100644 index 0000000..dd5870e --- /dev/null +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" @@ -0,0 +1,772 @@ +锘�#region << 鐗� 鏈� 娉� 閲� >> +/*---------------------------------------------------------------- + * 鍛藉悕绌洪棿锛歐IDESEAWCS_TaskInfoService + * 鍒涘缓鑰咃細鑳$搴� + * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36 + * 鐗堟湰锛歏1.0.0 + * 鎻忚堪锛� + * + * ---------------------------------------------------------------- + * 淇敼浜猴細 + * 淇敼鏃堕棿锛� + * 鐗堟湰锛歏1.0.1 + * 淇敼璇存槑锛� + * + *----------------------------------------------------------------*/ +#endregion << 鐗� 鏈� 娉� 閲� >> + +using AutoMapper; +using Newtonsoft.Json; +using SqlSugar; +using System.Diagnostics.CodeAnalysis; +using WIDESEA_Comm.Http; +using WIDESEA_Common.Log; +using WIDESEAWCS_Core; +using WIDESEAWCS_Core.BaseServices; +using WIDESEAWCS_DTO.TaskInfo; +using WIDESEAWCS_ITaskInfoRepository; +using WIDESEAWCS_ITaskInfoService; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob.Models; +using WIDESEAWCS_QuartzJob.Service; +using WIDESEAWCS_Core.Helper; +using WIDESEA_Core.Enums; +using WIDESEAWCS_Core.BaseRepository; +using WIDESEAWCS_DTO.TaskEnum; + + +namespace WIDESEAWCS_TaskInfoService +{ + public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService + { + private readonly IRouterService _routerService; + private readonly ITaskExecuteDetailService _taskExecuteDetailService; + private readonly IUnitOfWorkManage _unitOfWorkManage; + private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; + private readonly IMapper _mapper; + private readonly ITask_HtyService _task_HtyService; + private readonly ITask_HtyRepository _task_HtyRepository; + + private Dictionary<string, OrderByType> _taskOrderBy = new() + { + {nameof(Dt_Task.Grade),OrderByType.Asc }, + {nameof(Dt_Task.CreateDate),OrderByType.Asc}, + }; + + public Dictionary<string, OrderByType> TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } } + + public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); + + public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); + public List<int> TaskTypeEnums => typeof(TaskTypeEnum).GetEnumIndexList(); + + public TaskService(ITaskRepository BaseDal, IRouterService routerService, IUnitOfWorkManage unitOfWorkManage, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService, ITask_HtyRepository task_HtyRepository) : base(BaseDal) + { + _routerService = routerService; + _unitOfWorkManage = unitOfWorkManage; + _taskExecuteDetailService = taskExecuteDetailService; + _taskExecuteDetailRepository = taskExecuteDetailRepository; + _mapper = mapper; + _task_HtyService = task_HtyService; + _task_HtyRepository = task_HtyRepository; + } + public string url = AppSettings.Configuration["WMS"]; + /// <summary> + /// 鎺ユ敹WMS浠诲姟淇℃伅 + /// </summary> + /// <param name="taskDTOs">WMS浠诲姟瀵硅薄闆嗗悎</param> + /// <returns>杩斿洖澶勭悊缁撴灉</returns> + public WebResponseContent ReceiveWMSTask([NotNull] List<WMSTaskDTO> taskDTOs) + { + WebResponseContent content = new WebResponseContent(); + try + { + List<Dt_Task> tasks = new List<Dt_Task>(); + _unitOfWorkManage.BeginTran(); + foreach (var item in taskDTOs) + { + if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode) != null) + { + throw new Exception($"鏈夐噸澶嶄换鍔�"); + } + Dt_Task task = _mapper.Map<Dt_Task>(item); + tasks.Add(task); + } + BaseDal.AddData(tasks); + _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "鎺ユ敹WMS浠诲姟"); + content = WebResponseContent.Instance.OK($"娣诲姞浠诲姟鎴愬姛"); + _unitOfWorkManage.CommitTran(); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content = WebResponseContent.Instance.Error($"{ex.Message}"); + } + finally + { + WriteLog.GetLog("鎺ユ敹浠诲姟").Write($"鎺ユ敹鍙傛暟锛歿JsonConvert.SerializeObject(taskDTOs)}{Environment.NewLine}鎶ユ枃锛歿JsonConvert.SerializeObject(content)}", "鎺ユ敹浠诲姟"); + } + return content; + } + + /// <summary> + /// 鏍规嵁鎵樼洏鍙枫�佽捣濮嬪湴鍧�鍚慦MS璇锋眰浠诲姟 + /// </summary> + /// <param name="palletCode">鎵樼洏鍙�</param> + /// <param name="sourceAddress">璧峰鍦板潃</param> + /// <returns></returns> + public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress) + { + WebResponseContent content = new WebResponseContent(); + try + { + WMSTaskDTO taskDTO = new WMSTaskDTO() + { + TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")), + Grade = 1, + Depth = 1, + PalletCode = palletCode, + RoadWay = "SC01", + SourceAddress = sourceAddress, + TargetAddress = "SC01", + TaskStatus = (int)TaskInStatusEnum.InNew, + Id = 0, + TaskType = (int)TaskInboundTypeEnum.Inbound + }; + + content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO }); + } + catch (Exception ex) + { + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎鏈墽琛岀殑浠诲姟 + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns></returns> + public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress) + { + return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy); + } + + /// <summary> + /// 鏍规嵁浠诲姟鍙枫�佷笅涓�鍦板潃鏌ヨ杈撻�佺嚎鎵ц涓殑浠诲姟 + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <param name="nextAddress">涓嬩竴鍦板潃</param> + /// <returns></returns> + public Dt_Task QueryExecutingConveyorLineTask(int taskNum, string nextAddress) + { + return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskStatus == (int)TaskInStatusEnum.Line_InExecuting || x.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy); + } + + /// <summary> + /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎瀹屾垚鐨勪换鍔� + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns></returns> + public Dt_Task QueryCompletedConveyorLineTask(int taskNum, string currentAddress) + { + return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || x.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy); + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佷换鍔$被鍨嬪垎缁�(鍙��)鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔� + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="taskTypeGroup">浠诲姟绫诲瀷鍒嗙粍(鍙��)</param> + /// <returns></returns> + public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null) + { + if(taskTypeGroup == null) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew), TaskOrderBy); + if(taskTypeGroup.Value == TaskTypeGroup.InboundGroup) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); + if(taskTypeGroup.Value == TaskTypeGroup.OutbondGroup) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + return null; + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔� + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> + public Dt_Task? QueryStackerCraneTask(string deviceNo, string currentAddress = "") + { + return BaseDal.QueryFirst(x => true, TaskOrderBy); + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍏ュ簱绫诲瀷鐨勬柊澧炵殑浠诲姟 + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> + public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "") + { + Dt_Task taskGrade = BaseDal.QueryFirst(x =>true, TaskOrderBy); + if (taskGrade != null) + { + return taskGrade; + } + else + { + Dt_Task task = BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + Dt_Task tasks = BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew, TaskOrderBy); + if (task != null && tasks == null) + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + else if (task == null && tasks != null) + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + else + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + } + } + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟 + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> + public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "") + { + Dt_Task taskGrade = BaseDal.QueryFirst(x => true, TaskOrderBy); + if (taskGrade != null) + { + return taskGrade; + } + else + { + Dt_Task task = BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + Dt_Task tasks = BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew, TaskOrderBy); + if (task != null && tasks == null) + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + else if (task == null && tasks != null) + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskInStatusEnum.InNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + else + { + if (string.IsNullOrEmpty(currentAddress)) + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); + else + return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); + } + + } + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟 + /// </summary> + /// <param name="deviceNo">璁惧缂栧彿</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns> + public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, string outStationCodes) + { + List<Dt_Task> taskGrade = BaseDal.QueryData(x => true, TaskOrderBy); + if (taskGrade != null) + { + return taskGrade; + } + else + { + return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskTypeEnums.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && x.TargetAddress == outStationCodes, TaskOrderBy); + } + } + + /// <summary> + /// 鏇存柊浠诲姟寮傚父淇℃伅鏄剧ず + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <param name="message">寮傚父淇℃伅</param> + public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + if (task.TaskType == (int)TaskTypeEnum.Outbound || task.TaskType == (int)TaskTypeEnum.PalletOutbound) + { + task.TaskStatus = (int)OutTaskStatusEnum.OutException; + } + else if (task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound) + { + task.TaskStatus = (int)InTaskStatusEnum.InException; + } + else if (task.TaskType == (int)TaskTypeEnum.Relocation) + { + task.TaskStatus = (int)InTaskStatusEnum.RelocationException; + } + + task.ExceptionMessage = message; + task.ModifyDate = DateTime.Now; + BaseDal.UpdateData(task); + + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage); + + content = WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + + /// <summary> + /// 鏇存柊浠诲姟鐘舵�佷俊鎭紝骞跺悓姝ヨ嚦WMS + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <param name="status">浠诲姟鐘舵��</param> + public void UpdateTaskStatus(int taskNum, int status) + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return; + task.TaskStatus = status; + task.ModifyDate = DateTime.Now; + BaseDal.UpdateData(task); + } + + /// <summary> + /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬� + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + public WebResponseContent UpdateTaskStatusToNext(int taskNum) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�!"); + return UpdateTaskStatusToNext(task); + } + catch (Exception ex) + { + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + + /// <summary> + /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬� + /// </summary> + /// <param name="task">浠诲姟瀹炰綋瀵硅薄</param> + /// <returns></returns> + public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) + { + WebResponseContent content = new WebResponseContent(); + try + { + int oldState = task.TaskStatus; + if (task.TaskType == (int)TaskTypeEnum.Outbound|| task.TaskType == (int)TaskTypeEnum.PalletOutbound) + { + task.TaskStatus = OutTaskStatusEnum.SC_OutExecuting.ObjToInt(); + } + else if (task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound) + { + task.TaskStatus = (int)InTaskStatusEnum.SC_InExecuting; + } + else if (task.TaskType == (int)TaskTypeEnum.Relocation) + { + task.TaskStatus = (int)InTaskStatusEnum.RelocationExecuting; + } + else + { + throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�"); + } + + if (task.TaskStatus <= 0) + { + return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�"); + } + _unitOfWorkManage.BeginTran(); + task.Dispatchertime = DateTime.Now; + task.ModifyDate = DateTime.Now; + task.Modifier = "System"; + BaseDal.UpdateData(task); + var response = HttpHelpers.Post<WebResponseContent>(url + "UpdateTaskStatus?taskNum=" + task.TaskNum, "", "鏇存柊浠诲姟鐘舵��"); + if (!response.Status) + { + _unitOfWorkManage.RollbackTran(); + } + _unitOfWorkManage.CommitTran(); + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskStatus}銆�" : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskStatus}銆�"); + content = WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + + /// <summary> + /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏇存柊浠诲姟浣嶇疆淇℃伅 + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <param name="currentAddress">褰撳墠鍦板潃</param> + /// <returns></returns> + public Dt_Task? UpdatePosition(int taskNum, string currentAddress) + { + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress); + if (task == null) throw new Exception($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + + string oldCurrentPos = task.CurrentAddress; + string oldNextPos = task.NextAddress; + + List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); + if (!routers.Any()) throw new Exception($"鏈壘鍒拌澶囪矾鐢变俊鎭�"); + + task.CurrentAddress = task.NextAddress; + task.NextAddress = routers.FirstOrDefault().ChildPosi; + + task.ModifyDate = DateTime.Now; + task.Modifier = "System"; + BaseDal.UpdateData(task); + + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"绯荤粺鑷姩娴佺▼锛屾洿鏂板綋鍓嶄綅缃�恵oldCurrentPos} ----> {task.CurrentAddress}銆戝拰涓嬩竴浣嶇疆銆恵oldNextPos} ----> {task.NextAddress}銆�"); + return task; + } + catch (Exception ex) + { + } + return null; + } + + /// <summary> + /// 浠诲姟瀹屾垚 + /// </summary> + /// <param name="taskNum">浠诲姟缂栧彿</param> + /// <returns>杩斿洖澶勭悊缁撴灉</returns> + public WebResponseContent StackCraneTaskCompleted(int taskNum) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + + task.ModifyDate = DateTime.Now; + task.Modifier = "WMS"; + if (task.TaskType == (int)TaskTypeEnum.Outbound || task.TaskType == (int)TaskTypeEnum.PalletOutbound) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)OutTaskStatusEnum.OutFinish; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳畬鎴�"); + if(App.User.UserId > 0) + { + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCompleted?taskNum=" + task.TaskNum, "", "浠诲姟瀹屾垚"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else if (task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)InTaskStatusEnum.InFinish; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄叆搴撳畬鎴�"); + if (App.User.UserId > 0) + { + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCompleted?taskNum=" + task.TaskNum, "", "浠诲姟瀹屾垚"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else if (task.TaskType== (int)TaskTypeEnum.Relocation) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)InTaskStatusEnum.RelocationFinish; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈虹Щ搴撳畬鎴�"); + if (App.User.UserId > 0) + { + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCompleted?taskNum=" + task.TaskNum, "", "浠诲姟瀹屾垚"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�"); + } + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content = WebResponseContent.Instance.Error($"浠诲姟瀹屾垚寮傚父,浠诲姟鍙�:銆恵taskNum}銆�,寮傚父淇℃伅锛歿ex.Message}"); + } + finally + { + WriteLog.GetLog("瀹屾垚浠诲姟").Write($"鎿嶄綔浜猴細{(App.User.UserId > 0 ? App.User.UserName : "")}{Environment.NewLine}浠诲姟鍙凤細{taskNum}{Environment.NewLine}{JsonConvert.SerializeObject(content)}", "瀹屾垚浠诲姟"); + } + return content; + } + + public WebResponseContent TaskCancel(int taskNum) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + + task.ModifyDate = DateTime.Now; + task.Modifier = "WMS"; + if (task.TaskType == (int)TaskTypeEnum.Outbound || task.TaskType == (int)TaskTypeEnum.PalletOutbound) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)OutTaskStatusEnum.OutCancel; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄嚭搴撳彇娑�"); + if (App.User.UserId > 0) + { + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCancel?taskNum=" + task.TaskNum, "", "鍙栨秷浠诲姟"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + UpdateTaskExceptionMessage(task.TaskNum, $"鍫嗗灈鏈轰换鍔″彇娑堝け璐�"); + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else if (task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)InTaskStatusEnum.InCancel; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄叆搴撳彇娑�"); + if (App.User.UserId > 0) + { + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCancel?taskNum=" + task.TaskNum, "", "鍙栨秷浠诲姟"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + UpdateTaskExceptionMessage(task.TaskNum, $"鍫嗗灈鏈轰换鍔″彇娑堝け璐�"); + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else if (task.TaskType == (int)TaskTypeEnum.Relocation) + { + _unitOfWorkManage.BeginTran(); + task.TaskStatus = (int)InTaskStatusEnum.RelocationCancel; + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈虹Щ搴撳彇娑�"); + if (App.User.UserId > 0) + { + task.Modifier = "System"; + var response = HttpHelpers.Post<WebResponseContent>(url + "TaskCancel?taskNum=" + task.TaskNum, "", "鍙栨秷浠诲姟"); + if (response.Status) + { + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + UpdateTaskExceptionMessage(task.TaskNum, $"鍫嗗灈鏈轰换鍔″彇娑堝け璐�"); + _unitOfWorkManage.RollbackTran(); + return content = WebResponseContent.Instance.Error(response.Message); + } + } + BaseDal.DeleteData(task); + _task_HtyService.AddTaskHty(task); + _unitOfWorkManage.CommitTran(); + return content.OK(); + } + else + { + throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�"); + } + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + return content.Error(ex.Message); + } + finally + { + WriteLog.GetLog("鍙栨秷浠诲姟").Write($"鎿嶄綔浜猴細{(App.User.UserId > 0 ? App.User.UserName : "")}{Environment.NewLine}浠诲姟鍙凤細{taskNum}{Environment.NewLine}{JsonConvert.SerializeObject(content)}", "鍙栨秷浠诲姟"); + } + } + /// <summary> + /// 鎭㈠鎸傝捣浠诲姟 + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <returns>杩斿洖澶勭悊缁撴灉</returns> + public WebResponseContent TaskStatusRecovery(int taskNum) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + if (task.TaskStatus != (int)TaskInStatusEnum.InPending && task.TaskStatus != (int)TaskOutStatusEnum.OutPending) + { + return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙仮澶�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�"); + } + + Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); + if (taskExecuteDetail != null) + { + task.TaskStatus = taskExecuteDetail.TaskState; + } + else + { + if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) + { + task.TaskStatus = (int)TaskOutStatusEnum.OutNew; + } + else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) + { + task.TaskStatus = (int)TaskInStatusEnum.InNew; + } + //todo + } + + task.ExceptionMessage = string.Empty; + + BaseDal.UpdateData(task); + + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐鎭㈠鎸傝捣浠诲姟,鎭㈠鎸傝捣鏃朵换鍔$姸鎬併�恵task.TaskStatus}銆�"); + + content = WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + + /// <summary> + /// 鍥炴粴浠诲姟鐘舵�� + /// </summary> + /// <param name="taskNum">浠诲姟鍙�</param> + /// <returns>杩斿洖澶勭悊缁撴灉</returns> + public WebResponseContent RollbackTaskStatusToLast(int taskNum) + { + WebResponseContent content = new(); + try + { + Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); + if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); + + int oldState = task.TaskStatus; + Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskStatus && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); + if (taskExecuteDetail != null) + { + task.TaskStatus = taskExecuteDetail.TaskState; + task.CurrentAddress = taskExecuteDetail.CurrentAddress; + task.NextAddress = taskExecuteDetail.NextAddress; + } + else + { + return content = WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔℃槑缁嗕俊鎭�,璇ヤ换鍔$姸鎬佷笉鍙洖婊氬埌涓婁竴姝�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�"); + } + + task.ExceptionMessage = string.Empty; + + BaseDal.UpdateData(task); + + _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戝洖婊氬埌銆恵task.TaskStatus}銆�"); + + content = WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + content = WebResponseContent.Instance.Error(ex.Message); + } + return content; + } + } +} -- Gitblit v1.9.3