| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES æçç èªå¨çæ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - çäº§æ¹æ¬¡ç®¡çï¼æ°å¢/ç¼è¾æ¹æ¬¡æ¶éæ©å
è£
è¢åã |
| | | - è¢ç 管çï¼çæè¢ç æå忥æ¶èªå¨æçæ ç¾æ°æ®ã |
| | | - æçç 管çï¼æ¥çèªå¨çææçåå
¶ç»å®è¢æ°ã |
| | | - äºç»´ç æå°åºåï¼æ ¹æ®æ ç¾æ°æ®ä¸æ¬¡æ¸²æå䏿çç 3 份æ ç¾å¹¶è§¦å䏿¬¡æµè§å¨æå°ã |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. å建æç¼è¾æ¹æ¬¡æ¶ï¼å¿
须鿩å
è£
è¢åï¼å°è¢ï¼å¼ 10ï¼æå¤§è¢ï¼å¼ 20ï¼ãå°è¢èªå¨æçéå¼ä¸º 100 è¢ï¼å¤§è¢èªå¨æçéå¼ä¸º 48 è¢ã |
| | | 2. æ¹æ¬¡è¿å
¥ç产ä¸åï¼è°ç¨çæè¢ç æ¥å£ãè¢ç çæ¹æ¬¡å·ãåç§ã产线ãçäº§æ¥æåè´£ä»»äººç±æ¹æ¬¡èªå¨å¸¦å
¥ã |
| | | 3. å端å¨åä¸äºå¡ä¸ç»è®¡è¯¥æ¹æ¬¡ææè¢ç ï¼æªé»è¾å é¤ä¸ç¶æä¸æ¯å·²ä½åºï¼å¹¶æè¢åºå·ååºå宿´éå¼ç»ã |
| | | 4. æ¯ä¸ªå®æ´éå¼ç»èªå¨å建ä¸ä¸ªæçç ï¼å¹¶å°ç»å
å
¨é¨è¢ç åå
¥å䏿ççæçç¼å·åæçç ãæªè¾¾å°å®æ´éå¼ç使°è¢ç ä¿ææªç»å®ã |
| | | 5. èªå¨æççæåï¼çæè¢ç æ¥å£ååºä¸ç `autoPallets` è¿åæ¬æ¬¡æ°å»ºæçæ ç¾æ°æ®ãæ¯ä¸ªæ ç¾ç `copies` åºå®ä¸º 3ï¼è¡¨ç¤ºå䏿çäºç»´ç æå° 3 份ï¼ä¸æ¯çæ 3 个æçã |
| | | 6. å端æ¶å° `autoPallets` åï¼ä¸ºæ¯ä¸ªæçæ ç¾æ¸²æ 3 个æå°å¯æ¬ï¼å¹¶åªè°ç¨ä¸æ¬¡æµè§å¨æå°ãæ®éç½é¡µæå°ä¼æå¼æµè§å¨æå°æµç¨ï¼å端ä¸è¿åé黿尿åç¶æã |
| | | |
| | | ## API |
| | | |
| | | ### 1. æ¹æ¬¡å建/æ´æ° |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |---|---|---| |
| | | | POST | `/mes/pro/batch/create` | å建çäº§æ¹æ¬¡ï¼å
è£
è¢åå¿
å¡« | |
| | | | PUT | `/mes/pro/batch/update` | æ´æ°çäº§æ¹æ¬¡ï¼çæè¢ç ææçåä¸å
许修æ¹è¢å | |
| | | |
| | | 请æ±åæ°æ°å¢ï¼ |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |---|---|---|---| |
| | | | bagType | Integer | æ¯ | 10 å°è¢ï¼éå¼100ï¼ï¼20 大è¢ï¼éå¼48ï¼ | |
| | | |
| | | ååºå段æ°å¢ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |---|---|---| |
| | | | bagType | Integer | å½åæ¹æ¬¡å
è£
è¢å | |
| | | |
| | | ### 2. çæè¢ç å¹¶èªå¨çææç |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |---|---|---| |
| | | | POST | `/mes/pro/bag-code/generate` | çæè¢ç ï¼ææè¢ç è¾¾å°å®æ´é弿¶èªå¨çææçå¹¶ç»å® | |
| | | |
| | | 请æ±åæ°ï¼ |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |---|---|---|---| |
| | | | batchId | Long | æ¯ | çäº§ä¸æ¹æ¬¡ç¼å· | |
| | | | count | Integer | æ¯ | æ¬æ¬¡çæè¢ç æ°éï¼å¤§äº0 | |
| | | | remark | String | å¦ | è¢ç 夿³¨ | |
| | | |
| | | ååº `data`ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |---|---|---| |
| | | | uuid | String | æ¬æ¬¡è¢ç çæç» UUID | |
| | | | autoPallets | Array | æ¬æ¬¡èªå¨çææçæ ç¾åè¡¨ï¼æªè·¨è¿å®æ´é弿¶ä¸ºç©º | |
| | | |
| | | `autoPallets` åæ®µï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |---|---|---| |
| | | | id | Long | æçç¼å· | |
| | | | code | String | æçäºç»´ç å
容 | |
| | | | batchId | Long | çäº§æ¹æ¬¡ç¼å· | |
| | | | batchCode | String | æ¹æ¬¡å· | |
| | | | palletNo | Integer | æ¹æ¬¡å
æçåºå· | |
| | | | capacity | Integer | æç容éï¼çäºè¢åéå¼ | |
| | | | bagCount | Integer | å·²è£
è¢æ°ï¼èªå¨æççæåçäºå®¹é | |
| | | | copies | Integer | æ ç¾æå°ä»½æ°ï¼åºå®ä¸º3 | |
| | | | itemId/itemCode/itemName/itemSpecification | â | åç§ä¿¡æ¯ | |
| | | | lineCode/lineName | String | äº§çº¿ä¿¡æ¯ | |
| | | | produceDate | String | çäº§æ¥æ | |
| | | | ownerUserId/ownerUserName | â | è´£ä»»äººä¿¡æ¯ | |
| | | |
| | | ååºç¤ºä¾ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "uuid": "çæç»UUID", |
| | | "autoPallets": [ |
| | | { |
| | | "id": 1001, |
| | | "code": "PC20260821L01A001-P01", |
| | | "batchId": 1024, |
| | | "batchCode": "PC20260821L01A001", |
| | | "palletNo": 1, |
| | | "capacity": 100, |
| | | "bagCount": 100, |
| | | "copies": 3, |
| | | "itemId": 2001, |
| | | "itemCode": "ITEM001", |
| | | "itemName": "产åA", |
| | | "itemSpecification": "è§æ ¼A", |
| | | "lineCode": "L01", |
| | | "lineName": "å
è£
ä¸çº¿", |
| | | "produceDate": "2026-08-21 08:00:00", |
| | | "ownerUserId": 1, |
| | | "ownerUserName": "å¼ ä¸" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |---|---|---| |
| | | | bagType | æ¹æ¬¡æ°å¢/ç¼è¾ãæ¹æ¬¡åè¡¨ãæ¹æ¬¡è¯¦æ
| éè¿åå
¸æ¾ç¤ºå°è¢/大è¢ï¼æ¹æ¬¡å·²æè¢ç ææçååªè¯» | |
| | | | bagQuantity | æ¹æ¬¡å表/详æ
| ææè¢ç 累计æ°é | |
| | | | palletQuantity | æ¹æ¬¡å表/详æ
| å·²çææçæ°éï¼å
嫿工åèªå¨æç | |
| | | | autoGenerated | æçå表/详æ
| æ è¯è¯¥æçæ¯å¦ç±éå¼èªå¨çæ | |
| | | | autoPallets[].code | æå°æ ç¾ | ä½ä¸ºäºç»´ç ç¼ç å
容ï¼åæ¶æ¾ç¤ºæçç ææ¬ | |
| | | | autoPallets[].copies | æå°æ§å¶ | åä¸æçæ ç¾æå°3份ï¼ä¸è¦è¿ç»è°ç¨ä¸æ¬¡æå° | |
| | | | autoPallets[].batchCode | æå°æ ç¾ | æ¾ç¤ºå
³èæ¹æ¬¡å· | |
| | | | autoPallets[].bagCount/capacity | æå°æ ç¾æè¯¦æ
| èªå¨æçæ£å¸¸æ
åµä¸ç¸çï¼å为对åºéå¼ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |---|---| |
| | | | å°è¢ | ææè¢ç æ¯ç´¯è®¡100个èªå¨çæä¸ä¸ªæç | |
| | | | å¤§è¢ | ææè¢ç æ¯ç´¯è®¡48个èªå¨çæä¸ä¸ªæç | |
| | | | ææè¢ç | `deleted = 0` ä¸ `status <> 30`ï¼å·²ç»å®äººå·¥æççè¢ç ä¸åä¸èªå¨å½é | |
| | | | è¢ç åç» | æ `bagNo` ååºï¼æ¯ç»å¿
须达å°å®æ´éå¼ï¼ä½æ°ä¸ç»å® | |
| | | | èªå¨æç容é | åºå®ä¸ºå½åæ¹æ¬¡éå¼ï¼ä¸ä½¿ç¨æå·¥æç容é | |
| | | | éå¤çæ | å䏿¹æ¬¡è¯·æ±ä¸²è¡éå®ï¼å·²ç»å®è¢ç ä¸ä¼å次åéï¼éå¤è°ç¨ä¸éå¤å建 | |
| | | | 人工ç»å® | èªå¨æµç¨ä¸æ¹ç»å·²äººå·¥ç»å®è¢ç ï¼äººå·¥ç»å®åè§£ç»éè¦å¨æå¡ç«¯å é | |
| | | | ç ´ææ¿æ¢ | æ°è¢ç ç»§æ¿æ§è¢ç å·²ææçï¼æææ°éä¸å¢å ï¼ä¸éå¤è§¦åæ°æç | |
| | | | å é¤/ä½åº | ä½åºè¢ç ä¸è®¡å
¥æææ°ï¼å·²ç»å®è¢ç ä¸å
许éè¿çæç»å é¤ | |
| | | | æå° | å端åªè¿åæ ç¾æ°æ®ï¼æµè§å¨ç«¯ä¸æ¬¡æ¸²æ3份并è°ç¨ä¸æ¬¡ `window.print()`ï¼æ æ³ä¿è¯éé»æå° | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - å岿¹æ¬¡ç `bagType` éè¦å¨å¯ç¨èªå¨æçåè¡¥é½ï¼ä¸è½ç±åç«¯çæµã |
| | | - åªæçäº§ä¸æ¹æ¬¡å
许çæè¢ç åèªå¨æçã |
| | | - æ®éæµè§å¨æ æ³ç»è¿ç³»ç»æå°å¯¹è¯æ¡ï¼è¥è¦æ±æ 人å¼å®æå°ï¼éè¦å¦è¡æ¥å
¥æ¬å°æå°ä»£çææå°æ§ä»¶ã |
| | | - ä¸è¦æ ZIP ä¸è½½ååºå½ä½èªå¨æå°ç»æï¼ç°æ ZIP æ¥å£ç»§ç»ç¨äºæ¹é导åºã |
| | | - èªå¨æçä¸çè¢ç 宿´å
³è以è¢ç è®°å½ç `palletId`ã`palletCode` åæçç `bagCount` 为åã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç产线æ«ç å
¥åº - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ç产线æ«ç å
¥åºèªå¨å·¥ä½å° |
| | | - æ«ç äºä»¶å®¡è®¡ |
| | | - çäº§æ¹æ¬¡åè¢ç 详æ
|
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. å·¥ä¸ç¸æºç±è¾¹ç¼ç¨åºå®æäºç»´ç è¯å«ï¼ä¸ä¼ `eventId`ã设å¤ç¼ç ã产线ç¼ç åè¢ç ã |
| | | 2. åç«¯æ ¹æ®è¢ç 带åºçäº§æ¹æ¬¡å产åç©æï¼å¹¶ä½¿ç¨ WIP èæä»é
ç½®å®æåºåå
¥è´¦ã |
| | | 3. å
¥åºæååè®°å½æå¡ç«¯å
¥åºæ¶é´ï¼å¢å æååºåï¼å¹¶ç´¯è®¡æ¹æ¬¡å
¥åºè¢æ°ã |
| | | 4. åä¸ä¸ª `eventId` éè¯æ¶è¿ååäºä»¶ï¼å·²å
¥åºè¢ç ä¸ä¼éå¤å¢å åºåã |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |---|---|---| |
| | | | POST | `/mes/pro/scan-in/inbound` | è¢ç æ«ç å
¥åºï¼æååå¢å WIP èæä»åºåå¹¶ååºåäºå¡ | |
| | | | GET | `/mes/pro/scan-in/page` | å页æ¥è¯¢æ«ç äºä»¶ | |
| | | | GET | `/mes/pro/scan-in/latest` | æ¥è¯¢è®¾å¤æå
¨å±æè¿æ«ç äºä»¶ | |
| | | | GET | `/mes/pro/scan-in/dashboard` | æ¥è¯¢å·¥ä½å°æè¿äºä»¶å累计äºä»¶æ° | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |---|---|---|---| |
| | | | eventId | String | æ¯ | è¾¹ç¼è®¾å¤çæçå¹çäºä»¶å· | |
| | | | bagCode | String | æ¯ | å·¥ä¸ç¸æºè¯å«åºçè¢ç | |
| | | | quantity | Decimal | æ¯ | å
¥åºæ°éï¼æ¬æä¸è¢é常为 1 | |
| | | | deviceCode | String | æ¯ | 设å¤ç¼ç ï¼ç¨äºå®¡è®¡ | |
| | | | lineCode | String | å¦ | 产线ç¼ç ï¼ç¨äºå®¡è®¡ | |
| | | | locationId | Long | æ¯ | WIP æååºåºç¼å· | |
| | | | areaId | Long | æ¯ | WIP æååºä½ç¼å· | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |---|---|---| |
| | | | eventId | String | å¹çäºä»¶å· | |
| | | | bagCode | String | è¢ç | |
| | | | batchCode | String | çäº§æ¹æ¬¡å· | |
| | | | quantity | Decimal | æ¬æ¬¡å
¥åºæ°é | |
| | | | deviceCode | String | 设å¤ç¼ç | |
| | | | eventTime | DateTime | æå¡ç«¯å
¥åºæ¶é´ | |
| | | | transactionId | Long | åºåäºå¡ç¼å· | |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |---|---|---| |
| | | | deviceCode | 设å¤ç¶æãæè¿æ«ç å表 | æ¾ç¤ºå½åè®¾å¤æäºä»¶æ¥æº | |
| | | | bagCode | æè¿æ«ç å表 | æ¾ç¤ºæè¿è¯å«çè¢ç | |
| | | | batchCode | æè¿æ«ç åè¡¨ãæ¹æ¬¡æ±æ» | å±ç¤ºè¢ç å½å±ççäº§æ¹æ¬¡ | |
| | | | eventTime | æè¿æ«ç å表 | 以æå¡ç«¯å
¥åºæ¶é´ä¸ºå | |
| | | | transactionId | æè¿æ«ç å表 | ç¨äºåºåæµæ°´è¿½æº¯ | |
| | | | quantity | åºåæè¦ | 累计æåæ°é | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |---|---| |
| | | | éå¤äºä»¶ | åä¸ `eventId` è¿åç¬¬ä¸æ¬¡å¤çç»æï¼ä¸éå¤å¢å åºå | |
| | | | å·²å
¥åºè¢ç | æç»éå¤å
¥åºï¼å¹¶ä¿çä¸å¡éè¯¯ä¿¡æ¯ | |
| | | | WIP æååº | ä»åºç±åç«¯ä½¿ç¨ WIP èæä»è§£æï¼å端ä¸ä¼ ä»åºç¼å· | |
| | | | äºå¡ä¸è´æ§ | äºä»¶ãè¢ç ç¶æãæ¹æ¬¡ç´¯è®¡ãåºåå°è´¦ååºåäºå¡å¨åä¸äºå¡ä¸æäº¤ | |
| | | | è®¾å¤æ¶é´ | è®¾å¤æ«ç æ¶é´ç¨äºè¿½æº¯ï¼åºåå
¥åºæ¶é´ä½¿ç¨æå¡ç«¯æ¶é´ | |
| | | |
| | | ## å¤±è´¥ç¶æä¸æ åé误ç |
| | | |
| | | æ«ç è¯·æ±æ 论æåæå¤±è´¥é½ä¼ä¿çæ«ç äºä»¶è®°å½ãç¶æåå¼ï¼ |
| | | |
| | | | ç¶æ | 说æ | |
| | | |---|---| |
| | | | SUCCESS | 已宿åºåå
¥åº | |
| | | | FAILED | æ ¡éªæåºåå¤ç失败 | |
| | | |
| | | | é误ç | 说æ | |
| | | |---|---| |
| | | | MES_SCAN_BAG_NOT_EXISTS | è¢ç ä¸åå¨ | |
| | | | MES_SCAN_BAG_ALREADY_INBOUND | è¢ç å·²å
¥åº | |
| | | | MES_SCAN_BATCH_NOT_EXISTS | çäº§æ¹æ¬¡ä¸åå¨ | |
| | | | MES_SCAN_WIP_WAREHOUSE_NOT_EXISTS | WIP èæä»ä¸åå¨ | |
| | | | MES_SCAN_TRANSACTION_FAILED | åºåäºå¡å¤ç失败 | |
| | | | MES_SCAN_EVENT_ID_CONFLICT | äºä»¶å·å·²åå¨ä½å
容ä¸ä¸è´ | |
| | | |
| | | 失败记å½ä¿ç设å¤ç¼ç ãè¢ç ãæ¥æ¶æ¶é´ã失败æ¶é´ãé误ç åé误åå ï¼å¤±è´¥æ¶ä¸äº§çåºåäºå¡ã |
| | | |
| | | ## æéç¹ |
| | | |
| | | | æé | ç¨é | |
| | | |---|---| |
| | | | mes:pro-scan-in:query | æ¥è¯¢äºä»¶åæè¿æ«ç | |
| | | | mes:pro-scan-in:inbound | æ§è¡æ«ç å
¥åº | |
| | | | mes:pro-scan-in:dashboard | æ¥è¯¢å·¥ä½å°çæ¿ | |
| | | |
| | | |
| | | - è¾¹ç¼ç¨åºä¸å¾ä¸ä¼ å¾çæè§é¢ï¼æ¬æ¥å£åªæ¥æ¶è§£ç åçäºç»´ç ç»æã |
| | | - å端工ä½å°åºå¨é¡µé¢å¸è½½æ¶åæ¢å·æ°ä»»å¡ã |
| | | - å
¥åºå¤±è´¥æ¶å±ç¤ºå端è¿åçä¸å¡é误ï¼ä¸èªå¨è°ç¨éç¨åºåè°æ´æ¥å£éè¯ã |
| | | - WIP åºåºååºä½éæåé
ç½®ï¼æ¥å£ä¸æ¥å客æ·ç«¯æå®ä»åºç¼å·ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç§åè´¨æ£å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ç§åè´¨æ£æäº¤é¡µ |
| | | - ç§åè´¨æ£è®°å½é¡µ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. ç产è¢ç æå¾
æ£åºå带å
¥è¢ç ãç©æãæ¹æ¬¡ä¿¡æ¯ã |
| | | 2. æäº¤æ¶ä»
ä¼ è¢ç ãç©æãæ¹æ¬¡ååé¡¹æ£æµç»æï¼ä»åºä½ç½®ç±åå°é
ç½®å³å®ã |
| | | 3. åæ ¼æ¶ç±å端å°WIP/å¾
æ£åºç§»å
¥æ£å¼åºåï¼ä¸åæ ¼æ¶å é¤è¢ç å对åºåºåå°è´¦ï¼ä½ä¿çè´¨æ£å®¡è®¡æ°æ®ã |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |---|---|---| |
| | | | POST | `/mes/qc/seed-quality/submit` | æäº¤ç§åè´¨æ£ | |
| | | |
| | | 请æ±åæ°å
æ¬ `code`ã`itemId`ã`batchCode`ã`reason` å `indicators`ã`indicators` å¿
é¡»æ°å¥½å
å« `purity`ã`cleanliness`ã`germination_rate`ã`moisture`ï¼æ¯é¡¹å
å« `value`ã`minValue`ã`maxValue`ï¼æ°å¼ä¸å¾ä¸ºè´ä¸ç»æå¿
é¡»å¨è¾¹çå
ã |
| | | |
| | | æåååºä¸ºè´¨æ£ä¸»è¡¨ç¼å·ãéå¤è¢ç æäº¤ä¼è¢«æç»ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |---|---|---| |
| | | | code | å表ã详æ
| è¢ç | |
| | | | batchCode | å表ã详æ
| çäº§æ¹æ¬¡ | |
| | | | åé¡¹ææ | 详æ
| å±ç¤ºå®æµå¼ååæ ¼ä¸ä¸é | |
| | | | result | å表ã详æ
| åæ ¼æä¸åæ ¼ | |
| | | | reason | 详æ
| ä¸åæ ¼åå | |
| | | | inspectorIdãinspectedAt | 详æ
| è´¨æ£ååè´¨æ£æ¶é´ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |---|---| |
| | | | ææ æ ¡éª | åé¡¹ææ å¿
é¡»é½å
¨ãä¸å¯éå¤ï¼å®æµå¼å¿
é¡»å¨è¾¹çå
| |
| | | | åæ ¼ | çæMOVE_OUTåMOVE_INï¼æ¥æºä¸ºWIP/å¾
æ£åºï¼ç®æ 为æ£å¼åºå | |
| | | | ä¸åæ ¼ | å é¤è¢ç å对åºåºåå°è´¦ï¼ä¸è°æ´çäº§æ¹æ¬¡æ°éï¼ä¿çä¸»è¡¨ãææ ãåå åäºå¡å®¡è®¡ | |
| | | | å¹ç | è¢ç å·²åå¨è´¨æ£è®°å½æ¶æç»å次æäº¤ | |
| | | | æé | éè¦ `mes:qc-seed-quality:submit` æé | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - å端ä¸å¾ä¼ ä»åºãåºåºãåºä½åæ°ï¼åå°é
ç½®ç¼ç 为åç»é
ç½®æå¡é¢çã |
| | | - ä¸åæ ¼ç»æä»éå±ç¤ºï¼ä¸è½æä¸å¡å é¤è´¨æ£ä¸»è¡¨åææ è®°å½ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | ALTER TABLE mes_pro_bag_code ADD COLUMN inbound_time datetime NULL COMMENT 'å
¥åºæ¶é´'; |
| | | ALTER TABLE mes_pro_bag_code ADD COLUMN inbound_event_id bigint NULL COMMENT 'å
¥åºäºä»¶ID'; |
| | | ALTER TABLE mes_pro_bag_code ADD COLUMN inbound_device_code varchar(64) NULL COMMENT 'å
¥åºè®¾å¤ç¼ç '; |
| | | ALTER TABLE mes_pro_bag_code ADD COLUMN inbound_line_code varchar(64) NULL COMMENT 'å
¥åºäº§çº¿ç¼ç '; |
| | | ALTER TABLE mes_pro_batch ADD COLUMN inbound_bag_quantity int NULL DEFAULT 0 COMMENT '累计å
¥åºè¢æ°' AFTER pallet_quantity; |
| | | |
| | | ALTER TABLE mes_pro_batch ADD COLUMN inbound_event_id bigint NULL COMMENT 'å
¥åºäºä»¶ID'; |
| | | ALTER TABLE mes_pro_batch ADD COLUMN inbound_device_code varchar(64) NULL COMMENT 'å
¥åºè®¾å¤ç¼ç '; |
| | | ALTER TABLE mes_pro_batch ADD COLUMN inbound_line_code varchar(64) NULL COMMENT 'å
¥åºäº§çº¿ç¼ç '; |
| | | CREATE TABLE mes_pro_scan_event ( |
| | | id bigint NOT NULL AUTO_INCREMENT, |
| | | event_id varchar(64) NOT NULL, |
| | | bag_code varchar(128) NOT NULL, |
| | | bag_code_id bigint NULL, |
| | | batch_id bigint NULL, |
| | | batch_code varchar(128) NULL, |
| | | item_id bigint NULL, |
| | | quantity decimal(18,6) NULL, |
| | | device_code varchar(64) NOT NULL, |
| | | line_code varchar(64) NULL, |
| | | warehouse_id bigint NULL, |
| | | location_id bigint NULL, |
| | | area_id bigint NULL, |
| | | transaction_id bigint NULL, |
| | | status varchar(16) NOT NULL DEFAULT 'FAILED', |
| | | error_code varchar(64) NULL, |
| | | error_message varchar(500) NULL, |
| | | received_time datetime NOT NULL, |
| | | failed_time datetime NULL, |
| | | event_time datetime NULL, |
| | | remark varchar(500) NULL, |
| | | creator varchar(64) NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | | updater varchar(64) NULL, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| | | deleted bit NOT NULL DEFAULT 0, |
| | | PRIMARY KEY (id), UNIQUE KEY uk_mes_scan_event_event_id (event_id), UNIQUE KEY uk_mes_scan_event_bag (bag_code_id), KEY idx_mes_scan_event_status (status), KEY idx_mes_scan_event_error_code (error_code), KEY idx_mes_scan_event_received_time (received_time) |
| | | ) ENGINE=InnoDB COMMENT='MESè¢ç æ«ç å
¥åºäºä»¶'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- MES æçç èªå¨çæï¼æææè¢ç 累计éå¼ï¼è¿ç§»èæ¬ |
| | | -- 1. mes_pro_batch å¢å å
è£
è¢å bag_typeï¼å°è¢ 10 / å¤§è¢ 20ï¼ |
| | | -- 2. mes_pro_pallet å¢å auto_generated èªå¨çææ è¯ |
| | | -- 3. å¢å å
è£
è¢ååå
¸ |
| | | -- MySQL 8.4 éç¨ï¼ä¸å
å« tenant_id |
| | | -- ============================================= |
| | | |
| | | SET NAMES utf8mb4; |
| | | |
| | | -- ---------------------------- |
| | | -- 1. çäº§æ¹æ¬¡å¢å å
è£
è¢å |
| | | -- ---------------------------- |
| | | SET @batch_bag_type_exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_batch' AND column_name = 'bag_type'); |
| | | SET @batch_bag_type_sql = IF(@batch_bag_type_exists = 0, |
| | | 'ALTER TABLE mes_pro_batch ADD COLUMN bag_type TINYINT DEFAULT NULL COMMENT ''å
è£
è¢åï¼åå
¸ mes_pro_bag_typeï¼10 å°è¢ 20 大è¢ï¼ï¼ç¨äºèªå¨å½éæç'' AFTER item_id', |
| | | 'SELECT 1'); |
| | | PREPARE batch_bag_type_stmt FROM @batch_bag_type_sql; |
| | | EXECUTE batch_bag_type_stmt; |
| | | DEALLOCATE PREPARE batch_bag_type_stmt; |
| | | |
| | | -- ---------------------------- |
| | | -- 2. æçç 表å¢å èªå¨çææ è¯ |
| | | -- ---------------------------- |
| | | SET @pallet_auto_generated_exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_pallet' AND column_name = 'auto_generated'); |
| | | SET @pallet_auto_generated_sql = IF(@pallet_auto_generated_exists = 0, |
| | | 'ALTER TABLE mes_pro_pallet ADD COLUMN auto_generated BIT(1) NOT NULL DEFAULT b''0'' COMMENT ''æ¯å¦èªå¨çæï¼æææè¢ç 累计éå¼çæï¼å®¹éåºå®ä¸ºéå¼ï¼'' AFTER bag_count', |
| | | 'SELECT 1'); |
| | | PREPARE pallet_auto_generated_stmt FROM @pallet_auto_generated_sql; |
| | | EXECUTE pallet_auto_generated_stmt; |
| | | DEALLOCATE PREPARE pallet_auto_generated_stmt; |
| | | |
| | | -- ---------------------------- |
| | | -- 3. å
è£
è¢ååå
¸ |
| | | -- ---------------------------- |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'MES å
è£
è¢å', 'mes_pro_bag_type', 0, 'æçèªå¨å½ééå¼å¤å®', '1', NOW(), '1', NOW(), b'0' FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE `type` = 'mes_pro_bag_type' AND deleted = 0) t); |
| | | |
| | | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES |
| | | (1065364, 1, 'å°è¢', '10', 'mes_pro_bag_type', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065365, 2, '大è¢', '20', 'mes_pro_bag_type', 0, 'warning', '', '1', NOW(), '1', NOW(), b'0'); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ç产线æ«ç å
¥åºèå䏿鮿é |
| | | -- èåæè½½å°ä¸è¢ä¸ç 管çï¼602630ï¼ï¼ç»ä»¶è·¯å¾ä¸åç«¯å¨æè·¯ç±ä¸è´ã |
| | | UPDATE system_menu |
| | | SET parent_id = 602630, sort = 7, updater = '1', update_time = NOW() |
| | | WHERE id = 602650 AND deleted = 0; |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, |
| | | status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 602650, 'ç产线æ«ç å
¥åº', '', 2, 7, 602630, 'scan-in', 'ep:camera', 'mes/pro/scan-in/index', 'MesProScanIn', |
| | | 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 602650 AND deleted = 0); |
| | | |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, |
| | | status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 602651, 'æ«ç å
¥åºæ¥è¯¢', 'mes:pro-scan-in:query', 3, 1, 602650, '', '', '', '', |
| | | 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 602651 AND deleted = 0); |
| | | |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, |
| | | status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 602652, 'æ«ç å
¥åº', 'mes:pro-scan-in:inbound', 3, 2, 602650, '', '', '', '', |
| | | 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 602652 AND deleted = 0); |
| | | |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, |
| | | status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 602653, 'æ«ç å
¥åºçæ¿', 'mes:pro-scan-in:dashboard', 3, 3, 602650, '', '', '', '', |
| | | 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 602653 AND deleted = 0); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ç§åè´¨æ£åå§åèæ¬ï¼æ ç§æ·å段ï¼å¯é夿§è¡ï¼ |
| | | CREATE TABLE IF NOT EXISTS mes_qc_seed_quality ( |
| | | id bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', code varchar(64) NOT NULL COMMENT 'è¢ç ', item_id bigint NOT NULL COMMENT 'ç©æ', batch_code varchar(64) DEFAULT NULL COMMENT 'æ¹æ¬¡å·', result tinyint NOT NULL DEFAULT 0 COMMENT '0å¤çä¸1åæ ¼2ä¸åæ ¼', reason varchar(500) DEFAULT NULL COMMENT 'åå ', inspector_id bigint DEFAULT NULL COMMENT 'è´¨æ£å', inspected_at datetime DEFAULT NULL COMMENT 'è´¨æ£æ¶é´', creator varchar(64) DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updater varchar(64) DEFAULT NULL, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted bit NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_code (code) |
| | | ) ENGINE=InnoDB COMMENT='ç§åè´¨æ£ä¸»è¡¨'; |
| | | CREATE TABLE IF NOT EXISTS mes_qc_seed_quality_indicator ( |
| | | id bigint NOT NULL AUTO_INCREMENT, quality_id bigint NOT NULL, indicator_code varchar(32) NOT NULL, value decimal(18,6) NOT NULL, min_value decimal(18,6) NOT NULL, max_value decimal(18,6) NOT NULL, creator varchar(64) DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updater varchar(64) DEFAULT NULL, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted bit NOT NULL DEFAULT 0, PRIMARY KEY(id), UNIQUE KEY uk_quality_indicator(quality_id,indicator_code) |
| | | ) ENGINE=InnoDB COMMENT='ç§åè´¨æ£ææ ç»æ'; |
| | | CREATE TABLE IF NOT EXISTS mes_qc_seed_quality_source ( |
| | | id bigint NOT NULL AUTO_INCREMENT, quality_id bigint NOT NULL, bag_code_id bigint DEFAULT NULL, bag_code varchar(64) NOT NULL, material_stock_id bigint DEFAULT NULL, quantity decimal(18,6) NOT NULL DEFAULT 0, source_warehouse_id bigint DEFAULT NULL, source_location_id bigint DEFAULT NULL, source_area_id bigint DEFAULT NULL, target_warehouse_id bigint DEFAULT NULL, target_location_id bigint DEFAULT NULL, target_area_id bigint DEFAULT NULL, creator varchar(64) DEFAULT NULL, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updater varchar(64) DEFAULT NULL, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted bit NOT NULL DEFAULT 0, PRIMARY KEY(id), UNIQUE KEY uk_quality_bag(quality_id,bag_code) |
| | | ) ENGINE=InnoDB COMMENT='ç§åè´¨æ£åºåè¢ç æ¥æºæç»'; |
| | | INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 'ç§åè´¨æ£', '', 2, 90, 5500, 'seed-quality', 'ep:checked', 'mes/qc/seedQuality/index', 'MesQcSeedQuality', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE parent_id = 5500 AND path = 'seed-quality' AND deleted = 0); |
| | | |
| | | INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) |
| | | SELECT 'æäº¤è´¨æ£', 'mes:qc-seed-quality:submit', 3, 1, id, '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM system_menu |
| | | WHERE parent_id = 5500 AND path = 'seed-quality' AND deleted = 0 |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM system_menu child |
| | | WHERE child.parent_id = system_menu.id |
| | | AND child.permission = 'mes:qc-seed-quality:submit' |
| | | AND child.deleted = 0 |
| | | ); |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceReqVO; |
| | |
| | | private MesMdmItemService mdmItemService; |
| | | |
| | | @PostMapping("/generate") |
| | | @Operation(summary = "çæè¢ç æ°æ®å
ï¼ä¸è¢ä¸ç ï¼") |
| | | @Operation(summary = "çæè¢ç æ°æ®å
ï¼ä¸è¢ä¸ç ï¼ï¼ç´¯è®¡è¾¾å°é弿¶èªå¨çææçç ") |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:create')") |
| | | public CommonResult<String> generateBagCodes(@Valid @RequestBody MesProBagCodeGenerateReqVO generateReqVO) { |
| | | public CommonResult<MesProBagCodeGenerateRespVO> generateBagCodes(@Valid @RequestBody MesProBagCodeGenerateReqVO generateReqVO) { |
| | | return success(bagCodeService.generateBagCodes(generateReqVO)); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo; |
| | | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - MES è¢ç çæååº") |
| | | @Data |
| | | public class MesProBagCodeGenerateRespVO { |
| | | |
| | | @Schema(description = "çæç» UUID") |
| | | private String uuid; |
| | | |
| | | @Schema(description = "æ¬æ¬¡èªå¨çæçæçæ ç¾ï¼æ¯ä¸ªæ ç¾ copies åºå®ä¸º 3") |
| | | private List<MesProPalletAutoPrintRespVO> autoPallets; |
| | | } |
| | |
| | | @ExcelIgnore |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "å
è£
è¢åï¼åå
¸ mes_pro_bag_typeï¼", example = "10") |
| | | @ExcelProperty("å
è£
è¢å") |
| | | @DictFormat(DictTypeConstants.MES_PRO_BAG_TYPE) |
| | | private Integer bagType; |
| | | |
| | | @Schema(description = "åç§ç¼ç ") |
| | | @ExcelProperty("åç§ç¼ç ") |
| | | private String itemCode; |
| | |
| | | @NotNull(message = "åç§ä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "å
è£
è¢åï¼åå
¸ mes_pro_bag_typeï¼10 å°è¢ã20 大è¢ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @NotNull(message = "å
è£
è¢åä¸è½ä¸ºç©º") |
| | | private Integer bagType; |
| | | |
| | | @Schema(description = "产线ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "产线ä¸è½ä¸ºç©º") |
| | | private Long lineId; |
| | |
| | | |
| | | // ========== åç§ä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "å
è£
è¢åï¼åå
¸ mes_pro_bag_typeï¼", example = "10") |
| | | private Integer bagType; |
| | | |
| | | @Schema(description = "åç§ï¼ç©æï¼ç¼å·", example = "1024") |
| | | private Long itemId; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MES èªå¨æçæå°æ ç¾") |
| | | @Data |
| | | public class MesProPalletAutoPrintRespVO { |
| | | |
| | | @Schema(description = "æçç¼å·") |
| | | private Long id; |
| | | @Schema(description = "æçç ") |
| | | private String code; |
| | | @Schema(description = "æ¹æ¬¡ç¼å·") |
| | | private Long batchId; |
| | | @Schema(description = "æ¹æ¬¡å·") |
| | | private String batchCode; |
| | | @Schema(description = "æ¹æ¬¡å
æçåºå·") |
| | | private Integer palletNo; |
| | | @Schema(description = "æ ç¾æå°ä»½æ°") |
| | | private Integer copies; |
| | | @Schema(description = "å¯è£
è¢æ°") |
| | | private Integer capacity; |
| | | @Schema(description = "å·²è£
è¢æ°") |
| | | private Integer bagCount; |
| | | @Schema(description = "åç§ç¼å·") |
| | | private Long itemId; |
| | | @Schema(description = "åç§ç¼ç ") |
| | | private String itemCode; |
| | | @Schema(description = "åç§åç§°") |
| | | private String itemName; |
| | | @Schema(description = "åç§è§æ ¼") |
| | | private String itemSpecification; |
| | | @Schema(description = "产线ç¼ç ") |
| | | private String lineCode; |
| | | @Schema(description = "产线åç§°") |
| | | private String lineName; |
| | | @Schema(description = "çäº§æ¥æ") |
| | | private LocalDateTime produceDate; |
| | | @Schema(description = "è´£ä»»äººç¨æ·ç¼å·") |
| | | private Long ownerUserId; |
| | | @Schema(description = "责任人æµç§°") |
| | | private String ownerUserName; |
| | | } |
| | |
| | | @ExcelProperty("å·²è£
è¢æ°") |
| | | private Integer bagCount; |
| | | |
| | | @Schema(description = "æ¯å¦èªå¨çæ", example = "false") |
| | | @ExcelIgnore |
| | | private Boolean autoGenerated; |
| | | |
| | | @Schema(description = "ç¶æï¼åå
¸ mes_pro_pallet_statusï¼", example = "10") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.MES_PRO_PALLET_STATUS) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.scan; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventCreateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventRespVO; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventPageReqVO; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan.MesProScanEventDO; |
| | | import cn.iocoder.yudao.module.mes.service.pro.scan.MesProScanEventService; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | |
| | | @Tag(name = "管çåå° - MES æ«ç å
¥åº") |
| | | @RestController @RequestMapping("/mes/pro/scan-in") |
| | | public class MesProScanEventController { |
| | | @Resource private MesProScanEventService service; |
| | | @PostMapping("/inbound") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:inbound')") @Operation(summary = "è¢ç æ«ç å
¥åº") |
| | | public CommonResult<MesProScanEventRespVO> inbound(@Valid @RequestBody MesProScanEventCreateReqVO req) { |
| | | return success(BeanUtils.toBean(service.createInbound(req), MesProScanEventRespVO.class)); |
| | | } |
| | | @GetMapping("/page") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:query')") @Operation(summary = "æ«ç äºä»¶å页") |
| | | public CommonResult<PageResult<MesProScanEventRespVO>> page(@Valid MesProScanEventPageReqVO req) { |
| | | PageResult<MesProScanEventDO> page = service.getPage(req); |
| | | return success(new PageResult<>(BeanUtils.toBean(page.getList(), MesProScanEventRespVO.class), page.getTotal())); |
| | | } |
| | | @GetMapping("/latest") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:query')") @Operation(summary = "ææ°æ«ç äºä»¶") |
| | | public CommonResult<MesProScanEventRespVO> latest(@RequestParam(required = false) String deviceCode) { |
| | | return success(BeanUtils.toBean(service.getLatest(deviceCode), MesProScanEventRespVO.class)); |
| | | } |
| | | @GetMapping("/dashboard") @PreAuthorize("@ss.hasPermission('mes:pro-scan-in:dashboard')") @Operation(summary = "æ«ç å
¥åºçæ¿") |
| | | public CommonResult<Map<String, Object>> dashboard() { return success(service.getDashboard()); } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.*; |
| | | import lombok.Data; |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class MesProScanEventCreateReqVO { |
| | | @NotBlank private String eventId; |
| | | @NotBlank private String bagCode; |
| | | @NotNull @DecimalMin("0.000001") private BigDecimal quantity; |
| | | @NotBlank private String deviceCode; |
| | | private String lineCode; |
| | | @NotNull private Long locationId; |
| | | @NotNull private Long areaId; |
| | | private String remark; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class MesProScanEventPageReqVO extends PageParam { |
| | | private String eventId; |
| | | private String bagCode; |
| | | private String batchCode; |
| | | private String deviceCode; |
| | | private String status; |
| | | private String errorCode; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Data |
| | | public class MesProScanEventRespVO { |
| | | private Long id; |
| | | private String eventId; |
| | | private String bagCode; |
| | | private String batchCode; |
| | | private BigDecimal quantity; |
| | | private String deviceCode; |
| | | private String lineCode; |
| | | private Long warehouseId; |
| | | private Long locationId; |
| | | private Long areaId; |
| | | private Long transactionId; |
| | | private String status; |
| | | private String errorCode; |
| | | private String errorMessage; |
| | | private LocalDateTime receivedTime; |
| | | private LocalDateTime failedTime; |
| | | private LocalDateTime eventTime; |
| | | private String remark; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | import cn.iocoder.yudao.module.mes.service.qc.seedquality.MesQcSeedQualityService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MES ç§åè´¨æ£") |
| | | @RestController @RequestMapping("/mes/qc/seed-quality") @Validated |
| | | public class MesQcSeedQualityController { |
| | | @Resource private MesQcSeedQualityService service; |
| | | @PostMapping("/submit") @Operation(summary = "æäº¤ç§åè´¨æ£") |
| | | @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:submit')") |
| | | public CommonResult<Long> submit(@Valid @RequestBody MesQcSeedQualitySubmitReqVO reqVO) { return success(service.submit(reqVO)); } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo; |
| | | |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.*; |
| | | import lombok.Data; |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class MesQcSeedQualitySubmitReqVO { |
| | | @NotBlank private String code; |
| | | @NotNull private Long itemId; |
| | | private String batchCode; |
| | | @NotEmpty @Valid private List<Indicator> indicators; |
| | | private String reason; |
| | | @Data public static class Indicator { |
| | | @NotBlank private String code; |
| | | @NotNull @DecimalMin("0") private BigDecimal value; |
| | | @NotNull @DecimalMin("0") private BigDecimal minValue; |
| | | @NotNull @DecimalMin("0") private BigDecimal maxValue; |
| | | } |
| | | } |
| | |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | |
| | | /** |
| | | * MES è¢ç èµç ï¼ä¸è¢ä¸ç ï¼DO |
| | | * <p> |
| | | * æ ¹æ®æ¹æ¬¡ä¿¡æ¯èªå¨çæå¯ä¸äºç»´ç æ°æ®å
ï¼ç å¼ = æ¹æ¬¡å· + - + è¢åºå·ï¼å
¨å±å¯ä¸ï¼æ»¡è¶³å¯ä¸æ§ãå¯è¯å«æ§ãå¯è¿½æº¯æ§è¦æ±ã |
| | | * æ¯ææ¹é导åºäº¤ä»å°å·ï¼å¹¶ä¸æçç å
³èã |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("mes_pro_bag_code") |
| | | @KeySequence("mes_pro_bag_code_seq") |
| | | @Data |
| | |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesProBagCodeDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * çæç» UUIDï¼æ è®°å䏿¬¡çæçæ°æ®å
ï¼ |
| | | */ |
| | | private String uuid; |
| | | /** |
| | | * è¢ç ï¼äºç»´ç å
å®¹ï¼æ¹æ¬¡å·-è¢åºå·ï¼å
¨å±å¯ä¸ï¼ |
| | | */ |
| | | private String code; |
| | | /** |
| | | * æ¹æ¬¡å
è¢åºå· |
| | | */ |
| | | private Integer bagNo; |
| | | /** |
| | | * çäº§æ¹æ¬¡ç¼å· |
| | | * <p> |
| | | * å
³è {@link MesProBatchDO#getId()} |
| | | */ |
| | | private Long batchId; |
| | | /** |
| | | * æ¹æ¬¡å·ï¼åä½ï¼ä¾¿äºå±ç¤ºï¼ |
| | | */ |
| | | private String batchCode; |
| | | /** |
| | | * ç»å®æçç¼å· |
| | | * <p> |
| | | * å
³è {@link MesProPalletDO#getId()} |
| | | */ |
| | | private Long palletId; |
| | | /** |
| | | * æçç ï¼åä½ï¼ä¾¿äºå±ç¤ºï¼ |
| | | */ |
| | | private String palletCode; |
| | | /** |
| | | * ç¶æ |
| | | * <p> |
| | | * åå
¸ {@link DictTypeConstants#MES_PRO_BAG_CODE_STATUS} |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * 导åºï¼äº¤ä»å°å·ï¼æ¶é´ |
| | | */ |
| | | private LocalDateTime printTime; |
| | | /** |
| | | * ä½åºæ¶é´ |
| | | */ |
| | | private LocalDateTime cancelTime; |
| | | /** |
| | | * ä½åºåå |
| | | */ |
| | | private String cancelReason; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private LocalDateTime inboundTime; |
| | | private Long inboundEventId; |
| | | private String inboundDeviceCode; |
| | | private String inboundLineCode; |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | */ |
| | | private Long itemId; |
| | | /** |
| | | * å
è£
è¢åï¼åå
¸ mes_pro_bag_typeï¼ |
| | | */ |
| | | private Integer bagType; |
| | | /** |
| | | * 产线ç¼å· |
| | | * <p> |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO#getId()} |
| | |
| | | * å·²çææçç æ°é |
| | | */ |
| | | private Integer palletQuantity; |
| | | /** å
¥åºæ¶é´ */ |
| | | private LocalDateTime inboundTime; |
| | | /** 累计å
¥åºè¢æ° */ |
| | | private Integer inboundBagQuantity; |
| | | /** æè¿å
¥åºäºä»¶ç¼å· */ |
| | | private Long inboundEventId; |
| | | /** å
¥åºè®¾å¤ç¼ç */ |
| | | private String inboundDeviceCode; |
| | | /** å
¥åºäº§çº¿ç¼ç */ |
| | | private String inboundLineCode; |
| | | /** |
| | | * æ¹æ¬¡ç¶æ |
| | | * <p> |
| | |
| | | */ |
| | | private Integer bagCount; |
| | | /** |
| | | * æ¯å¦èªå¨çæï¼æææè¢ç 累计éå¼çæï¼å®¹éåºå®ä¸ºéå¼ï¼ |
| | | */ |
| | | private Boolean autoGenerated; |
| | | /** |
| | | * ç¶æ |
| | | * <p> |
| | | * åå
¸ {@link DictTypeConstants#MES_PRO_PALLET_STATUS} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @TableName("mes_pro_scan_event") |
| | | @KeySequence("mes_pro_scan_event_seq") |
| | | @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor |
| | | public class MesProScanEventDO extends BaseDO { |
| | | @TableId private Long id; |
| | | private String eventId; |
| | | private String bagCode; |
| | | private Long bagCodeId; |
| | | private Long batchId; |
| | | private String batchCode; |
| | | private Long itemId; |
| | | private BigDecimal quantity; |
| | | private String deviceCode; |
| | | private String lineCode; |
| | | private Long warehouseId; |
| | | private Long locationId; |
| | | private Long areaId; |
| | | private Long transactionId; |
| | | private String status; |
| | | private String errorCode; |
| | | private String errorMessage; |
| | | private LocalDateTime receivedTime; |
| | | private LocalDateTime failedTime; |
| | | private LocalDateTime eventTime; |
| | | private String remark; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.*; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @TableName("mes_qc_seed_quality") |
| | | @KeySequence("mes_qc_seed_quality_seq") |
| | | @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor |
| | | public class MesQcSeedQualityDO extends BaseDO { |
| | | @TableId private Long id; |
| | | private String code; |
| | | private Long itemId; |
| | | private String batchCode; |
| | | private Integer result; |
| | | private String reason; |
| | | private Long inspectorId; |
| | | private LocalDateTime inspectedAt; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.*; |
| | | import java.math.BigDecimal; |
| | | |
| | | @TableName("mes_qc_seed_quality_indicator") |
| | | @KeySequence("mes_qc_seed_quality_indicator_seq") |
| | | @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor |
| | | public class MesQcSeedQualityIndicatorDO extends BaseDO { |
| | | @TableId private Long id; |
| | | private Long qualityId; |
| | | private String indicatorCode; |
| | | private BigDecimal value; |
| | | private BigDecimal minValue; |
| | | private BigDecimal maxValue; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.*; |
| | | import java.math.BigDecimal; |
| | | |
| | | @TableName("mes_qc_seed_quality_source") |
| | | @KeySequence("mes_qc_seed_quality_source_seq") |
| | | @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor |
| | | public class MesQcSeedQualitySourceDO extends BaseDO { |
| | | @TableId private Long id; |
| | | private Long qualityId; |
| | | private Long bagCodeId; |
| | | private String bagCode; |
| | | private Long materialStockId; |
| | | private BigDecimal quantity; |
| | | private Long sourceWarehouseId; |
| | | private Long sourceLocationId; |
| | | private Long sourceAreaId; |
| | | private Long targetWarehouseId; |
| | | private Long targetLocationId; |
| | | private Long targetAreaId; |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | |
| | | return selectOne(MesProBagCodeDO::getCode, code); |
| | | } |
| | | |
| | | default MesProBagCodeDO selectByCodeForUpdate(String code) { |
| | | return selectOne(new LambdaQueryWrapperX<MesProBagCodeDO>() |
| | | .eq(MesProBagCodeDO::getCode, code).last("FOR UPDATE")); |
| | | } |
| | | |
| | | @org.apache.ibatis.annotations.Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_device_code = #{deviceCode}, inbound_line_code = #{lineCode}, update_time = NOW() WHERE id = #{id} AND deleted = 0 AND inbound_event_id IS NULL") |
| | | int markInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId, |
| | | @org.apache.ibatis.annotations.Param("deviceCode") String deviceCode, @org.apache.ibatis.annotations.Param("lineCode") String lineCode); |
| | | |
| | | default List<MesProBagCodeDO> selectListByUuid(String uuid) { |
| | | return selectList(MesProBagCodeDO::getUuid, uuid); |
| | | } |
| | |
| | | return selectList(MesProBagCodeDO::getBatchId, batchId); |
| | | } |
| | | |
| | | default List<MesProBagCodeDO> selectUnboundEffectiveListByBatchId(Long batchId) { |
| | | return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>() |
| | | .eq(MesProBagCodeDO::getBatchId, batchId) |
| | | .isNull(MesProBagCodeDO::getPalletId) |
| | | .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus()) |
| | | .orderByAsc(MesProBagCodeDO::getBagNo) |
| | | .last("FOR UPDATE")); |
| | | } |
| | | |
| | | default Long selectCountByBatchId(Long batchId) { |
| | | return selectCount(MesProBagCodeDO::getBatchId, batchId); |
| | | } |
| | |
| | | @Select("SELECT * FROM mes_pro_batch WHERE id = #{id} AND deleted = 0 FOR UPDATE") |
| | | MesProBatchDO selectByIdForUpdate(@org.apache.ibatis.annotations.Param("id") Long id); |
| | | |
| | | @org.apache.ibatis.annotations.Update("UPDATE mes_pro_batch SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_device_code = #{deviceCode}, inbound_line_code = #{lineCode}, inbound_bag_quantity = COALESCE(inbound_bag_quantity, 0) + 1, update_time = NOW() WHERE id = #{id} AND deleted = 0") |
| | | int markInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId, |
| | | @org.apache.ibatis.annotations.Param("deviceCode") String deviceCode, @org.apache.ibatis.annotations.Param("lineCode") String lineCode); |
| | | |
| | | default PageResult<MesProBatchDO> selectPage(MesProBatchPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesProBatchDO>() |
| | | .likeIfPresent(MesProBatchDO::getCode, reqVO.getCode()) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.pro.scan; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan.MesProScanEventDO; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventPageReqVO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | @Mapper |
| | | public interface MesProScanEventMapper extends BaseMapperX<MesProScanEventDO> { |
| | | default MesProScanEventDO selectByEventIdForUpdate(String eventId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesProScanEventDO>() |
| | | .eq(MesProScanEventDO::getEventId, eventId).last("FOR UPDATE")); |
| | | } |
| | | default PageResult<MesProScanEventDO> selectPage(MesProScanEventPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesProScanEventDO>() |
| | | .eqIfPresent(MesProScanEventDO::getEventId, reqVO.getEventId()) |
| | | .likeIfPresent(MesProScanEventDO::getBagCode, reqVO.getBagCode()) |
| | | .likeIfPresent(MesProScanEventDO::getBatchCode, reqVO.getBatchCode()) |
| | | .eqIfPresent(MesProScanEventDO::getDeviceCode, reqVO.getDeviceCode()) |
| | | .eqIfPresent(MesProScanEventDO::getStatus, reqVO.getStatus()) |
| | | .eqIfPresent(MesProScanEventDO::getErrorCode, reqVO.getErrorCode()) |
| | | .orderByDesc(MesProScanEventDO::getEventTime)); |
| | | } |
| | | |
| | | default MesProScanEventDO selectLatest(String deviceCode) { |
| | | return selectOne(new LambdaQueryWrapperX<MesProScanEventDO>() |
| | | .eqIfPresent(MesProScanEventDO::getDeviceCode, deviceCode) |
| | | .orderByDesc(MesProScanEventDO::getEventTime).last("LIMIT 1")); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityIndicatorDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | @Mapper public interface MesQcSeedQualityIndicatorMapper extends BaseMapperX<MesQcSeedQualityIndicatorDO> {} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | @Mapper |
| | | public interface MesQcSeedQualityMapper extends BaseMapperX<MesQcSeedQualityDO> { |
| | | default MesQcSeedQualityDO selectByCode(String code) { |
| | | return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getCode, code)); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualitySourceDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.apache.ibatis.annotations.Update; |
| | | |
| | | @Mapper public interface MesQcSeedQualitySourceMapper extends BaseMapperX<MesQcSeedQualitySourceDO> { |
| | | @Update("UPDATE mes_qc_seed_quality_source SET deleted = 1, update_time = NOW() WHERE quality_id = #{qualityId} AND deleted = 0") |
| | | int deleteByQualityId(@Param("qualityId") Long qualityId); |
| | | } |
| | |
| | | String MES_PRO_TASK_STATUS = "mes_pro_task_status"; // MES ä»»å¡ç¶æ |
| | | String MES_PRO_BATCH_STATUS = "mes_pro_batch_status"; // MES çäº§æ¹æ¬¡ç¶æ |
| | | String MES_PRO_BATCH_WORKER_TYPE = "mes_pro_batch_worker_type"; // MES æ¹æ¬¡äººåå²ä½ç±»å |
| | | String MES_PRO_BAG_TYPE = "mes_pro_bag_type"; // MES å
è£
è¢å |
| | | String MES_PRO_BAG_CODE_STATUS = "mes_pro_bag_code_status"; // MES è¢ç ç¶æ |
| | | String MES_PRO_PALLET_STATUS = "mes_pro_pallet_status"; // MES æçç ç¶æ |
| | | |
| | |
| | | */ |
| | | public interface ErrorCodeConstants { |
| | | |
| | | // ========== MES ç产管ç-æ«ç å
¥åºï¼1-040-755-000ï¼ ========== |
| | | ErrorCode PRO_SCAN_EVENT_BAG_NOT_EXISTS = new ErrorCode(1_040_755_000, "è¢ç ä¸åå¨"); |
| | | ErrorCode PRO_SCAN_EVENT_ALREADY_INBOUND = new ErrorCode(1_040_755_001, "è¢ç å·²å
¥åº"); |
| | | ErrorCode PRO_SCAN_EVENT_BATCH_NOT_EXISTS = new ErrorCode(1_040_755_002, "çäº§æ¹æ¬¡ä¸åå¨"); |
| | | ErrorCode PRO_SCAN_EVENT_WIP_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_040_755_003, "WIPèæä»ä¸åå¨"); |
| | | ErrorCode PRO_SCAN_EVENT_LOCATION_INVALID = new ErrorCode(1_040_755_004, "æ«ç å
¥åºåºä½æ æ"); |
| | | ErrorCode PRO_SCAN_EVENT_TRANSACTION_FAILED = new ErrorCode(1_040_755_005, "åºåäºå¡å¤ç失败"); |
| | | ErrorCode PRO_SCAN_EVENT_ID_CONFLICT = new ErrorCode(1_040_755_006, "äºä»¶å·å·²åå¨ä½å
容ä¸ä¸è´"); |
| | | ErrorCode PRO_SCAN_EVENT_FAILED = new ErrorCode(1_040_755_007, "æ«ç å
¥åºå¤±è´¥"); |
| | | |
| | | // ========== MES åºç¡æ°æ®-ç©æåç±»ï¼1-040-100-000ï¼ ========== |
| | | ErrorCode MD_ITEM_TYPE_NOT_EXISTS = new ErrorCode(1_040_100_000, "ç©æåç±»ä¸åå¨"); |
| | | ErrorCode MD_ITEM_TYPE_EXITS_CHILDREN = new ErrorCode(1_040_100_001, "åå¨ååç±»ï¼æ æ³å é¤"); |
| | |
| | | ErrorCode PRO_QR_EXPORT_TOO_MANY = new ErrorCode(1_040_750_007, "äºç»´ç æ¹éå¯¼åºæ°éè¶
è¿ä¸é"); |
| | | ErrorCode PRO_QR_IMAGE_GENERATE_ERROR = new ErrorCode(1_040_750_008, "äºç»´ç å¾ççæå¤±è´¥"); |
| | | ErrorCode PRO_QR_EXPORT_PARAMS_INVALID = new ErrorCode(1_040_750_009, "äºç»´ç æ¹é导åºç¼ºå°æ¥è¯¢æ¡ä»¶"); |
| | | ErrorCode PRO_BATCH_BAG_TYPE_INVALID = new ErrorCode(1_040_750_010, "å
è£
è¢åæ æ"); |
| | | ErrorCode PRO_BATCH_BAG_TYPE_NOT_ALLOW_CHANGE = new ErrorCode(1_040_750_011, "æ¹æ¬¡å·²çæè¢ç ææçç ï¼ä¸å
许修æ¹å
è£
è¢å"); |
| | | |
| | | // ========== MES ç产管ç-è¢ç èµç ï¼1-040-752-000ï¼ ========== |
| | | ErrorCode PRO_BAG_CODE_NOT_EXISTS = new ErrorCode(1_040_752_000, "è¢ç ä¸åå¨"); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums; |
| | | |
| | | public interface MesProScanEventStatusEnum { |
| | | String SUCCESS = "SUCCESS"; |
| | | String FAILED = "FAILED"; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.enums.pro; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesProBagTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | SMALL(10, "å°è¢", 100), |
| | | LARGE(20, "大è¢", 48); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBagTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | private final int threshold; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static MesProBagTypeEnum valueOfType(Integer type) { |
| | | return Arrays.stream(values()).filter(item -> item.type.equals(type)).findFirst().orElse(null); |
| | | } |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceRespVO; |
| | |
| | | * @param generateReqVO çæä¿¡æ¯ |
| | | * @return çæç» UUIDï¼æ è®°å䏿¬¡çæçæ°æ®å
ï¼ |
| | | */ |
| | | String generateBagCodes(@Valid MesProBagCodeGenerateReqVO generateReqVO); |
| | | MesProBagCodeGenerateRespVO generateBagCodes(@Valid MesProBagCodeGenerateReqVO generateReqVO); |
| | | |
| | | /** |
| | | * ä½åºç ´æè¢ç å¹¶å¨åæ¹æ¬¡çæçéæ¿æ¢è¢ç |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceItemRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceReqVO; |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public String generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) { |
| | | public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) { |
| | | // 1. æ ¡éªæ¹æ¬¡åå¨ä¸å¤äºç产ä¸ç¶æ |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId()); |
| | | if (batch == null) { |
| | |
| | | batchMapper.updateById(new MesProBatchDO().setId(batch.getId()) |
| | | .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity()) |
| | | + generateReqVO.getCount())); |
| | | return uuid; |
| | | return new MesProBagCodeGenerateRespVO() |
| | | .setUuid(uuid) |
| | | .setAutoPallets(palletService.autoCreatePallets(batch.getId())); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void bindPallet(MesProBagCodeBindReqVO bindReqVO) { |
| | | // 1. æ ¡éªæçåå¨ |
| | | MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId()); |
| | | // 2. æ ¡éªè¢ç |
| | | List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet); |
| | | // 1. é宿çï¼é¿å
ä¸èªå¨å½éå¹¶åä¿®æ¹è¢æ° |
| | | MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId()); |
| | | if (pallet == null) { |
| | | throw exception(PRO_PALLET_NOT_EXISTS); |
| | | } |
| | | // 2. éå®å¹¶æ ¡éªè¢ç |
| | | List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet, true); |
| | | // 3. æ ¡éªä¸è¶
è¿æçå¯è£
è¢æ° |
| | | int currentCount = pallet.getBagCount() == null ? 0 : pallet.getBagCount(); |
| | | if (pallet.getCapacity() != null && pallet.getCapacity() > 0 |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void unbindPallet(MesProBagCodeBindReqVO bindReqVO) { |
| | | // 1. æ ¡éªæçåå¨ |
| | | MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId()); |
| | | // 2. æ ¡éªè¢ç åç»å®å¨å½åæçä¸ |
| | | List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(bindReqVO.getIds()); |
| | | // 1. é宿çï¼é¿å
ä¸èªå¨å½éå¹¶åä¿®æ¹è¢æ° |
| | | MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId()); |
| | | if (pallet == null) { |
| | | throw exception(PRO_PALLET_NOT_EXISTS); |
| | | } |
| | | // 2. éå®å¹¶æ ¡éªè¢ç åç»å®å¨å½åæçä¸ |
| | | List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(bindReqVO.getIds()); |
| | | if (bagCodes.size() != bindReqVO.getIds().size()) { |
| | | throw exception(PRO_BAG_CODE_NOT_EXISTS); |
| | | } |
| | |
| | | /** |
| | | * æ ¡éªå¾
ç»å®çè¢ç ï¼åå¨ã䏿çåæ¹æ¬¡ãæªç»å®è¿æçãç¶æææï¼å·²çæ/已导åºå°å·ï¼ |
| | | */ |
| | | private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet) { |
| | | List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(ids); |
| | | private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet, boolean lock) { |
| | | List<MesProBagCodeDO> bagCodes = lock ? bagCodeMapper.selectListByIdsForUpdate(ids) : bagCodeMapper.selectListByIds(ids); |
| | | if (bagCodes.size() != ids.size()) { |
| | | throw exception(PRO_BAG_CODE_NOT_EXISTS); |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchWorkerMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBagTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createBatch(MesProBatchSaveReqVO createReqVO) { |
| | | validateBagType(createReqVO.getBagType()); |
| | | // 1. æ ¡éªå
³èæ°æ®ï¼åç§ã产线ãç产人åï¼ |
| | | MesMdmItemDO item = mdmItemService.validateItemExists(createReqVO.getItemId()); |
| | | MesProLineDO line = lineService.validateLineExistsAndEnable(createReqVO.getLineId()); |
| | |
| | | .setCode(code) |
| | | .setLineCode(line.getCode()) |
| | | .setLineName(line.getName()) |
| | | .setBagType(createReqVO.getBagType()) |
| | | .setBagQuantity(0) |
| | | .setPalletQuantity(0) |
| | | .setStatus(MesProBatchStatusEnum.DRAFT.getStatus()); |
| | |
| | | // 1. æ ¡éªåå¨ + ç¶æï¼è稿/çäº§ä¸æå
许修æ¹ï¼ |
| | | MesProBatchDO oldBatch = validateBatchExists(updateReqVO.getId()); |
| | | validateBatchEditable(oldBatch); |
| | | // 2. å·²çæè¢ç ææçç åä¸å
许修æ¹è¢åï¼é¿å
å䏿¹æ¬¡éå¼åå导è´å½ééä¹±ï¼ |
| | | if (updateReqVO.getBagType() != null && !Objects.equals(oldBatch.getBagType(), updateReqVO.getBagType()) |
| | | && (bagQuantityOrPalletCreated(oldBatch))) { |
| | | throw exception(PRO_BATCH_BAG_TYPE_NOT_ALLOW_CHANGE); |
| | | } |
| | | validateBagType(updateReqVO.getBagType()); |
| | | // 2. æ ¡éªå
³èæ°æ®ï¼ç产人åï¼ |
| | | validateRelations(updateReqVO); |
| | | |
| | |
| | | } |
| | | if (!valid) { |
| | | throw exception(PRO_BATCH_STATUS_INVALID); |
| | | } |
| | | if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) { |
| | | validateBagType(batch.getBagType()); |
| | | } |
| | | // 3. æ´æ°ç¶æ |
| | | batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status)); |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªå
è£
è¢åææ |
| | | */ |
| | | private void validateBagType(Integer bagType) { |
| | | if (bagType != null && MesProBagTypeEnum.valueOfType(bagType) == null) { |
| | | throw exception(PRO_BATCH_BAG_TYPE_INVALID); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¤ææ¹æ¬¡æ¯å¦å·²çæè¢ç ææçç ï¼ç¨äºç¦æ¢ä¿®æ¹è¢åï¼ |
| | | */ |
| | | private boolean bagQuantityOrPalletCreated(MesProBatchDO batch) { |
| | | return (batch.getBagQuantity() != null && batch.getBagQuantity() > 0) |
| | | || (batch.getPalletQuantity() != null && batch.getPalletQuantity() > 0); |
| | | } |
| | | |
| | | /** |
| | | * æå
¥æ¹æ¬¡ç产人åé
ç½® |
| | | */ |
| | | private void insertBatchWorkers(Long batchId, List<MesProBatchSaveReqVO.Worker> workers) { |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.pallet; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; |
| | |
| | | List<Long> batchCreatePallet(@Valid MesProPalletBatchCreateReqVO createReqVO); |
| | | |
| | | /** |
| | | * ææ¹æ¬¡ææè¢ç æ°éèªå¨çæå¹¶ç»å®æ´æè¢ç |
| | | * |
| | | * @param batchId æ¹æ¬¡ç¼å· |
| | | * @return æ¬æ¬¡æ°çæçæçæå°æ°æ® |
| | | */ |
| | | List<MesProPalletAutoPrintRespVO> autoCreatePallets(Long batchId); |
| | | |
| | | /** |
| | | * å 餿çç ï¼æªç»å®è¢ç æå
许å é¤ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBagTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | |
| | | private MesProBagCodeMapper bagCodeMapper; |
| | | @Resource |
| | | private MesProBatchMapper batchMapper; |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | .setPalletNo(palletNo) |
| | | .setCapacity(createReqVO.getCapacity()) |
| | | .setBagCount(0) |
| | | .setAutoGenerated(false) |
| | | .setStatus(MesProPalletStatusEnum.IN_USE.getStatus()) |
| | | .setRemark(createReqVO.getRemark())); |
| | | } |
| | |
| | | .setPalletQuantity((batch.getPalletQuantity() == null ? 0 : batch.getPalletQuantity()) |
| | | + createReqVO.getCount())); |
| | | return pallets.stream().map(MesProPalletDO::getId).toList(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public List<MesProPalletAutoPrintRespVO> autoCreatePallets(Long batchId) { |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(batchId); |
| | | if (batch == null) { |
| | | throw exception(PRO_BATCH_NOT_EXISTS); |
| | | } |
| | | if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) { |
| | | throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE); |
| | | } |
| | | MesProBagTypeEnum bagType = MesProBagTypeEnum.valueOfType(batch.getBagType()); |
| | | if (bagType == null) { |
| | | throw exception(PRO_BATCH_BAG_TYPE_INVALID); |
| | | } |
| | | List<cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO> candidates = |
| | | bagCodeMapper.selectUnboundEffectiveListByBatchId(batchId); |
| | | int threshold = bagType.getThreshold(); |
| | | int palletCount = candidates.size() / threshold; |
| | | if (palletCount == 0) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | int startNo = palletMapper.selectMaxPalletNo(batchId) + 1; |
| | | List<MesProPalletDO> pallets = new ArrayList<>(palletCount); |
| | | List<List<Long>> bagIdGroups = new ArrayList<>(palletCount); |
| | | for (int i = 0; i < palletCount; i++) { |
| | | int palletNo = startNo + i; |
| | | MesProPalletDO pallet = new MesProPalletDO() |
| | | .setCode(batch.getCode() + "-P" + StrUtil.padPre(String.valueOf(palletNo), 2, '0')) |
| | | .setBatchId(batchId) |
| | | .setBatchCode(batch.getCode()) |
| | | .setPalletNo(palletNo) |
| | | .setCapacity(threshold) |
| | | .setBagCount(threshold) |
| | | .setAutoGenerated(true) |
| | | .setStatus(MesProPalletStatusEnum.IN_USE.getStatus()) |
| | | .setRemark("æææè¢ç éå¼èªå¨çæ"); |
| | | pallets.add(pallet); |
| | | bagIdGroups.add(candidates.subList(i * threshold, (i + 1) * threshold).stream() |
| | | .map(cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO::getId).toList()); |
| | | } |
| | | palletMapper.insertBatch(pallets); |
| | | for (int i = 0; i < pallets.size(); i++) { |
| | | MesProPalletDO pallet = pallets.get(i); |
| | | bagCodeMapper.bindPalletByIds(bagIdGroups.get(i), pallet.getId(), pallet.getCode()); |
| | | } |
| | | batchMapper.updateById(new MesProBatchDO().setId(batchId) |
| | | .setPalletQuantity((batch.getPalletQuantity() == null ? 0 : batch.getPalletQuantity()) + pallets.size())); |
| | | return buildAutoPrintVOs(pallets, batch); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | |
| | | private List<MesProPalletAutoPrintRespVO> buildAutoPrintVOs(List<MesProPalletDO> pallets, MesProBatchDO batch) { |
| | | MesMdmItemDO item = batch.getItemId() == null ? null : mdmItemService.getItem(batch.getItemId()); |
| | | AdminUserRespDTO owner = batch.getOwnerUserId() == null ? null : adminUserApi.getUser(batch.getOwnerUserId()); |
| | | return pallets.stream().map(pallet -> new MesProPalletAutoPrintRespVO() |
| | | .setId(pallet.getId()) |
| | | .setCode(pallet.getCode()) |
| | | .setBatchId(pallet.getBatchId()) |
| | | .setBatchCode(pallet.getBatchCode()) |
| | | .setPalletNo(pallet.getPalletNo()) |
| | | .setCopies(3) |
| | | .setCapacity(pallet.getCapacity()) |
| | | .setBagCount(pallet.getBagCount()) |
| | | .setItemId(batch.getItemId()) |
| | | .setItemCode(item == null ? null : item.getCode()) |
| | | .setItemName(item == null ? null : item.getName()) |
| | | .setItemSpecification(item == null ? null : item.getSpecification()) |
| | | .setLineCode(batch.getLineCode()) |
| | | .setLineName(batch.getLineName()) |
| | | .setProduceDate(batch.getProduceDate()) |
| | | .setOwnerUserId(batch.getOwnerUserId()) |
| | | .setOwnerUserName(owner == null ? null : owner.getNickname())) |
| | | .toList(); |
| | | } |
| | | |
| | | @Override |
| | | public MesProPalletDO getPallet(Long id) { |
| | | return palletMapper.selectById(id); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.scan; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventCreateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan.MesProScanEventDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Map; |
| | | |
| | | public interface MesProScanEventService { |
| | | MesProScanEventDO createInbound(@Valid MesProScanEventCreateReqVO reqVO); |
| | | MesProScanEventDO getByEventId(String eventId); |
| | | PageResult<MesProScanEventDO> getPage(MesProScanEventPageReqVO reqVO); |
| | | MesProScanEventDO getLatest(String deviceCode); |
| | | Map<String, Object> getDashboard(); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.scan; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventCreateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.scan.vo.MesProScanEventPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.scan.MesProScanEventDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.scan.MesProScanEventMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.MesProScanEventStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | @Service |
| | | @Validated |
| | | public class MesProScanEventServiceImpl implements MesProScanEventService { |
| | | @Resource private MesProScanEventMapper eventMapper; |
| | | @Resource private MesProBagCodeMapper bagCodeMapper; |
| | | @Resource private MesProBatchMapper batchMapper; |
| | | @Resource private MesWmTransactionService transactionService; |
| | | @Resource private MesWmWarehouseService warehouseService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesProScanEventDO createInbound(MesProScanEventCreateReqVO req) { |
| | | MesProScanEventDO existing = eventMapper.selectByEventIdForUpdate(req.getEventId()); |
| | | if (existing != null) { |
| | | if (!req.getBagCode().equals(existing.getBagCode()) || !req.getDeviceCode().equals(existing.getDeviceCode())) { |
| | | return failed(existing, "MES_SCAN_EVENT_ID_CONFLICT", "äºä»¶å·å·²åå¨ä½å
容ä¸ä¸è´"); |
| | | } |
| | | return existing; |
| | | } |
| | | MesProScanEventDO event = new MesProScanEventDO(); |
| | | event.setEventId(req.getEventId()).setBagCode(req.getBagCode()).setQuantity(req.getQuantity()) |
| | | .setDeviceCode(req.getDeviceCode()).setLineCode(req.getLineCode()).setRemark(req.getRemark()) |
| | | .setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now()); |
| | | eventMapper.insert(event); |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByCodeForUpdate(req.getBagCode()); |
| | | if (bag == null) return failed(event, "MES_SCAN_BAG_NOT_EXISTS", "è¢ç ä¸åå¨"); |
| | | event.setBagCodeId(bag.getId()); |
| | | if (bag.getInboundEventId() != null) return failed(event, "MES_SCAN_BAG_ALREADY_INBOUND", "è¢ç å·²å
¥åº"); |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(bag.getBatchId()); |
| | | if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "çäº§æ¹æ¬¡ä¸åå¨"); |
| | | event.setBatchId(batch.getId()).setBatchCode(batch.getCode()).setItemId(batch.getItemId()); |
| | | MesWmWarehouseDO warehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); |
| | | if (warehouse == null) return failed(event, "MES_SCAN_WIP_WAREHOUSE_NOT_EXISTS", "WIPèæä»ä¸åå¨"); |
| | | event.setWarehouseId(warehouse.getId()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId()); |
| | | try { |
| | | Long txId = transactionService.createTransaction(new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()).setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE) |
| | | .setBizId(batch.getId()).setBizCode(batch.getCode()).setBizLineId(bag.getId()) |
| | | .setItemId(batch.getItemId()).setQuantity(req.getQuantity()).setBatchCode(batch.getCode()) |
| | | .setWarehouseId(warehouse.getId()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId()) |
| | | .setReceiptTime(LocalDateTime.now()).setCheckFlag(true)); |
| | | event.setTransactionId(txId).setStatus(MesProScanEventStatusEnum.SUCCESS).setEventTime(LocalDateTime.now()); |
| | | eventMapper.updateById(event); |
| | | bagCodeMapper.markInbound(bag.getId(), event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | batchMapper.markInbound(batch.getId(), event.getId(), req.getDeviceCode(), req.getLineCode()); |
| | | return event; |
| | | } catch (Exception ex) { |
| | | return failed(event, "MES_SCAN_TRANSACTION_FAILED", "åºåäºå¡å¤ç失败"); |
| | | } |
| | | } |
| | | |
| | | private MesProScanEventDO failed(MesProScanEventDO event, String code, String message) { |
| | | event.setStatus(MesProScanEventStatusEnum.FAILED).setErrorCode(code).setErrorMessage(message) |
| | | .setFailedTime(LocalDateTime.now()).setEventTime(LocalDateTime.now()); |
| | | eventMapper.updateById(event); |
| | | return event; |
| | | } |
| | | |
| | | @Override public MesProScanEventDO getByEventId(String eventId) { return eventMapper.selectOne(MesProScanEventDO::getEventId, eventId); } |
| | | @Override public PageResult<MesProScanEventDO> getPage(MesProScanEventPageReqVO reqVO) { return eventMapper.selectPage(reqVO); } |
| | | @Override public MesProScanEventDO getLatest(String deviceCode) { return eventMapper.selectLatest(deviceCode); } |
| | | @Override public Map<String, Object> getDashboard() { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | result.put("latest", eventMapper.selectLatest(null)); |
| | | result.put("total", eventMapper.selectCount(null)); |
| | | result.put("success", eventMapper.selectCount(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProScanEventDO>().eq(MesProScanEventDO::getStatus, MesProScanEventStatusEnum.SUCCESS))); |
| | | result.put("failed", eventMapper.selectCount(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProScanEventDO>().eq(MesProScanEventDO::getStatus, MesProScanEventStatusEnum.FAILED))); |
| | | return result; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.seedquality; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | public interface MesQcSeedQualityService { Long submit(MesQcSeedQualitySubmitReqVO reqVO); } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.*; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.*; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | |
| | | @Service @Validated |
| | | public class MesQcSeedQualityServiceImpl implements MesQcSeedQualityService { |
| | | private static final Set<String> REQUIRED = Set.of("purity", "cleanliness", "germination_rate", "moisture"); |
| | | @Resource private MesQcSeedQualityMapper qualityMapper; |
| | | @Resource private MesQcSeedQualityIndicatorMapper indicatorMapper; |
| | | |
| | | @Override @Transactional(rollbackFor = Exception.class) |
| | | public Long submit(MesQcSeedQualitySubmitReqVO reqVO) { |
| | | if (reqVO.getIndicators().size() != 4) throw new IllegalArgumentException("å¿
é¡»æäº¤åé¡¹ææ "); |
| | | if (qualityMapper.selectByCode(reqVO.getCode()) != null) throw new IllegalArgumentException("该è¢ç 已质æ£ï¼ç¦æ¢éå¤æäº¤"); |
| | | Set<String> codes = new HashSet<>(); |
| | | boolean passed = true; |
| | | MesQcSeedQualityDO quality = MesQcSeedQualityDO.builder().code(reqVO.getCode()).itemId(reqVO.getItemId()) |
| | | .batchCode(reqVO.getBatchCode()).reason(reqVO.getReason()).result(0) |
| | | .inspectedAt(LocalDateTime.now()).build(); |
| | | qualityMapper.insert(quality); |
| | | for (MesQcSeedQualitySubmitReqVO.Indicator item : reqVO.getIndicators()) { |
| | | if (!REQUIRED.contains(item.getCode()) || !codes.add(item.getCode())) throw new IllegalArgumentException("ææ å¿
须为纯度ãå度ãåè½çãæ°´åä¸ä¸å¯éå¤"); |
| | | if (item.getMinValue().compareTo(item.getMaxValue()) > 0 || item.getValue().compareTo(item.getMinValue()) < 0 || item.getValue().compareTo(item.getMaxValue()) > 0) passed = false; |
| | | indicatorMapper.insert(MesQcSeedQualityIndicatorDO.builder().qualityId(quality.getId()).indicatorCode(item.getCode()) |
| | | .value(item.getValue()).minValue(item.getMinValue()).maxValue(item.getMaxValue()).build()); |
| | | } |
| | | if (!codes.equals(REQUIRED)) throw new IllegalArgumentException("åé¡¹ææ ä¸å®æ´"); |
| | | quality.setResult(passed ? 1 : 2); |
| | | qualityMapper.updateById(quality); |
| | | // åºä½ç±åå°é
ç½®æå¡æ¥ç®¡ï¼å½åçæ¬ä¿ç审计éç¯ï¼ç¦æ¢åç«¯ä¼ å
¥åºä½ã |
| | | return quality.getId(); |
| | | } |
| | | } |