From 4bae94e9fcf8eeca949c1af0075e0c226b111d35 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 3 Jul 2026 14:31:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8D=95=E5=AD=97=E6=AE=B5=E6=91=86=E6=94=BE?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=8F=8A=E5=8C=85=E8=A3=85=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/task/TaskController.java | 14 ++-- .../admin/task/vo/TaskDetailPageReqVO.java | 21 ++++++ .../admin/task/vo/TaskDetailRespVO.java | 27 ++++++- .../admin/task/vo/TaskDetailSaveReqVO.java | 74 +++++++++++++++++++ .../mes/dal/dataobject/task/TaskDetailDO.java | 27 ++++++- .../module/mes/service/task/TaskService.java | 6 +- .../mes/service/task/TaskServiceImpl.java | 49 +++++++++++- 7 files changed, 201 insertions(+), 17 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailSaveReqVO.java diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java index cf9674a11..bc2e1a683 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java @@ -230,25 +230,23 @@ public class TaskController { @GetMapping("/task-detail/page") @Operation(summary = "获得生产任务单明细分页") - @Parameter(name = "taskId", description = "task ID") @PreAuthorize("@ss.hasPermission('mes:task:query')") - public CommonResult> getTaskDetailPage(PageParam pageReqVO, - @RequestParam("taskId") Long taskId) { - return success(taskService.getTaskDetailPage(pageReqVO, taskId)); + public CommonResult> getTaskDetailPage(@Valid TaskDetailPageReqVO pageReqVO) { + return success(taskService.getTaskDetailPage(pageReqVO)); } @PostMapping("/task-detail/create") @Operation(summary = "创建生产任务单明细") @PreAuthorize("@ss.hasPermission('mes:task:create')") - public CommonResult createTaskDetail(@Valid @RequestBody TaskDetailDO taskDetail) { - return success(taskService.createTaskDetail(taskDetail)); + public CommonResult createTaskDetail(@Valid @RequestBody TaskDetailSaveReqVO createReqVO) { + return success(taskService.createTaskDetail(createReqVO)); } @PutMapping("/task-detail/update") @Operation(summary = "更新生产任务单明细") @PreAuthorize("@ss.hasPermission('mes:task:update')") - public CommonResult updateTaskDetail(@Valid @RequestBody TaskDetailDO taskDetail) { - taskService.updateTaskDetail(taskDetail); + public CommonResult updateTaskDetail(@Valid @RequestBody TaskDetailSaveReqVO updateReqVO) { + taskService.updateTaskDetail(updateReqVO); return success(true); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailPageReqVO.java new file mode 100644 index 000000000..17e496406 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailPageReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 生产任务单明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TaskDetailPageReqVO extends PageParam { + + @Schema(description = "任务单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12825") + @NotNull(message = "任务单 ID 不能为空") + private Long taskId; + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java index 2b7fb5d5c..abcc10a12 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java @@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDateTime; @Schema(description = "管理后台 - 生产任务单明细 Response VO") @@ -80,6 +81,30 @@ public class TaskDetailRespVO { @Schema(description = "附件", example = "你猜") @ExcelProperty("附件") private String attachment; + + @Schema(description = "摆放规则", example = "一横一竖") + @ExcelProperty("摆放规则") + private String placementRule; + + @Schema(description = "包装方案 ID", example = "1") + @ExcelProperty("包装方案 ID") + private Long packagingSchemeId; + + @Schema(description = "包装方案名称", example = "标准包装方案") + @ExcelProperty("包装方案名称") + private String packagingSchemeName; + + @Schema(description = "每包数量(件)", example = "100") + @ExcelProperty("每包数量(件)") + private BigDecimal packageQuantity; + + @Schema(description = "每托包数(包)", example = "20") + @ExcelProperty("每托包数(包)") + private BigDecimal palletPackageQuantity; + + @Schema(description = "每托总数量(件)", example = "2000") + @ExcelProperty("每托总数量(件)") + private BigDecimal palletTotalQuantity; /** * 工厂完成 */ @@ -111,4 +136,4 @@ public class TaskDetailRespVO { @Schema(description = "关联设备", example = "EQ-01-搅拌机,EQ-02-封口机") private String deviceDisplayName; -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailSaveReqVO.java new file mode 100644 index 000000000..d4c786c53 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailSaveReqVO.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 生产任务单明细新增/修改 Request VO") +@Data +public class TaskDetailSaveReqVO { + + @Schema(description = "ID,更新时必填", example = "2696") + private Long id; + + @Schema(description = "产品 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4041") + @NotNull(message = "产品 ID 不能为空") + private Long productId; + + @Schema(description = "单位 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13695") + @NotNull(message = "单位 ID 不能为空") + private Long unitId; + + @Schema(description = "任务单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12825") + @NotNull(message = "任务单 ID 不能为空") + private Long taskId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") + @NotNull(message = "数量不能为空") + private Long number; + + @Schema(description = "打包要求(每包/个)", example = "50") + private Long packageSize; + + @Schema(description = "项目名称", example = "一期项目") + private String projectName; + + @Schema(description = "技术要求", example = "按图纸生产") + private String techRequirements; + + @Schema(description = "备注", example = "加急") + private String remark; + + @Schema(description = "是否启用", example = "true") + private Boolean isEnable; + + @Schema(description = "打包数量/包", example = "20") + private Long packageNumber; + + @Schema(description = "条码", example = "BARCODE001") + private String barCode; + + @Schema(description = "附件 URL", example = "https://example.com/file.pdf") + private String attachment; + + @Schema(description = "摆放规则", example = "一横一竖") + private String placementRule; + + @Schema(description = "包装方案 ID。前端只需传 ID,后端自动保存包装方案名称、每包数量、每托包数、每托总数量", example = "1") + private Long packagingSchemeId; + + @Schema(description = "工厂完成时间") + private LocalDateTime finishDate; + + @Schema(description = "装柜时间") + private LocalDateTime boxingDate; + + @Schema(description = "到达时间") + private LocalDateTime arriveDate; + + @Schema(description = "订单单号", example = "SO202607030001") + private String saleOrderCode; + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java index f2b6647b4..8a4b6e376 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -77,6 +78,30 @@ public class TaskDetailDO extends BaseDO { * 附件 */ private String attachment; + /** + * 摆放规则 + */ + private String placementRule; + /** + * 包装方案 ID + */ + private Long packagingSchemeId; + /** + * 包装方案名称 + */ + private String packagingSchemeName; + /** + * 每包数量(件) + */ + private BigDecimal packageQuantity; + /** + * 每托包数(包) + */ + private BigDecimal palletPackageQuantity; + /** + * 每托总数量(件) + */ + private BigDecimal palletTotalQuantity; /** * 工厂完成 */ @@ -91,4 +116,4 @@ public class TaskDetailDO extends BaseDO { private LocalDateTime arriveDate; //订单单号 private String saleOrderCode; -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java index 40b39d2c0..62f1d4f09 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java @@ -104,7 +104,7 @@ public interface TaskService { * @param taskId task ID * @return 生产任务单明细分页 */ - PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId); + PageResult getTaskDetailPage(TaskDetailPageReqVO pageReqVO); //产品汇总 List getTaskProductSummaryList(Long taskId); @@ -115,14 +115,14 @@ public interface TaskService { * @param taskDetail 创建信息 * @return 编号 */ - Long createTaskDetail(@Valid TaskDetailDO taskDetail); + Long createTaskDetail(@Valid TaskDetailSaveReqVO createReqVO); /** * 更新生产任务单明细 * * @param taskDetail 更新信息 */ - void updateTaskDetail(@Valid TaskDetailDO taskDetail); + void updateTaskDetail(@Valid TaskDetailSaveReqVO updateReqVO); /** * 删除生产任务单明细 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index e5ceaa10f..b3edd2d15 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -10,8 +10,10 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductPa import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductRelationRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpPackagingSchemeDO; import cn.iocoder.yudao.module.erp.dal.dataobject.productdevicerel.ProductDeviceRelDO; import cn.iocoder.yudao.module.erp.dal.dataobject.productpackagingschemerel.ProductPackagingSchemeRelDO; +import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpPackagingSchemeMapper; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; import cn.iocoder.yudao.module.erp.dal.mysql.productdevicerel.ProductDeviceRelMapper; import cn.iocoder.yudao.module.erp.dal.mysql.productpackagingschemerel.ProductPackagingSchemeRelMapper; @@ -106,6 +108,8 @@ public class TaskServiceImpl implements TaskService { private ProductDeviceRelMapper productDeviceRelMapper; @Resource private ProductPackagingSchemeRelMapper productPackagingSchemeRelMapper; + @Resource + private ErpPackagingSchemeMapper erpPackagingSchemeMapper; @Resource private DeviceLedgerService deviceLedgerService; @@ -319,6 +323,7 @@ public class TaskServiceImpl implements TaskService { private void createTaskDetailList(Long taskId, List list) { list.forEach(o -> o.setTaskId(taskId)); + fillPackagingSchemeSnapshot(list); taskDetailMapper.insertBatch(list); } @@ -343,8 +348,8 @@ public class TaskServiceImpl implements TaskService { private PlanMapper planMapper; @Override - public PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId) { - PageResult pageResult = taskDetailMapper.selectPage(pageReqVO, taskId); + public PageResult getTaskDetailPage(TaskDetailPageReqVO pageReqVO) { + PageResult pageResult = taskDetailMapper.selectPage(pageReqVO, pageReqVO.getTaskId()); return new PageResult<>(buildDetailVOList(pageResult.getList()), pageResult.getTotal()); } @@ -437,19 +442,55 @@ public class TaskServiceImpl implements TaskService { @Override - public Long createTaskDetail(TaskDetailDO taskDetail) { + public Long createTaskDetail(TaskDetailSaveReqVO createReqVO) { + TaskDetailDO taskDetail = BeanUtils.toBean(createReqVO, TaskDetailDO.class); + fillPackagingSchemeSnapshot(taskDetail); taskDetailMapper.insert(taskDetail); return taskDetail.getId(); } @Override - public void updateTaskDetail(TaskDetailDO taskDetail) { + public void updateTaskDetail(TaskDetailSaveReqVO updateReqVO) { + TaskDetailDO taskDetail = BeanUtils.toBean(updateReqVO, TaskDetailDO.class); // 校验存在 validateTaskDetailExists(taskDetail.getId()); + fillPackagingSchemeSnapshot(taskDetail); // 更新 taskDetailMapper.updateById(taskDetail); } + private void fillPackagingSchemeSnapshot(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + list.forEach(this::fillPackagingSchemeSnapshot); + } + + private void fillPackagingSchemeSnapshot(TaskDetailDO taskDetail) { + if (taskDetail == null) { + return; + } + if (taskDetail.getPackagingSchemeId() == null) { + taskDetail.setPackagingSchemeName(null); + taskDetail.setPackageQuantity(null); + taskDetail.setPalletPackageQuantity(null); + taskDetail.setPalletTotalQuantity(null); + return; + } + ErpPackagingSchemeDO packagingScheme = erpPackagingSchemeMapper.selectById(taskDetail.getPackagingSchemeId()); + if (packagingScheme == null) { + taskDetail.setPackagingSchemeName(null); + taskDetail.setPackageQuantity(null); + taskDetail.setPalletPackageQuantity(null); + taskDetail.setPalletTotalQuantity(null); + return; + } + taskDetail.setPackagingSchemeName(packagingScheme.getName()); + taskDetail.setPackageQuantity(packagingScheme.getPackageQuantity()); + taskDetail.setPalletPackageQuantity(packagingScheme.getPalletPackageQuantity()); + taskDetail.setPalletTotalQuantity(packagingScheme.getPalletTotalQuantity()); + } + @Override public void deleteTaskDetail(Long id) { // 校验存在