| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES æçè¿ç«åºç«éæå®ç°è®¡å |
| | | |
| | | > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. |
| | | |
| | | **Goal:** å¨ TaskService çå
¥åºå®æ/åºåºå®ææ¹æ³ä¸éæ MES è¿ç«/åºç«è°ç¨ï¼æ°å¢ç©ºæçå
¥åº/åºåºå®ææ¹æ³ã |
| | | |
| | | **Architecture:** å¨ `ExecuteWithinTransactionAsync` äºå¡å
æ·»å MES è°ç¨ï¼MES 失败åäºå¡åæ»ã |
| | | |
| | | **Tech Stack:** ASP.NET Core 6.0, IMesService, ExecuteWithinTransactionAsync |
| | | |
| | | --- |
| | | |
| | | ## 任塿»è§ |
| | | |
| | | | ä»»å¡ | æ¹æ³ | æä½ | |
| | | |------|------|------| |
| | | | Task 1 | `InboundFinishTaskAsync` | æ·»å `InboundInContainer` è°ç¨ | |
| | | | Task 2 | `OutboundFinishTaskAsync` | æ·»å `OutboundInContainer` è°ç¨ | |
| | | | Task 3 | `InboundFinishTaskTrayAsync`ï¼æ°å¢ï¼ | 空æçå
¥åºå®æï¼æ é MES | |
| | | | Task 4 | `OutboundFinishTaskTrayAsync`ï¼æ°å¢ï¼ | 空æçåºåºå®æï¼æ é MES | |
| | | |
| | | --- |
| | | |
| | | ## ä»»å¡åç½®æ¡ä»¶ |
| | | |
| | | `TaskService` éæ³¨å
¥ `IMesService`ãæ£æ¥ç°ææé 彿°æ¯å¦å·²æï¼ |
| | | ```csharp |
| | | private readonly IMesService _mesService; |
| | | ``` |
| | | |
| | | 妿ä¸åå¨ï¼éæ·»å ã |
| | | |
| | | --- |
| | | |
| | | ## Task 1: ä¿®æ¹ InboundFinishTaskAsync æ·»å MES è¿ç«è°ç¨ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs`ï¼`InboundFinishTaskAsync` æ¹æ³ï¼çº¦ç¬¬ 215 è¡ï¼ |
| | | |
| | | - [ ] **Step 1: æ¥çå½å代ç 确认ä¸ä¸æ** |
| | | |
| | | 读å `TaskService.cs` 第 199-240 è¡ï¼ç¡®è®¤ `CompleteTaskAsync` è°ç¨çä½ç½®ã |
| | | |
| | | - [ ] **Step 2: å¨ CompleteTaskAsync ä¹åæ·»å MES InboundInContainer è°ç¨** |
| | | |
| | | å¨ `return await CompleteTaskAsync(task);` ä¹åæ·»å ï¼ |
| | | |
| | | ```csharp |
| | | // è°ç¨MESæçè¿ç« |
| | | var inboundRequest = new InboundInContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode |
| | | }; |
| | | var inboundResult = _mesService.InboundInContainer(inboundRequest); |
| | | if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | ``` |
| | | |
| | | - [ ] **Step 3: æ·»å using å¼ç¨ï¼å¦æéè¦ï¼** |
| | | |
| | | 确认æä»¶é¡¶é¨å·²æ `using WIDESEA_IBasicService;` å `using WIDESEA_DTO.MES;`ãå¦ææ²¡æï¼æ·»å ã |
| | | |
| | | - [ ] **Step 4: æå»ºéªè¯** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj |
| | | ``` |
| | | |
| | | 确认æ ç¼è¯é误ã |
| | | |
| | | - [ ] **Step 5: æäº¤** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "feat(TaskService): InboundFinishTaskAsyncæ·»å MESè¿ç«è°ç¨" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 2: ä¿®æ¹ OutboundFinishTaskAsync æ·»å MES åºç«è°ç¨ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs`ï¼`OutboundFinishTaskAsync` æ¹æ³ï¼çº¦ç¬¬ 258 è¡ï¼ |
| | | |
| | | - [ ] **Step 1: æ¥çå½å代ç 确认ä¸ä¸æ** |
| | | |
| | | 读å `TaskService.cs` 第 258-280 è¡ï¼ç¡®è®¤ `CompleteTaskAsync` è°ç¨çä½ç½®ã |
| | | |
| | | - [ ] **Step 2: å¨ CompleteTaskAsync ä¹åæ·»å MES OutboundInContainer è°ç¨** |
| | | |
| | | å¨ `return await CompleteTaskAsync(task);` ä¹åæ·»å ï¼ |
| | | |
| | | ```csharp |
| | | // è°ç¨MESæçåºç« |
| | | var outboundRequest = new OutboundInContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode, |
| | | ParamList = new List<ParamItem>() |
| | | }; |
| | | var outboundResult = _mesService.OutboundInContainer(outboundRequest); |
| | | if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | ``` |
| | | |
| | | - [ ] **Step 3: æå»ºéªè¯** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj |
| | | ``` |
| | | |
| | | 确认æ ç¼è¯é误ã |
| | | |
| | | - [ ] **Step 4: æäº¤** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "feat(TaskService): OutboundFinishTaskAsyncæ·»å MESåºç«è°ç¨" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 3: æ°å¢ InboundFinishTaskTrayAsync 空æçå
¥åºå®ææ¹æ³ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs`ï¼å¨ `InboundFinishTaskTrayAsync` æ¹æ³ä¹åæ·»å æ°æ¹æ³ï¼ |
| | | |
| | | - [ ] **Step 1: æ¥çç°æ InboundFinishTaskTrayAsync æ¹æ³ä½ç½®** |
| | | |
| | | 读å `TaskService.cs` 第 330-350 è¡ï¼ç¡®è®¤ `CreateTaskInboundTrayAsync` ä¹åçä½ç½®ã |
| | | |
| | | - [ ] **Step 2: æ·»å æ°æ¹æ³ InboundFinishTaskTrayAsync** |
| | | |
| | | å¨ `CreateTaskInboundTrayAsync` æ¹æ³ä¹åæ·»å ï¼ |
| | | |
| | | ```csharp |
| | | /// <summary> |
| | | /// 空æçå
¥åºå®æ |
| | | /// </summary> |
| | | public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto) |
| | | { |
| | | try |
| | | { |
| | | var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); |
| | | if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); |
| | | |
| | | var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); |
| | | if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); |
| | | |
| | | var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); |
| | | if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); |
| | | |
| | | return await ExecuteWithinTransactionAsync(async () => |
| | | { |
| | | stockInfo.LocationCode = location.LocationCode; |
| | | stockInfo.LocationId = location.Id; |
| | | stockInfo.StockStatus = StockStatusEmun.空æçåºå.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); |
| | | |
| | | var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); |
| | | var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); |
| | | if (!updateLocationResult || !updateStockResult) |
| | | return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | var deleteResult = await BaseDal.DeleteDataAsync(task); |
| | | if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | return WebResponseContent.Instance.OK("ä»»å¡å®æ"); |
| | | }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | - [ ] **Step 3: æå»ºéªè¯** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj |
| | | ``` |
| | | |
| | | 确认æ ç¼è¯é误ã |
| | | |
| | | - [ ] **Step 4: æäº¤** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "feat(TaskService): æ°å¢InboundFinishTaskTrayAsync空æçå
¥åºå®ææ¹æ³" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 4: æ°å¢ OutboundFinishTaskTrayAsync 空æçåºåºå®ææ¹æ³ |
| | | |
| | | **Files:** |
| | | - Modify: `WIDESEA_TaskInfoService/TaskService.cs`ï¼å¨ `OutboundFinishTaskTrayAsync` æ¹æ³ä¹åæ·»å æ°æ¹æ³ï¼ |
| | | |
| | | - [ ] **Step 1: æ¥çç°æ GetOutBoundTrayTaskAsync æ¹æ³ä½ç½®** |
| | | |
| | | 读å `TaskService.cs` 第 357-393 è¡ï¼ç¡®è®¤ `GetOutBoundTrayTaskAsync` ä¹åçä½ç½®ã |
| | | |
| | | - [ ] **Step 2: æ·»å æ°æ¹æ³ OutboundFinishTaskTrayAsync** |
| | | |
| | | å¨ `GetOutBoundTrayTaskAsync` æ¹æ³ä¹åæ·»å ï¼ |
| | | |
| | | ```csharp |
| | | /// <summary> |
| | | /// 空æçåºåºå®æ |
| | | /// </summary> |
| | | public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto) |
| | | { |
| | | try |
| | | { |
| | | var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); |
| | | if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); |
| | | |
| | | var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); |
| | | if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); |
| | | |
| | | var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); |
| | | if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); |
| | | |
| | | return await ExecuteWithinTransactionAsync(async () => |
| | | { |
| | | stockInfo.LocationId = 0; |
| | | stockInfo.LocationCode = null; |
| | | stockInfo.StockStatus = StockStatusEmun.åºåºå®æ.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); |
| | | |
| | | var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); |
| | | var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); |
| | | if (!updateLocationResult || !updateStockResult) |
| | | return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | var deleteResult = await BaseDal.DeleteDataAsync(task); |
| | | if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | return WebResponseContent.Instance.OK("ä»»å¡å®æ"); |
| | | }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | - [ ] **Step 3: æå»ºéªè¯** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj |
| | | ``` |
| | | |
| | | 确认æ ç¼è¯é误ã |
| | | |
| | | - [ ] **Step 4: æäº¤** |
| | | |
| | | ```bash |
| | | git add WIDESEA_TaskInfoService/TaskService.cs |
| | | git commit -m "feat(TaskService): æ°å¢OutboundFinishTaskTrayAsync空æçåºåºå®ææ¹æ³" |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## Task 5: æ´ä½æå»ºéªè¯ |
| | | |
| | | - [ ] **Step 1: æå»ºæ´ä¸ªè§£å³æ¹æ¡** |
| | | |
| | | ```bash |
| | | cd WIDESEA_WMSServer && dotnet build WIDESEA_WMSServer.sln |
| | | ``` |
| | | |
| | | 确认æ ç¼è¯éè¯¯ãæ è¦åã |
| | | |
| | | --- |
| | | |
| | | ## éªè¯æ£æ¥æ¸
å |
| | | |
| | | - [ ] `InboundFinishTaskAsync` ä¸ `InboundInContainer` å¨ `CompleteTaskAsync` ä¹å |
| | | - [ ] `OutboundFinishTaskAsync` ä¸ `OutboundInContainer` å¨ `CompleteTaskAsync` ä¹å |
| | | - [ ] ææ MES è°ç¨æ£æ¥ `mesResult.Data?.IsSuccess` |
| | | - [ ] éè¯¯ä¿¡æ¯æ ¼å¼ï¼`"ä»»å¡å®æå¤±è´¥ï¼MES{æä½}失败: {é误信æ¯}"` |
| | | - [ ] `InboundFinishTaskTrayAsync` å `OutboundFinishTaskTrayAsync` æ°å¢æ¹æ³ç¾åæ£ç¡® |
| | | - [ ] è§£å³æ¹æ¡æå»ºæ é误 |