From 16749e23b489ee24f993fe9e87346680b7bcf63a Mon Sep 17 00:00:00 2001 From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com> Date: 星期五, 10 十月 2025 21:14:49 +0800 Subject: [PATCH] 代码提交 --- 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs | 1042 +++++++++++++++++++++++++++++++++------------------------ 1 files changed, 600 insertions(+), 442 deletions(-) diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs" index 5e91b77..9417b92 100644 --- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs" +++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs" @@ -31,7 +31,6 @@ private readonly IDt_AreaInfoRepository _areaInfoRepository; //鍖哄煙 private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly ISys_ConfigService _configService; - private readonly ISimpleCacheService _simpleCacheService; public Dt_TaskService(IDt_TaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, @@ -45,8 +44,7 @@ IDt_AreaInfoRepository areaInfoRepository, IStockInfoDetailRepository stockInfoDetailRepository, IDt_StationManagerRepository stationManagerRepository, - ISys_ConfigService configService, - ISimpleCacheService simpleCacheService) : base(BaseDal) + ISys_ConfigService configService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _stockInfoRepository = stockInfoRepository; @@ -60,7 +58,6 @@ _stockInfoDetailRepository = stockInfoDetailRepository; _stationManagerRepository = stationManagerRepository; _configService = configService; - _simpleCacheService = simpleCacheService; } #region 澶栭儴鎺ュ彛鏂规硶 @@ -72,7 +69,16 @@ WebResponseContent content = new WebResponseContent(); try { - + task.TaskState = (int)TaskOutStatusEnum.OutFinish; + var taskHty = task.Adapt<Dt_Task_Hty>(); + taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.浜哄伐瀹屾垚 : (int)OperateTypeEnum.鑷姩瀹屾垚; + taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; + await _unitOfWorkManage.UseTranAsync(async () => + { + await DeleteTaskAsync(task.TaskId); + await AddTaskHtyAsync(taskHty); + }); } catch (Exception ex) { @@ -81,6 +87,590 @@ return content; } + + + #endregion 鍑哄簱浠诲姟瀹屾垚 + + #region 绉诲簱浠诲姟瀹屾垚 + + /// <summary> + /// 绉诲簱浠诲姟瀹屾垚 + /// </summary> + /// <param name="saveModel">浠诲姟鏁版嵁鍚堥泦</param> + /// <returns>杩斿洖缁撴灉闆�</returns> + public async Task<WebResponseContent> CompleteTransferTaskAsync(Dt_Task task, DtStockInfo stock) + { + WebResponseContent content = new WebResponseContent(); + try + { + // 鏇存柊璐т綅鍜屽簱瀛樹俊鎭� + (DtStockInfo updateStock, DtLocationInfo locationInForm, DtLocationInfo locationInfoTo) = UpdateStockLocation(stock, task); + var taskHty = CreateHistoricalTask(task); + LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "绉诲簱浠诲姟瀹屾垚", $"璐т綅鍦板潃锛歿task.TargetAddress},淇敼鍚庡簱瀛樻暟鎹細{JsonConvert.SerializeObject(updateStock)}锛屽師鍏堣揣浣嶆暟鎹細{locationInForm}"); + + // 鎵ц鏁版嵁搴撲簨鍔� + bool isResult = false; + if (isResult) + content.OK("绉诲簱浠诲姟瀹屾垚鎴愬姛"); + else + content.Error("绉诲簱浠诲姟瀹屾垚澶辫触"); + } + catch (Exception err) + { + Console.WriteLine(err.Message.ToString()); + } + return content; + } + + #endregion 绉诲簱浠诲姟瀹屾垚 + + #region 鍏ュ簱浠诲姟瀹屾垚 + + /// <summary> + /// 瀹屾垚鍏ュ簱浠诲姟 + /// </summary> + /// <param name="task">浠诲姟鏁版嵁鍚堥泦</param> + /// <returns>杩斿洖缁撴灉闆�</returns> + public async Task<WebResponseContent> CompleteInboundTaskAsync(Dt_Task task) + { + WebResponseContent content = new WebResponseContent(); + try + { + task.TaskState = (int)TaskInStatusEnum.InFinish; + var taskHty = task.Adapt<Dt_Task_Hty>(); + taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.浜哄伐瀹屾垚 : (int)OperateTypeEnum.鑷姩瀹屾垚; + taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; + await _unitOfWorkManage.UseTranAsync(async () => + { + await DeleteTaskAsync(task.TaskId); + await AddTaskHtyAsync(taskHty); + }); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + return content; + } + + + #endregion 鍏ュ簱浠诲姟瀹屾垚 + + #region AGV鎼繍浠诲姟瀹屾垚 + public async Task<WebResponseContent> CompleteCarryTaskAsync(Dt_Task task,DtStockInfo stockInfo) + { + WebResponseContent content = new WebResponseContent(); + try + { + task.TaskState = (int)TaskAGVCarryStatusEnum.CarryFinish; + var taskHty = task.Adapt<Dt_Task_Hty>(); + taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.浜哄伐瀹屾垚 : (int)OperateTypeEnum.鑷姩瀹屾垚; + taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; + await _unitOfWorkManage.UseTranAsync(async () => + { + await DeleteTaskAsync(task.TaskId); + await AddTaskHtyAsync(taskHty); + }); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + return content; + } + + #endregion + + #region AGV璺ㄦゼ灞備换鍔″畬鎴� + public async Task<WebResponseContent> CompleteAcrossFloorTaskAsync(Dt_Task task, DtStockInfo stockInfo) + { + WebResponseContent content = new WebResponseContent(); + try + { + task.TaskState = (int)TaskAcrossFloorStatusEnum.CarryFinish; + var taskHty = task.Adapt<Dt_Task_Hty>(); + taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.浜哄伐瀹屾垚 : (int)OperateTypeEnum.鑷姩瀹屾垚; + taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; + await _unitOfWorkManage.UseTranAsync(async () => + { + await DeleteTaskAsync(task.TaskId); + await AddTaskHtyAsync(taskHty); + }); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + return content; + } + + #endregion + + #region 浠诲姟瀹屾垚 + + /// <summary> + /// 瀹屾垚浠诲姟 + /// </summary> + /// <param name="taskNum">浠诲姟缂栧彿</param> + /// <returns>杩斿洖缁撴灉闆�</returns> + public async Task<WebResponseContent> CompleteAsync(int taskNum) + { + // 鍒濆鍖栧搷搴斿唴瀹� + WebResponseContent content = new WebResponseContent(); + + // 鎻愬彇浠诲姟鏁版嵁 + LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "鎻愬彇浠诲姟鏁版嵁", $"浠诲姟鍙凤細{taskNum}"); + + // 楠岃瘉浠诲姟鏄惁瀛樺湪 + var task = await GetByTaskNum(taskNum); + if (task == null) + { + return content.Error("浠诲姟涓嶅瓨鍦�"); + } + LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "楠岃瘉浠诲姟鏄惁瀛樺湪", JsonConvert.SerializeObject(task)); + + + // 楠岃瘉搴撳瓨鏄惁瀛樺湪 + var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); + + if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) + { + return await CompleteOutboundTaskAsync(task, stock); + } + else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) + { + return await CompleteInboundTaskAsync(task); + } + else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup) + { + return await CompleteTransferTaskAsync(task, stock); + } + else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.CarryGroup) + { + return await CompleteCarryTaskAsync(task, stock); + } + else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup) + { + return await CompleteAcrossFloorTaskAsync(task, stock); + } + else + { + return content.Error("鏈壘鍒颁换鍔$被鍨�"); + } + } + + #endregion 浠诲姟瀹屾垚 + + #region 璇锋眰浠诲姟鍏ュ簱 + + public async Task<WebResponseContent> RequestTaskAsync(RequestTaskDto taskDto) + { + WebResponseContent content = new WebResponseContent(); + + try + { + var task = await GetByTaskAddress(taskDto.Position, taskDto.TargetAddress); + if (task != null) + { + return content.Error("璧风偣鎴栫粓鐐瑰瓨鍦ㄤ换鍔�"); + } + var station = _stationManagerRepository.QueryFirst(x => x.stationType == 1 && x.Roadway == "SC1"); + + Dt_Task taskNew = new Dt_Task + { + Grade = 1, + Roadway = "SC1", + TargetAddress = taskDto.TargetAddress, + Dispatchertime = DateTime.Now, + MaterialNo = "", + NextAddress = station.stationChildCode, + OrderNo = null, + PalletCode = taskDto.PalletCode, + SourceAddress = taskDto.Position, + CurrentAddress = taskDto.Position, + TaskState = (int)TaskInStatusEnum.InNew, + TaskType = (int)TaskInboundTypeEnum.Inbound, + TaskNum = BaseDal.GetTaskNo().Result, + CreateDate = DateTime.Now, + TaskId = 0, + AGVTaskNum = GenerateUniqueId(), + Floor = "1F", + }; + var taskDTO = CreateListTaskDTO(taskNew); + + return content = await SendWCSTask(taskDTO); + } + catch (Exception err) + { + content.Error(err.Message); + } + + return content; + } + + /// <summary> + /// 鏇存柊浠诲姟璐т綅 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<WebResponseContent> UpdateExistingTask(RequestTaskDto input) + { + WebResponseContent content = new WebResponseContent(); + try + { + var task = await BaseDal.QueryFirstAsync(x => x.PalletCode == input.PalletCode); + if (task == null) + return content.Error($"鏆傛湭鎵惧埌銆恵input.PalletCode}銆戠殑浠诲姟"); + + return content = await UpdateExistingTask(input, task); + } + catch (Exception err) + { + return content.Error(err.Message); + } + } + + #endregion 璇锋眰浠诲姟鍏ュ簱 + + #region 璇锋眰鍑哄簱 + + /// <summary> + /// 璇锋眰鎵樼洏浠诲姟 + /// </summary> + /// <param name="position">鐩爣浣嶇疆</param> + /// <param name="tag">鎵樼洏绫诲瀷锛�1锛氬疄鐩橈紝2锛氱┖鐩橈級</param> + /// <param name="areaCode">鍖哄煙缂栫爜</param> + /// <param name="roadways">宸烽亾缂栫爜闆嗗悎</param> + /// <returns>杩斿洖缁撴灉闆�</returns> + public async Task<WebResponseContent> RequestOutTaskAsync(RequestTaskDto taskDto) + { + WebResponseContent content = new WebResponseContent(); + try + { + var task = await GetByTaskAddress(taskDto.Position, taskDto.TargetAddress); + if (task != null) + { + return content.Error("璧风偣鎴栫粓鐐瑰瓨鍦ㄤ换鍔�"); + } + var station = _stationManagerRepository.QueryFirst(x => x.stationType == 1 && x.Roadway == "SC1"); + + Dt_Task taskNew = new Dt_Task + { + Grade = 1, + Roadway = "SC1", + TargetAddress = taskDto.TargetAddress, + Dispatchertime = DateTime.Now, + MaterialNo = "", + NextAddress = station.stationChildCode, + OrderNo = null, + PalletCode = taskDto.PalletCode, + SourceAddress = taskDto.Position, + CurrentAddress = taskDto.Position, + TaskState = (int)TaskOutStatusEnum.OutNew, + TaskType = (int)TaskOutboundTypeEnum.Outbound, + TaskNum = BaseDal.GetTaskNo().Result, + CreateDate = DateTime.Now, + TaskId = 0, + AGVTaskNum = GenerateUniqueId(), + Floor = "1F", + }; + var taskDTO = CreateListTaskDTO(taskNew); + + return content = await SendWCSTask(taskDTO); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + } + + + #endregion 璇锋眰鍑哄簱锛堝疄鐩�&绌虹洏锛� + + #region 璇锋眰璺ㄦゼ灞�2浠诲姟 + /// <summary> + /// 璇锋眰璺ㄦゼ灞�2浠诲姟 + /// </summary> + /// <param name="taskDto"></param> + /// <returns></returns> + public async Task<WebResponseContent> AcrossFloorTaskAsync(RequestAcrossFloorTaskDto taskDto) + { + WebResponseContent content=new WebResponseContent(); + try + { + var task = BaseDal.QueryFirst(x => x.TaskNum == Convert.ToInt32(taskDto.TaskNum) && x.PalletCode == taskDto.PalletCode); + if(task == null) + return content.Error("鏈壘鍒颁换鍔�"); + Dt_Task taskNew = new Dt_Task + { + Grade = 1, + Roadway = "AGV", + TargetAddress = task.TargetAddress, + Dispatchertime = DateTime.Now, + MaterialNo = "", + NextAddress = taskDto.NextAddress, + OrderNo = null, + PalletCode = task.PalletCode, + SourceAddress = taskDto.NextAddress, + CurrentAddress = taskDto.NextAddress, + TaskState = (int)TaskAcrossFloorStatusEnum.SecondCarry, + TaskType = (int)TaskAcrossFloorTypeEnum.AcrossFloorCarry, + TaskNum = BaseDal.GetTaskNo().Result, + CreateDate = DateTime.Now, + TaskId = 0, + AGVTaskNum = GenerateUniqueId(), + Floor = "", + }; + var taskDTO = CreateTaskDTO(taskNew); + + var taskHty = task.Adapt<Dt_Task_Hty>(); + taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.浜哄伐瀹屾垚 : (int)OperateTypeEnum.鑷姩瀹屾垚; + taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; + await _unitOfWorkManage.UseTranAsync(async () => + { + await DeleteTaskAsync(task.TaskId); + await AddTaskHtyAsync(taskHty); + }); + return content.OK(data: taskDTO); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + } + + #endregion + + #region 璇锋眰璺ㄦゼ灞備换鍔� + public async Task<WebResponseContent> RequestAcrossFloorTaskAsync(RequestTaskDto taskDto) + { + WebResponseContent content = new WebResponseContent(); + try + { + var task = await GetByTaskAddress(taskDto.Position, taskDto.TargetAddress); + if (task != null) + { + return content.Error("璧风偣鎴栫粓鐐瑰瓨鍦ㄤ换鍔�"); + } + var station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == taskDto.Position); + + if (station != null) + { + var next = _stationManagerRepository.QueryFirst(x => x.stationType == 5 && x.stationFloor == station.stationFloor); + Dt_Task taskNew = new Dt_Task + { + Grade = 1, + Roadway = "AGV", + TargetAddress = taskDto.TargetAddress, + Dispatchertime = DateTime.Now, + MaterialNo = "", + NextAddress = next.stationChildCode, + OrderNo = null, + PalletCode = taskDto.PalletCode, + SourceAddress = taskDto.Position, + CurrentAddress = taskDto.Position, + TaskState = (int)TaskAcrossFloorStatusEnum.CarryNew, + TaskType = (int)TaskAcrossFloorTypeEnum.AcrossFloorCarry, + TaskNum = BaseDal.GetTaskNo().Result, + CreateDate = DateTime.Now, + TaskId = 0, + AGVTaskNum = GenerateUniqueId(), + Floor = station.stationFloor, + }; + var taskDTO = CreateListTaskDTO(taskNew); + + return content = await SendWCSTask(taskDTO); + } + return content.Error("鏈壘鍒版彁鍗囨満绔欑偣"); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + } + + #endregion + + #region 璇锋眰AGV鎼繍浠诲姟 + public async Task<WebResponseContent> RequestAGVCarryTaskAsync(RequestTaskDto taskDto) + { + WebResponseContent content = new WebResponseContent(); + try + { + var task = await GetByTaskAddress(taskDto.Position,taskDto.TargetAddress); + if (task != null) + { + return content.Error("璧风偣鎴栫粓鐐瑰瓨鍦ㄤ换鍔�"); + } + var station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == taskDto.Position); + Dt_Task taskNew = new Dt_Task + { + Grade = 1, + Roadway = "AGV", + TargetAddress = taskDto.TargetAddress, + Dispatchertime = DateTime.Now, + MaterialNo = "", + NextAddress = taskDto.TargetAddress, + OrderNo = null, + PalletCode = taskDto.PalletCode, + SourceAddress = taskDto.Position, + CurrentAddress = taskDto.Position, + TaskState = (int)TaskAGVCarryStatusEnum.CarryNew, + TaskType = (int)TaskAGVCarryTypeEnum.Carry, + TaskNum = BaseDal.GetTaskNo().Result, + CreateDate = DateTime.Now, + TaskId = 0, + AGVTaskNum = GenerateUniqueId(), + Floor = station.stationFloor, + }; + var taskDTO = CreateListTaskDTO(taskNew); + + return content = await SendWCSTask(taskDTO); + } + catch (Exception ex) + { + return content.Error(ex.Message); + } + } + + #endregion + + #region 浠诲姟鐘舵�佹洿鏀� + + /// <summary> + /// 鏇存柊浠诲姟鐘舵��&鍑哄簱瑙g洏 + /// </summary> + /// <param name="taskNum"></param> + /// <param name="taskState"></param> + /// <returns></returns> + public async Task<WebResponseContent> UpdateTaskStatus(int taskNum, int taskState) + { + WebResponseContent content = new WebResponseContent(); + try + { + var task = await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); + if (task == null) + return content.Error("鏈壘鍒颁换鍔�"); + + if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskInStatusEnum.SC_InFinish) + { + var taskHty = CreateHistoricalTask(task); + await _unitOfWorkManage.UseTranAsync(async () => + { + var asb = await BaseDal.DeleteDataByIdAsync(task.TaskId); + var asbHty = await _task_HtyRepository.AddDataAsync(taskHty) > 0; + if (asb && asbHty) + content.OK(); + else + throw new Exception(); + }); + content.OK(); + } + else + { + task.TaskState = taskState; + var asb = await BaseDal.UpdateDataAsync(task); + if (asb) + content.OK(); + else + content.Error(); + } + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } + + #endregion 浠诲姟鐘舵�佹洿鏀� + + #region 鑾峰彇AGV浠诲姟鍙� + + private static readonly Random _random = new Random(); + + public static string GenerateUniqueId() + { + // 鑾峰彇褰撳墠姣绾ф椂闂存埑 + long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + + // 鐢熸垚4浣嶉殢鏈烘暟锛�0000-9999锛� + int randomNumber = _random.Next(0, 10000); + string randomPart = randomNumber.ToString("D4"); // 琛ラ浂鍒�4浣� + + return $"{timestamp}{randomPart}"; + } + #endregion + + #endregion 澶栭儴鎺ュ彛鏂规硶 + + #region 璋冪敤WCS鎺ュ彛 + private string GetAGVIPAddress(string baseIp, string name) + { + var configz = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); + var wcsBasez = configz.Where(x => x.ConfigKey == baseIp).FirstOrDefault()?.ConfigValue; + var address = configz.Where(x => x.ConfigKey == name).FirstOrDefault()?.ConfigValue; + if (wcsBasez == null || address == null) + { + throw new InvalidOperationException("WMS IP 鏈厤缃�"); + } + return wcsBasez + address; + } + public async Task<WebResponseContent> SendWCSTask(List<WMSTaskDTO> taskDTO) + { + WebResponseContent content = new WebResponseContent(); + var AgvSendTaskAddrss = GetAGVIPAddress(SysConfigConst.WCSIPAddress, SysConfigConst.ReceiveTask); + // 鍙戦�佽姹傚苟绛夊緟鍝嶅簲 + var result = await HttpHelper.PostAsync(AgvSendTaskAddrss, taskDTO.ToJsonString()); + + content = JsonConvert.DeserializeObject<WebResponseContent>(result.ToString()); + + return content; + } + #endregion + + #region 鍐呴儴璋冪敤鏂规硶 + + /// <summary> + /// 鍒涘缓浠诲姟DTO + /// </summary> + private List<WMSTaskDTO> CreateListTaskDTO(Dt_Task task) + { + return new List<WMSTaskDTO> { new WMSTaskDTO + { + TaskNum = task.TaskNum.Value, + Grade = task.Grade.Value, + PalletCode = task.PalletCode, + RoadWay = task.Roadway, + SourceAddress = task.SourceAddress, + TargetAddress = task.TargetAddress, + TaskState = task.TaskState.Value, + Id = 0, + TaskType = task.TaskType, + AGVTaskNum = task.AGVTaskNum, + } }; + } + + private WMSTaskDTO CreateTaskDTO(Dt_Task task) + { + return new WMSTaskDTO + { + TaskNum = task.TaskNum.Value, + Grade = task.Grade.Value, + PalletCode = task.PalletCode, + RoadWay = task.Roadway, + SourceAddress = task.SourceAddress, + TargetAddress = task.TargetAddress, + TaskState = task.TaskState.Value, + Id = 0, + TaskType = task.TaskType, + AGVTaskNum = task.AGVTaskNum, + }; + } private async Task DeleteStockInfoAsync(int stockId) { var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(stockId); @@ -136,316 +726,6 @@ } } - #endregion 鍑哄簱浠诲姟瀹屾垚 - - #region 绉诲簱浠诲姟瀹屾垚 - - /// <summary> - /// 绉诲簱浠诲姟瀹屾垚 - /// </summary> - /// <param name="saveModel">浠诲姟鏁版嵁鍚堥泦</param> - /// <returns>杩斿洖缁撴灉闆�</returns> - public async Task<WebResponseContent> CompleteTransferTaskAsync(Dt_Task task, DtStockInfo stock) - { - WebResponseContent content = new WebResponseContent(); - try - { - // 鏇存柊璐т綅鍜屽簱瀛樹俊鎭� - (DtStockInfo updateStock, DtLocationInfo locationInForm, DtLocationInfo locationInfoTo) = UpdateStockLocation(stock, task); - var taskHty = CreateHistoricalTask(task); - LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "绉诲簱浠诲姟瀹屾垚", $"璐т綅鍦板潃锛歿task.TargetAddress},淇敼鍚庡簱瀛樻暟鎹細{JsonConvert.SerializeObject(updateStock)}锛屽師鍏堣揣浣嶆暟鎹細{locationInForm}"); - - // 鎵ц鏁版嵁搴撲簨鍔� - bool isResult = false; - if (isResult) - content.OK("绉诲簱浠诲姟瀹屾垚鎴愬姛"); - else - content.Error("绉诲簱浠诲姟瀹屾垚澶辫触"); - } - catch (Exception err) - { - Console.WriteLine(err.Message.ToString()); - } - return content; - } - - #endregion 绉诲簱浠诲姟瀹屾垚 - - #region 鍏ュ簱浠诲姟瀹屾垚 - - /// <summary> - /// 瀹屾垚鍏ュ簱浠诲姟 - /// </summary> - /// <param name="task">浠诲姟鏁版嵁鍚堥泦</param> - /// <returns>杩斿洖缁撴灉闆�</returns> - public async Task<WebResponseContent> CompleteInboundTaskAsync(Dt_Task task) - { - // 鍒濆鍖栧搷搴斿唴瀹� - WebResponseContent content = new WebResponseContent(); - try - { - - } - catch (Exception ex) - { - content.Error(ex.Message); - } - return content; - } - - - #endregion 鍏ュ簱浠诲姟瀹屾垚 - - #region 浠诲姟瀹屾垚 - - /// <summary> - /// 瀹屾垚浠诲姟 - /// </summary> - /// <param name="taskNum">浠诲姟缂栧彿</param> - /// <returns>杩斿洖缁撴灉闆�</returns> - public async Task<WebResponseContent> CompleteAsync(int taskNum) - { - // 鍒濆鍖栧搷搴斿唴瀹� - WebResponseContent content = new WebResponseContent(); - - // 鎻愬彇浠诲姟鏁版嵁 - LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "鎻愬彇浠诲姟鏁版嵁", $"浠诲姟鍙凤細{taskNum}"); - - // 楠岃瘉浠诲姟鏄惁瀛樺湪 - var task = await GetByTaskNum(taskNum); - if (task == null) - { - return content.Error("浠诲姟涓嶅瓨鍦�"); - } - LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "楠岃瘉浠诲姟鏄惁瀛樺湪", JsonConvert.SerializeObject(task)); - - - // 楠岃瘉搴撳瓨鏄惁瀛樺湪 - var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); - // 鏍规嵁浠诲姟绫诲瀷璋冪敤鐩稿簲鐨勫畬鎴愪换鍔℃柟娉� - switch (task.TaskType) - { - case (int)TaskInboundTypeEnum.Inbound: - case (int)TaskInboundTypeEnum.InTray: - case (int)TaskInboundTypeEnum.InNG: - case (int)TaskInboundTypeEnum.InQuality: - LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "鍏ュ簱浠诲姟", ""); - return await CompleteInboundTaskAsync(task); - - case (int)TaskOutboundTypeEnum.OutTray: - case (int)TaskOutboundTypeEnum.Outbound: - case (int)TaskOutboundTypeEnum.OutNG: - - LogFactory.GetLog("浠诲姟瀹屾垚").InfoFormat(true, "鍑哄簱浠诲姟", ""); - return await CompleteOutboundTaskAsync(task, stock); - - case (int)TaskRelocationTypeEnum.Relocation: - return await CompleteTransferTaskAsync(task, stock); - default: - return content.Error("浠诲姟绫诲瀷涓嶅瓨鍦�"); - } - } - - #endregion 浠诲姟瀹屾垚 - - #region 璇锋眰浠诲姟鍏ュ簱 - - public async Task<WebResponseContent> RequestTaskAsync(RequestTaskDto input) - { - WebResponseContent content = new WebResponseContent(); - - try - { - - } - catch (Exception err) - { - // 鏇磋缁嗙殑寮傚父澶勭悊锛屽彲浠ユ牴鎹紓甯哥被鍨嬭褰曚笉鍚岀殑閿欒鏃ュ織绛� - content.Error(err.Message); - Console.WriteLine(err.Message); - LogFactory.GetLog($"璇锋眰鍏ュ簱寮傚父").Info(true, $"寮傚父淇℃伅銆恵err.Message}銆戝紓甯歌銆恵err.StackTrace}銆�"); - } - - return content; - } - - /// <summary> - /// 鏇存柊浠诲姟璐т綅 - /// </summary> - /// <param name="input"></param> - /// <returns></returns> - public async Task<WebResponseContent> UpdateExistingTask(RequestTaskDto input) - { - WebResponseContent content = new WebResponseContent(); - try - { - var task = await BaseDal.QueryFirstAsync(x => x.PalletCode == input.PalletCode); - if (task == null) - return content.Error($"鏆傛湭鎵惧埌銆恵input.PalletCode}銆戠殑浠诲姟"); - - return content = await UpdateExistingTask(input, task); - } - catch (Exception err) - { - return content.Error(err.Message); - } - } - - /// <summary> - /// 绌烘墭鐩樺叆搴撶敵璇� - /// </summary> - /// <param name="input"></param> - /// <returns></returns> - public async Task<WebResponseContent> RequestTrayInTaskAsync(RequestTaskDto input) - { - WebResponseContent content = new WebResponseContent(); - try - { - content.OK(); - } - catch (Exception ex) - { - content.Error(ex.Message); - } - return content; - } - - - #endregion 璇锋眰浠诲姟鍏ュ簱 - - #region 璇锋眰鍑哄簱锛堝疄鐩�&绌虹洏锛� - - /// <summary> - /// 璇锋眰鎵樼洏浠诲姟 - /// </summary> - /// <param name="position">鐩爣浣嶇疆</param> - /// <param name="tag">鎵樼洏绫诲瀷锛�1锛氬疄鐩橈紝2锛氱┖鐩橈級</param> - /// <param name="areaCode">鍖哄煙缂栫爜</param> - /// <param name="roadways">宸烽亾缂栫爜闆嗗悎</param> - /// <returns>杩斿洖缁撴灉闆�</returns> - public async Task<WebResponseContent> RequestTrayOutTaskAsync(string position, int tag, string areaCode, List<string> areaCodes, string productionLine) - { - WebResponseContent content = new WebResponseContent(); - try - { - - - // 杩斿洖鎴愬姛鍝嶅簲 - return content.OK(); - } - catch (Exception ex) - { - // 璁板綍寮傚父淇℃伅骞舵姏鍑� - LogFactory.GetLog("璇锋眰鎵樼洏浠诲姟").Error(true, ex); - ConsoleHelper.WriteErrorLine("璇锋眰绌�/瀹炴墭鐩樹换鍔�" + ex.Message + "\r\n" + ex.StackTrace); - return content.Error(ex.Message); - } - } - - /// <summary> - /// 鍒涘缓浠诲姟瀹炰緥 - /// </summary> - private Dt_Task CreateTask(DtStockInfo stockInfo, string position, int tag) - { - return new Dt_Task - { - Grade = tag == 104 ? (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 1 : 2) : (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 2 : 1), - Roadway = stockInfo.LocationInfo.RoadwayNo, - TargetAddress = position, - Dispatchertime = DateTime.Now, - MaterialNo = "", - NextAddress = position, - OrderNo = null, - PalletCode = stockInfo.PalletCode, - SourceAddress = stockInfo.LocationCode, - CurrentAddress = stockInfo.LocationCode, - TaskState = (int)TaskOutStatusEnum.OutNew, - TaskType = tag, - TaskNum = BaseDal.GetTaskNo().Result, - Creater = "System", // 淇鎷煎啓閿欒 - CreateDate = DateTime.Now, - TaskId = 0, - ProductionLine = stockInfo.ProductionLine, - ProcessCode = stockInfo.ProcessCode, - }; - } - - /// <summary> - /// 鍒涘缓浠诲姟DTO - /// </summary> - private WMSTaskDTO CreateTaskDTO(Dt_Task task) - { - return new WMSTaskDTO - { - TaskNum = task.TaskNum.Value, - Grade = task.Grade.Value, - PalletCode = task.PalletCode, - RoadWay = task.Roadway, - SourceAddress = task.SourceAddress, - TargetAddress = task.TargetAddress, - TaskState = task.TaskState.Value, - Id = 0, - TaskType = task.TaskType, - ProductionLine = task.ProductionLine, - }; - } - - #endregion 璇锋眰鍑哄簱锛堝疄鐩�&绌虹洏锛� - - #region 浠诲姟鐘舵�佹洿鏀� - - /// <summary> - /// 鏇存柊浠诲姟鐘舵��&鍑哄簱瑙g洏 - /// </summary> - /// <param name="taskNum"></param> - /// <param name="taskState"></param> - /// <returns></returns> - public async Task<WebResponseContent> UpdateTaskStatus(int taskNum, int taskState) - { - WebResponseContent content = new WebResponseContent(); - try - { - var task = await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); - if (task == null) - return content.Error("鏈壘鍒颁换鍔�"); - - if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskInStatusEnum.SC_InFinish) - { - var taskHty = CreateHistoricalTask(task); - await _unitOfWorkManage.UseTranAsync(async () => - { - var asb = await BaseDal.DeleteDataByIdAsync(task.TaskId); - var asbHty = await _task_HtyRepository.AddDataAsync(taskHty) > 0; - if (asb && asbHty) - content.OK(); - else - throw new Exception(); - }); - content.OK(); - } - else - { - task.TaskState = taskState; - var asb = await BaseDal.UpdateDataAsync(task); - if (asb) - content.OK(); - else - content.Error(); - } - } - catch (Exception ex) - { - content.Error(ex.Message); - } - return content; - } - - #endregion 浠诲姟鐘舵�佹洿鏀� - - #endregion 澶栭儴鎺ュ彛鏂规硶 - - #region 鍐呴儴璋冪敤鏂规硶 - public override WebResponseContent DeleteData(object[] key) { WebResponseContent content = new WebResponseContent(); @@ -482,7 +762,10 @@ { return await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); } - + public async Task<Dt_Task> GetByTaskAddress(string SourceAddress, string TargetAddress) + { + return await BaseDal.QueryFirstAsync(x => x.SourceAddress == SourceAddress|| x.TargetAddress== TargetAddress); + } #endregion 鍐呴儴璋冪敤鏂规硶 #region private 鍐呴儴鏂规硶 @@ -625,109 +908,14 @@ return isResult && isUpdateLo && isTaskDetail; } - - /// <summary> - /// 鍒涘缓鏂颁换鍔� - /// </summary> - /// <param name="input">璇锋眰妯″瀷</param> - /// <param name="process">宸烽亾</param> - /// <param name="flag">鏍囪瘑锛�0-鍏ュ簱锛�1-绌烘墭鐩樺叆搴擄紝2-NG鍏ュ簱锛�3-鍑哄簱锛�</param> - /// <returns></returns> - private async Task<WebResponseContent> CreateNewTask(RequestTaskDto input, string productionLine, string processCode, List<string> process = null, int flag = 0) - { - WebResponseContent content = new WebResponseContent(); - - // 鑾峰彇鐩爣鍦板潃 - //string ToAddress = await GetRoadWayAsync(process); - string ToAddress = string.Empty; - if (flag < 2) - ToAddress = await GetRoadWayAsync(process); - else - ToAddress = process[0]; - if (string.IsNullOrEmpty(ToAddress)) - { - return content.Error("鏃犳硶鑾峰彇鐩爣鍦板潃"); - } - // 鍒涘缓鏂颁换鍔″疄渚� - var task = new Dt_Task - { - CurrentAddress = input.Position, - Grade = 1, - Roadway = ToAddress, - TargetAddress = ToAddress, - Dispatchertime = DateTime.Now, - MaterialNo = "", - NextAddress = ToAddress, - OrderNo = null, - PalletCode = input.PalletCode, - SourceAddress = input.Position, - TaskState = flag == 3 ? (int)TaskOutStatusEnum.OutNew : (int)TaskInStatusEnum.InNew, - TaskType = flag == 0 ? (int)TaskInboundTypeEnum.Inbound : flag == 1 ? (int)TaskInboundTypeEnum.InTray : flag == 2 ? (int)TaskInboundTypeEnum.InNG : (int)TaskOutboundTypeEnum.Outbound, - TaskNum = await BaseDal.GetTaskNo(), - Creater = "System", - ProductionLine = productionLine, - ProcessCode = processCode - }; - - // 灏濊瘯娣诲姞鏂颁换鍔� - var taskId = await BaseDal.AddDataAsync(task); - bool isResult = taskId > 0; - if (isResult) - { - task.TaskId = taskId; - isResult = await _taskExecuteDetailRepository.AddDetailAsync(task, false, TaskDescription.GetTaskUpdateDescription(input.PalletCode, input.Position, ToAddress, TaskInStatusEnum.InNew.GetIntegralRuleTypeEnumDesc())); - - //var location = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress); - //location.LocationStatus = (int)LocationEnum.Lock; - //var isLocation = _locationRepository.UpdateData(location); - - if (isResult) - { - // 鍒涘缓WMS浠诲姟 - WMSTaskDTO taskDTO = new WMSTaskDTO() - { - TaskNum = task.TaskNum.Value, - Grade = 1, - PalletCode = task.PalletCode, - RoadWay = task.Roadway, - SourceAddress = task.SourceAddress, - TargetAddress = task.TargetAddress, - TaskState = task.TaskState.Value, - Id = 0, - TaskType = task.TaskType, - ProductionLine = task.ProductionLine - }; - content.OK(data: taskDTO); - } - else - content.Error("娣诲姞浠诲姟澶辫触"); - } - else - content.Error("娣诲姞浠诲姟澶辫触"); - return content; - } - - private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); - private static List<LocationCache> locationCaches = new List<LocationCache>(); - /// <summary> /// 鑾峰彇璐т綅鍙� /// </summary> /// <returns></returns> public async Task<DtLocationInfo> GetEmptyLocation(string roadWay) { - await _semaphore.WaitAsync(); try { - List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//鏌ヨ娣诲姞闈欐�佸彉閲忚秴杩�5鍒嗛挓鐨勮揣浣� - int count = removeItems.Count; - for (int i = 0; i < count; i++) - { - locationCaches.Remove(removeItems[i]);//绉婚櫎鏌ヨ娣诲姞闈欐�佸彉閲忚秴杩�5鍒嗛挓鐨勮揣浣� - } - - List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList(); - List<DtLocationInfo> LocationInfoList = await _locationRepository.QueryDataAsync(x => x.RoadwayNo == roadWay && x.LocationStatus == (int)LocationEnum.Free && x.EnalbeStatus == EnableEnum.Enable.ObjToInt()); List<DtLocationInfo> LocationInfoResult = new List<DtLocationInfo>(); @@ -757,42 +945,12 @@ throw new Exception("褰撳墠绌洪棽璐т綅涓嶈冻锛�"); } - return LocationInfoResult.Where(x => !lockLocations.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Column).ThenBy(x => x.Layer).FirstOrDefault(); + return LocationInfoResult.OrderByDescending(x => x.Depth).ThenBy(x => x.Column).ThenBy(x => x.Layer).FirstOrDefault(); } catch (Exception ex) { throw new Exception(ex.Message); } - finally - { - _semaphore.Release(); - } - } - /// <summary> - /// 鏍规嵁宸烽亾鑾峰彇宸烽亾鎴栫珯鍙� - /// </summary> - /// <returns></returns> - public async Task<string> GetRoadWayAsync(List<string> process) - { - var deviceCode = await SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>() - .Where(x => x.DeviceStatus == 1.ToString() && process.Contains(x.DeviceCode)) - .Select(x => x.DeviceCode).ToListAsync(); - - var minGroup = _locationRepository.QueryData(x => deviceCode.Contains(x.RoadwayNo) && x.LocationStatus == (int)LocationEnum.Free) - .GroupBy(x => x.RoadwayNo) - .OrderByDescending(g => g.Count()) // 鏍规嵁姣忎釜缁勭殑鍏冪礌鏁伴噺鎺掑簭 - .ToList(); // 鍙栧嚭鏁伴噺鏈�澶氱殑缁� - - Dictionary<string, int> result = new Dictionary<string, int>(); - foreach (var item in minGroup) - { - var number = BaseDal.QueryData(x => x.TargetAddress == item.Key && x.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup).Count(); - result.Add(item.Key, item.Count() - number); - } - - string minRoadwayNo = result.OrderByDescending(x => x.Value).FirstOrDefault().Key; // 鏁伴噺鏈�澶氱殑缁勭殑Key - - return minRoadwayNo; } #endregion 浠诲姟璇锋眰鏂规硶 -- Gitblit v1.9.3