| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES ä¸ä¼ ç¶æè·è¸ªä¸å¼æ¥ä¸ä¼ 设计 |
| | | |
| | | > **Date:** 2026-04-20 |
| | | > **Author:** Claude |
| | | |
| | | ## 1. ç®æ |
| | | |
| | | å¨åºå表添å MES ä¸ä¼ ç¶æåæ®µï¼éè¿å¼æ¥æ¹å¼ä¸ä¼ MES æ°æ®ï¼ä¸å¹²æ°ä¸»ä¸å¡é»è¾ï¼ææ MES è°ç¨åè®°å½è¯¦ç»æ¥å¿ã |
| | | |
| | | ## 2. æ°æ®åºåæ´ |
| | | |
| | | ### 2.1 Dt_StockInfo 表æ°å¢å段 |
| | | |
| | | ```sql |
| | | ALTER TABLE [dbo].[Dt_StockInfo] ADD [MesUploadStatus] TINYINT NOT NULL DEFAULT 0; |
| | | GO |
| | | ``` |
| | | |
| | | ### 2.2 æä¸¾å®ä¹ |
| | | |
| | | | å¼ | å«ä¹ | |
| | | |----|------| |
| | | | 0 | æªä¸ä¼ ï¼ä»æªè°ç¨è¿MESï¼ | |
| | | | 1 | ç»çä¸ä¼ æå | |
| | | | 2 | ç»çä¸ä¼ 失败 | |
| | | | 3 | æçä¸ä¼ æå | |
| | | | 4 | æçä¸ä¼ 失败 | |
| | | | 5 | è¿ç«ä¸ä¼ æå | |
| | | | 6 | è¿ç«ä¸ä¼ 失败 | |
| | | | 7 | åºç«ä¸ä¼ æå | |
| | | | 8 | åºç«ä¸ä¼ 失败 | |
| | | | 9 | NG䏿¥æå | |
| | | | 10 | NG䏿¥å¤±è´¥ | |
| | | |
| | | å¨ `WIDESEA_Common` é¡¹ç®æ°å¢æä¸¾ç±» `MesUploadStatusEnum`ã |
| | | |
| | | ## 3. å端设计 |
| | | |
| | | ### 3.1 æ ¸å¿å¼æ¥æ¹æ³ |
| | | |
| | | å¨ `WIDESEA_TaskInfoService/TaskService.cs` 䏿°å¢ `MesUploadAsync` ç§æå¼æ¥æ¹æ³ï¼ |
| | | |
| | | ```csharp |
| | | /// <summary> |
| | | /// 弿¥æ§è¡MESä¸ä¼ - ä¸é»å¡ä¸»ä¸å¡é»è¾ |
| | | /// </summary> |
| | | /// <param name="palletCode">æçå·</param> |
| | | /// <param name="mesType">MESæä½ç±»åæä¸¾</param> |
| | | /// <param name="uploadFunc">å
·ä½çMESè°ç¨å½æ°</param> |
| | | private async Task MesUploadAsync(string palletCode, MesUploadStatusEnum mesType, Func<Task<HttpResponseResult<MesResponse>>> uploadFunc) |
| | | { |
| | | var stopwatch = Stopwatch.StartNew(); |
| | | string requestJson = ""; |
| | | string responseJson = ""; |
| | | bool isSuccess = false; |
| | | string errorMessage = ""; |
| | | |
| | | try |
| | | { |
| | | // è®°å½è¯·æ±æ¥å¿ |
| | | var mesLog = new MesApiLogDto |
| | | { |
| | | PalletCode = palletCode, |
| | | ApiType = mesType.ToString(), |
| | | RequestTime = DateTime.Now |
| | | }; |
| | | |
| | | // è°ç¨MES |
| | | var result = await uploadFunc(); |
| | | |
| | | stopwatch.Stop(); |
| | | isSuccess = result?.Data?.IsSuccess ?? false; |
| | | errorMessage = result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误"; |
| | | responseJson = JsonConvert.SerializeObject(result); |
| | | |
| | | // æ´æ°åºåè¡¨ç¶æ |
| | | var uploadStatus = isSuccess ? (int)mesType : (int)mesType + 1; // 奿°=æåï¼å¶æ°=失败 |
| | | await _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus); |
| | | |
| | | // è®°å½æ¥å¿ |
| | | mesLog.ResponseTime = DateTime.Now; |
| | | mesLog.Duration = stopwatch.ElapsedMilliseconds; |
| | | mesLog.RequestParams = requestJson; |
| | | mesLog.ResponseResult = responseJson; |
| | | mesLog.Status = isSuccess ? "æå" : "失败"; |
| | | mesLog.ErrorMessage = errorMessage; |
| | | mesLog.CreateTime = DateTime.Now; |
| | | |
| | | _ = _mesLogService.LogAsync(mesLog); // ä¸çå¾
|
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | stopwatch.Stop(); |
| | | errorMessage = ex.Message; |
| | | |
| | | // æ´æ°ç¶æä¸ºå¤±è´¥ |
| | | var uploadStatus = (int)mesType + 1; |
| | | _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus).ConfigureAwait(false); |
| | | |
| | | // è®°å½å¼å¸¸æ¥å¿ |
| | | var mesLog = new MesApiLogDto |
| | | { |
| | | PalletCode = palletCode, |
| | | ApiType = mesType.ToString(), |
| | | RequestTime = DateTime.Now, |
| | | ResponseTime = DateTime.Now, |
| | | Duration = stopwatch.ElapsedMilliseconds, |
| | | RequestParams = requestJson, |
| | | ResponseResult = responseJson, |
| | | Status = "失败", |
| | | ErrorMessage = errorMessage, |
| | | CreateTime = DateTime.Now |
| | | }; |
| | | _ = _mesLogService.LogAsync(mesLog); // ä¸çå¾
|
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3.2 è°ç¨æ¹å¼ |
| | | |
| | | å¨å个 MES æä½å¤ç»ä¸ä½¿ç¨ `Task.Run` + `MesUploadAsync`ï¼ |
| | | |
| | | ```csharp |
| | | // ç»ç确认 |
| | | public async Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | // ... ä¸å¡é»è¾ ... |
| | | |
| | | // 弿¥MESä¸ä¼ ï¼ä¸é»å¡ä¸»é»è¾ |
| | | _ = Task.Run(() => MesUploadAsync(palletCode, MesUploadStatusEnum.GroupPalletSuccess, async () => |
| | | { |
| | | return await _mesService.BindContainerAsync(bindRequest, token); |
| | | })); |
| | | |
| | | return content.OK("ç»çæå"); |
| | | } |
| | | |
| | | // æç确认 |
| | | public async Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | // ... ä¸å¡é»è¾ ... |
| | | |
| | | _ = Task.Run(() => MesUploadAsync(palletCode, MesUploadStatusEnum.SplitPalletSuccess, async () => |
| | | { |
| | | return await _mesService.UnBindContainerAsync(unbindRequest, token); |
| | | })); |
| | | |
| | | return content.OK("æçæå"); |
| | | } |
| | | ``` |
| | | |
| | | ### 3.3 IStockInfoService æ°å¢æ¹æ³ |
| | | |
| | | å¨ `IStockInfoService` æ¥å£æ°å¢ï¼ |
| | | |
| | | ```csharp |
| | | /// <summary> |
| | | /// æ´æ°MESä¸ä¼ ç¶æ |
| | | /// </summary> |
| | | /// <param name="palletCode">æçå·</param> |
| | | /// <param name="status">ç¶æå¼</param> |
| | | Task<bool> UpdateMesUploadStatusAsync(string palletCode, int status); |
| | | ``` |
| | | |
| | | å¨ `StockInfoService` ä¸å®ç°è¯¥æ¹æ³ã |
| | | |
| | | ### 3.4 æ¥å¿è®°å½è§è |
| | | |
| | | ææ MES è°ç¨ç»ä¸è®°å½ä»¥ä¸åæ®µï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | |------|------| |
| | | | PalletCode | æçå· | |
| | | | ApiType | æ¥å£ç±»åï¼ç»ç/æç/è¿ç«/åºç«/NG䏿¥ï¼ | |
| | | | RequestTime | è¯·æ±æ¶é´ | |
| | | | ResponseTime | ååºæ¶é´ | |
| | | | Duration | èæ¶(ms) | |
| | | | RequestParams | 请æ±JSON | |
| | | | ResponseResult | ååºJSON | |
| | | | Status | æå/失败 | |
| | | | ErrorMessage | 失败åå | |
| | | |
| | | ## 4. åç«¯åæ´ |
| | | |
| | | ### 4.1 åºå页颿ä½åæ°å¢æé® |
| | | |
| | | å¨ `WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx` 䏿©å±æä½åï¼ |
| | | |
| | | ```jsx |
| | | let extension = { |
| | | components: { |
| | | gridHeader: "", |
| | | gridBody: "", |
| | | gridFooter: "", |
| | | modelHeader: "", |
| | | modelBody: "", |
| | | modelFooter: "", |
| | | }, |
| | | tableAction: "stock", |
| | | buttons: { |
| | | view: ["Export"], |
| | | box: [] |
| | | }, |
| | | methods: { |
| | | onInit() { |
| | | return true; |
| | | }, |
| | | onInited() { |
| | | // 注å
¥ç»ç/æçæé® |
| | | this.editTableButtons = [ |
| | | { name: "ç»ç", onClick: this.onGroupPallet }, |
| | | { name: "æç", onClick: this.onSplitPallet } |
| | | ]; |
| | | return true; |
| | | }, |
| | | async onGroupPallet({ row }) { |
| | | // è°ç¨ç»çæ¥å£ |
| | | let result = await this.$api.post("/Stock/GroupPalletConfirm", { palletCode: row.palletCode }); |
| | | if (result.status) { |
| | | this.$Message.success("ç»çæå"); |
| | | this.$refs.grid.search(); |
| | | } else { |
| | | this.$Message.error(result.message || "ç»ç失败"); |
| | | } |
| | | }, |
| | | async onSplitPallet({ row }) { |
| | | // è°ç¨æçæ¥å£ |
| | | let result = await this.$api.post("/Stock/SplitPalletConfirm", { palletCode: row.palletCode }); |
| | | if (result.status) { |
| | | this.$Message.success("æçæå"); |
| | | this.$refs.grid.search(); |
| | | } else { |
| | | this.$Message.error(result.message || "æç失败"); |
| | | } |
| | | } |
| | | }, |
| | | }; |
| | | |
| | | export default extension; |
| | | ``` |
| | | |
| | | ### 4.2 åºåå表æ°å¢ç¶æå |
| | | |
| | | å¨ `WMS/WIDESEA_WMSClient/src/views/stock/stock.vue` ç `columns` 䏿°å¢ï¼ |
| | | |
| | | ```vue |
| | | { field: "mesUploadStatus", title: "MESç¶æ", type: "int", width: 120, bind: { key: "mesUploadStatusEnum", data: [] } } |
| | | ``` |
| | | |
| | | ### 4.3 åå
¸é
ç½® |
| | | |
| | | å¨ `mesUploadStatusEnum` åå
¸ä¸æ·»å ï¼ |
| | | |
| | | | value | label | |
| | | |-------|-------| |
| | | | 0 | æªä¸ä¼ | |
| | | | 1 | ç»çæå | |
| | | | 2 | ç»ç失败 | |
| | | | 3 | æçæå | |
| | | | 4 | æç失败 | |
| | | | 5 | è¿ç«æå | |
| | | | 6 | è¿ç«å¤±è´¥ | |
| | | | 7 | åºç«æå | |
| | | | 8 | åºç«å¤±è´¥ | |
| | | | 9 | NG䏿¥æå | |
| | | | 10 | NG䏿¥å¤±è´¥ | |
| | | |
| | | ## 5. æä»¶åæ´æ¸
å |
| | | |
| | | | æä½ | æä»¶ | |
| | | |------|------| |
| | | | æ°å¢ | `WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/MesUploadStatusEnum.cs` | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs` - æ°å¢ MesUploadStatus åæ®µ | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs` - æ°å¢ UpdateMesUploadStatusAsync | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs` - å®ç° UpdateMesUploadStatusAsync | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs` - æ°å¢ MesUploadAsync + åå¤è°ç¨ | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx` - æ°å¢ç»ç/æçæé® | |
| | | | ä¿®æ¹ | `WMS/WIDESEA_WMSClient/src/views/stock/stock.vue` - æ°å¢MESç¶æå | |
| | | | æ°å¢ | æ°æ®åºåæ´èæ¬ | |
| | | |
| | | ## 6. èªæ£æ¸
å |
| | | |
| | | - [ ] `MesUploadStatusEnum` æä¸¾å¼å¥æ°ä¸ºæåï¼å¶æ°ä¸ºå¤±è´¥ï¼+1è¿ç®æ£ç¡® |
| | | - [ ] `MesUploadAsync` æ¹æ³å
ææ MES è°ç¨è®°å½è¯¦ç»æ¥å¿ï¼è¯·æ±JSONãååºJSONãèæ¶ãé误åå ï¼ |
| | | - [ ] ç»ç/æç/è¿ç«/åºç«/NG䏿¥åéè¿ `Task.Run` 弿¥æ§è¡ï¼ä¸é»å¡ä¸»é»è¾ |
| | | - [ ] å端ç»ç/æçæé®è°ç¨ `GroupPalletConfirmAsync` / `SplitPalletConfirmAsync` |
| | | - [ ] åºåå表æ£ç¡®æ¾ç¤º `mesUploadStatus` åæ®µ |
| | | - [ ] ææ public æ¹æ³åæ XML ææ¡£æ³¨é |