feat(mes): 新增包装袋型管理和托盘自动生成功能
- 在 DictTypeConstants 中添加包装袋型字典常量
- 在 ErrorCodeConstants 中添加袋型相关错误码定义
- 修改 MesProBagCodeController 的 generateBagCodes 接口返回托盘标签数据
- 在 MesProBagCodeMapper 中添加查询未绑定有效袋码的方法
- 更新 MesProBagCodeService 接口返回托盘生成结果
- 在 MesProBatchDO 中添加 bagType 字段存储包装袋型
- 在 MesProBatchRespVO 和 SaveReqVO 中添加包装袋型字段
- 实现批次袋型校验和修改限制逻辑
- 在 MesProPalletDO 中添加 autoGenerated 自动生成标识字段
- 在 MesProPalletRespVO 中添加自动生成标识字段
- 实现 MesProPalletService 的 autoCreatePallets 自动托盘生成功能
- 添加 MesProBagCodeGenerateRespVO 和 MesProPalletAutoPrintRespVO 数据传输对象
- 定义 MesProBagTypeEnum 枚举包含小袋大袋类型和阈值
- 提供前端联调文档和数据库迁移脚本
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 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` 为åã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- 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'); |
| | |
| | | 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) |
| | |
| | | */ |
| | | 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 bagCount; |
| | | /** |
| | | * æ¯å¦èªå¨çæï¼æææè¢ç 累计éå¼çæï¼å®¹éåºå®ä¸ºéå¼ï¼ |
| | | */ |
| | | private Boolean autoGenerated; |
| | | /** |
| | | * ç¶æ |
| | | * <p> |
| | | * åå
¸ {@link DictTypeConstants#MES_PRO_PALLET_STATUS} |
| | |
| | | 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 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); |
| | | } |
| | |
| | | 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 æçç ç¶æ |
| | | |
| | |
| | | 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.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); |