From ce1292c9cf37195b6abd2699dfc5d6cb3e143c9b Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期日, 12 四月 2026 23:38:19 +0800
Subject: [PATCH] feat(MES): 添加MES接口相关实体和DTO JS扩展文件至JSX格式并更新配置
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Manual.cs | 328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 328 insertions(+), 0 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Manual.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Manual.cs
new file mode 100644
index 0000000..4c7144b
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Manual.cs
@@ -0,0 +1,328 @@
+using System.ComponentModel;
+using System.Reflection;
+using Newtonsoft.Json;
+using WIDESEA_Common.TaskEnum;
+using WIDESEA_Core;
+using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Task;
+using WIDESEA_Model.Models;
+
+namespace WIDESEA_TaskInfoService
+{
+ public partial class TaskService
+ {
+ #region 鎵嬪姩浠诲姟
+
+ /// <summary>
+ /// 鎵嬪姩鍒涘缓浠诲姟
+ /// </summary>
+ /// <param name="dto">鎵嬪姩鍒涘缓浠诲姟鍙傛暟</param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> CreateManualTaskAsync(CreateManualTaskDto dto)
+ {
+ try
+ {
+ int taskType;
+ int taskStatus;
+ switch (dto.TaskType)
+ {
+ case "鍏ュ簱":
+ taskType = TaskInboundTypeEnum.Inbound.GetHashCode();
+ taskStatus = TaskInStatusEnum.InNew.GetHashCode();
+ break;
+
+ case "鍑哄簱":
+ taskType = TaskOutboundTypeEnum.Outbound.GetHashCode();
+ taskStatus = TaskOutStatusEnum.OutNew.GetHashCode();
+ break;
+
+ case "绉诲簱":
+ taskType = TaskRelocationTypeEnum.Relocation.GetHashCode();
+ taskStatus = TaskRelocationStatusEnum.RelocationNew.GetHashCode();
+ break;
+
+ default:
+ return WebResponseContent.Instance.Error($"涓嶆敮鎸佺殑浠诲姟绫诲瀷: {dto.TaskType}");
+ }
+
+ int taskNum = await BaseDal.GetTaskNo();
+
+ var task = new Dt_Task
+ {
+ TaskNum = taskNum,
+ PalletCode = dto.Barcode,
+ SourceAddress = dto.SourceAddress,
+ TargetAddress = dto.TargetAddress,
+ TaskType = taskType,
+ TaskStatus = taskStatus,
+ Grade = dto.Grade,
+ Roadway = dto.TargetAddress,
+ WarehouseId = dto.WarehouseId,
+ CurrentAddress = dto.SourceAddress,
+ NextAddress = dto.TargetAddress,
+ Creater = "manual",
+ CreateDate = DateTime.Now,
+ ModifyDate = DateTime.Now
+ };
+
+ var wmsTaskDtos = new List<WMSTaskDTO>()
+ {
+ new()
+ {
+ TaskNum = task.TaskNum,
+ PalletCode = task.PalletCode,
+ SourceAddress = task.SourceAddress,
+ TargetAddress = task.TargetAddress,
+ TaskType = task.TaskType,
+ Roadway = task.Roadway,
+ TaskStatus = task.TaskStatus,
+ WarehouseId = task.WarehouseId
+ }
+ };
+
+ return await _unitOfWorkManage.BeginTranAsync(async () =>
+ {
+ // 淇濆瓨鍒版暟鎹簱骞跺悓姝ュ彂閫佺粰WCS
+ var result = await BaseDal.AddDataAsync(task) > 0;
+ if (!result)
+ return WebResponseContent.Instance.Error("鍒涘缓浠诲姟澶辫触");
+
+ var wcsResult = _httpClientHelper.Post<WebResponseContent>(
+ "http://localhost:9292/api/Task/ReceiveManualTask",
+ wmsTaskDtos.ToJson());
+
+ if (!wcsResult.IsSuccess || !wcsResult.Data.Status)
+ return WebResponseContent.Instance.Error($"浠诲姟宸插垱寤轰絾鍙戦�佺粰WCS澶辫触: {wcsResult.Data?.Message}");
+
+ return WebResponseContent.Instance.OK($"鎵嬪姩鍒涘缓浠诲姟鎴愬姛锛屼换鍔″彿: {taskNum}");
+ });
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鎵嬪姩鍒涘缓浠诲姟寮傚父: {ex.Message}");
+ }
+ }
+
+ /// <summary>
+ /// 鎵嬪姩涓嬪彂浠诲姟鍒癢CS锛堟壒閲忓鐞嗭級
+ /// </summary>
+ /// <param name="dtos">涓嬪彂浠诲姟鍙傛暟鍒楄〃</param>
+ /// <returns>鎵归噺涓嬪彂缁撴灉</returns>
+ public async Task<WebResponseContent> DispatchTasksToWCSAsync(List<DispatchTaskDto> dtos)
+ {
+ try
+ {
+ if (dtos == null || !dtos.Any())
+ return WebResponseContent.Instance.Error("璇烽�夋嫨瑕佷笅鍙戠殑浠诲姟");
+
+ var resultDto = new DispatchResultDto
+ {
+ SuccessCount = 0,
+ FailCount = 0,
+ FailResults = new List<DispatchTaskResultDto>()
+ };
+
+ // 绗竴姝ワ細鏌ヨ骞舵牎楠屾墍鏈変换鍔$姸鎬侊紝鏀堕泦鏈夋晥浠诲姟
+ var validTasks = new List<(DispatchTaskDto Dto, Dt_Task Task)>();
+
+ foreach (var dto in dtos)
+ {
+ var task = await BaseDal.QueryFirstAsync(t => t.TaskId == dto.TaskId);
+ if (task == null)
+ {
+ resultDto.FailResults.Add(new DispatchTaskResultDto
+ {
+ TaskId = dto.TaskId,
+ TaskNum = 0,
+ Success = false,
+ ErrorMessage = "浠诲姟涓嶅瓨鍦�"
+ });
+ resultDto.FailCount++;
+ continue;
+ }
+
+ // 鏍¢獙浠诲姟鐘舵�侊細浠呭叆搴撴柊鍗�/鍑哄簱鏂板崟/绉诲簱鏂板崟鍙笅鍙�
+ bool canDispatch = false;
+ if (task.TaskType == TaskInboundTypeEnum.Inbound.GetHashCode()
+ && task.TaskStatus == TaskInStatusEnum.InNew.GetHashCode())
+ canDispatch = true;
+ else if (task.TaskType == TaskOutboundTypeEnum.Outbound.GetHashCode()
+ && task.TaskStatus == TaskOutStatusEnum.OutNew.GetHashCode())
+ canDispatch = true;
+ else if (task.TaskType == TaskRelocationTypeEnum.Relocation.GetHashCode()
+ && task.TaskStatus == TaskRelocationStatusEnum.RelocationNew.GetHashCode())
+ canDispatch = true;
+
+ if (!canDispatch)
+ {
+ var statusName = GetTaskStatusName(task.TaskType, task.TaskStatus);
+ resultDto.FailResults.Add(new DispatchTaskResultDto
+ {
+ TaskId = dto.TaskId,
+ TaskNum = task.TaskNum,
+ Success = false,
+ ErrorMessage = $"浠诲姟鐘舵�乕{statusName}]涓嶅厑璁镐笅鍙�"
+ });
+ resultDto.FailCount++;
+ continue;
+ }
+
+ validTasks.Add((dto, task));
+ }
+
+ // 濡傛灉鍏ㄩ儴鏍¢獙澶辫触锛岀洿鎺ヨ繑鍥�
+ if (validTasks.Count == 0)
+ return WebResponseContent.Instance.Error($"涓嬪彂澶辫触锛屽叡{resultDto.FailCount}涓换鍔�");
+
+ // 绗簩姝ワ細鏋勯�犳墍鏈塛MSTaskDTO锛屼竴娆℃�ц皟鐢╓CS
+ var wmsTaskDtos = validTasks.Select(vt => new WMSTaskDTO
+ {
+ Id = vt.Task.TaskId,
+ TaskNum = vt.Task.TaskNum,
+ PalletCode = vt.Dto.PalletCode,
+ SourceAddress = vt.Dto.SourceAddress,
+ TargetAddress = vt.Dto.TargetAddress,
+ CurrentAddress = vt.Dto.SourceAddress,
+ NextAddress = vt.Dto.TargetAddress,
+ TaskType = vt.Task.TaskType,
+ TaskStatus = vt.Task.TaskStatus,
+ Roadway = vt.Task.Roadway,
+ Grade = vt.Dto.Grade,
+ WarehouseId = vt.Task.WarehouseId,
+ PalletType = vt.Task.PalletType
+ }).ToList();
+
+ // 涓�娆℃�ц皟鐢╓CS鎵归噺鎺ュ彛
+ var wcsResult = _httpClientHelper.Post<WebResponseContent>(
+ "http://localhost:9292/api/Task/ReceiveManualTask",
+ wmsTaskDtos.ToJson());
+
+ if (wcsResult == null || !wcsResult.IsSuccess)
+ {
+ // WCS璋冪敤澶辫触锛屾墍鏈変换鍔¢兘绠楀け璐�
+ // 灏濊瘯浠嶹CS鍝嶅簲涓В鏋愰敊璇鎯�
+ string errorDetail = "";
+ if (wcsResult?.Data != null)
+ {
+ // 灏濊瘯灏咲ata杞崲涓洪敊璇俊鎭�
+ try
+ {
+ var errorData = wcsResult.Data.ToString();
+ errorDetail = $"WCS閿欒: {errorData}";
+ }
+ catch
+ {
+ errorDetail = wcsResult?.ErrorMessage ?? "WCS鍝嶅簲寮傚父";
+ }
+ }
+ else
+ {
+ errorDetail = wcsResult?.ErrorMessage ?? "WCS鍝嶅簲寮傚父";
+ }
+
+ foreach (var vt in validTasks)
+ {
+ resultDto.FailResults.Add(new DispatchTaskResultDto
+ {
+ TaskId = vt.Dto.TaskId,
+ TaskNum = vt.Task.TaskNum,
+ Success = false,
+ ErrorMessage = $"{errorDetail} (浠诲姟鍙�:{vt.Task.TaskNum}, 鎵樼洏:{vt.Dto.PalletCode})"
+ });
+ resultDto.FailCount++;
+ }
+ resultDto.SuccessCount = 0;
+ return WebResponseContent.Instance.Error($"WCS鎵归噺涓嬪彂澶辫触锛屽叡{resultDto.FailCount}涓换鍔�");
+ }
+
+ // WCS璋冪敤鎴愬姛锛岃В鏋愯繑鍥炵殑缁撴瀯鍖栨暟鎹�
+ ReceiveTaskResultDto wcsResultData = null;
+ try
+ {
+ if (wcsResult.Data?.Data != null)
+ {
+ var jsonStr = wcsResult.Data.Data.ToString();
+ if (!string.IsNullOrEmpty(jsonStr) && jsonStr.Contains("duplicateTasks"))
+ {
+ wcsResultData = JsonConvert.DeserializeObject<ReceiveTaskResultDto>(jsonStr);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ // 瑙f瀽WCS杩斿洖鏁版嵁澶辫触锛岃褰曟棩蹇椾絾缁х画澶勭悊
+ Console.WriteLine($"瑙f瀽WCS杩斿洖鏁版嵁寮傚父: {ex.Message}");
+ }
+
+ // 濡傛灉鏈夐噸澶嶄换鍔★紝璁板綍鍒板け璐ョ粨鏋滀腑
+ if (wcsResultData?.DuplicateTasks != null && wcsResultData.DuplicateTasks.Count > 0)
+ {
+ foreach (var dup in wcsResultData.DuplicateTasks)
+ {
+ var statusName = GetTaskStatusName(dup.TaskType, dup.TaskStatus);
+ resultDto.FailResults.Add(new DispatchTaskResultDto
+ {
+ TaskId = 0, // 閲嶅浠诲姟鍙兘娌℃湁WMS鐨凾askId
+ TaskNum = dup.TaskNum,
+ Success = false,
+ ErrorMessage = $"WCS涓凡瀛樺湪璇ヤ换鍔�(鎵樼洏:{dup.PalletCode}, 鐘舵��:{statusName})"
+ });
+ resultDto.FailCount++;
+ }
+ }
+
+ // 绗笁姝ワ細WCS璋冪敤鎴愬姛鍚庯紝鎵归噺鏇存柊DB
+ foreach (var vt in validTasks)
+ {
+ vt.Task.PalletCode = vt.Dto.PalletCode;
+ vt.Task.SourceAddress = vt.Dto.SourceAddress;
+ vt.Task.TargetAddress = vt.Dto.TargetAddress;
+ vt.Task.CurrentAddress = vt.Dto.SourceAddress;
+ vt.Task.NextAddress = vt.Dto.TargetAddress;
+ vt.Task.Grade = vt.Dto.Grade;
+ vt.Task.Dispatchertime = DateTime.Now;
+ }
+
+ // 鎵归噺鏇存柊DB
+ var tasksToUpdate = validTasks.Select(vt => vt.Task).ToList();
+ await BaseDal.UpdateDataAsync(tasksToUpdate);
+
+ resultDto.SuccessCount = validTasks.Count - (wcsResultData?.DuplicateTasks?.Count ?? 0);
+
+ if (resultDto.FailCount == 0)
+ return WebResponseContent.Instance.OK($"鎴愬姛涓嬪彂{resultDto.SuccessCount}涓换鍔�", resultDto);
+
+ var errorResponse = WebResponseContent.Instance.Error($"閮ㄥ垎涓嬪彂鎴愬姛{resultDto.SuccessCount}涓紝澶辫触{resultDto.FailCount}涓�");
+ errorResponse.Data = resultDto;
+ return errorResponse;
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"涓嬪彂浠诲姟寮傚父: {ex.Message}");
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇浠诲姟鐘舵�佸悕绉�
+ /// </summary>
+ /// <param name="taskType">浠诲姟绫诲瀷</param>
+ /// <param name="taskStatus">浠诲姟鐘舵��</param>
+ /// <returns>鐘舵�佺殑涓枃鎻忚堪</returns>
+ private string GetTaskStatusName(int taskType, int taskStatus)
+ {
+ FieldInfo? fieldInfo = taskType switch
+ {
+ _ when taskType == TaskInboundTypeEnum.Inbound.GetHashCode() => typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)taskStatus).ToString()),
+ _ when taskType == TaskOutboundTypeEnum.Outbound.GetHashCode() => typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)taskStatus).ToString()),
+ _ when taskType == TaskRelocationTypeEnum.Relocation.GetHashCode() => typeof(TaskRelocationStatusEnum).GetField(((TaskRelocationStatusEnum)taskStatus).ToString()),
+ _ => null
+ };
+
+ var descAttr = fieldInfo?.GetCustomAttributes(typeof(DescriptionAttribute), false)
+ .FirstOrDefault() as DescriptionAttribute;
+ return descAttr?.Description ?? taskStatus.ToString();
+ }
+
+ #endregion 鎵嬪姩浠诲姟
+ }
+}
--
Gitblit v1.9.3