From abddf4a1c402cd3babd791fbcc18656bae758459 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 8 Mar 2026 09:22:22 +0800 Subject: [PATCH] ✨ feat(mes): 添加装箱单及装箱明细相关功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java | 20 ++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java | 29 +++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java | 33 +++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 14 ++++++++++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 1368 insertions(+), 2 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java new file mode 100644 index 0000000..87983f3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java @@ -0,0 +1,180 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +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.wm.wmpackage.vo.MesWmPackagePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.wmpackage.MesWmPackageService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 装箱单") +@RestController +@RequestMapping("/mes/wm/package") +@Validated +public class MesWmPackageController { + + @Resource + private MesWmPackageService packageService; + @Resource + private MesMdClientService clientService; + @Resource + private MesMdUnitMeasureService unitMeasureService; + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/create") + @Operation(summary = "创建装箱单") + @PreAuthorize("@ss.hasPermission('mes:wm-package:create')") + public CommonResult createPackage(@Valid @RequestBody MesWmPackageSaveReqVO createReqVO) { + return success(packageService.createPackage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改装箱单") + @PreAuthorize("@ss.hasPermission('mes:wm-package:update')") + public CommonResult updatePackage(@Valid @RequestBody MesWmPackageSaveReqVO updateReqVO) { + packageService.updatePackage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除装箱单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-package:delete')") + public CommonResult deletePackage(@RequestParam("id") Long id) { + packageService.deletePackage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得装箱单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult getPackage(@RequestParam("id") Long id) { + MesWmPackageDO packageDO = packageService.getPackage(id); + if (packageDO == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(packageDO)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得装箱单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult> getPackagePage( + @Valid MesWmPackagePageReqVO pageReqVO) { + PageResult pageResult = packageService.getPackagePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出装箱单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-package:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportPackageExcel(@Valid MesWmPackagePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = packageService.getPackagePage(pageReqVO); + ExcelUtils.write(response, "装箱单.xls", "数据", MesWmPackageRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/finish") + @Operation(summary = "完成装箱单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-package:update')") + public CommonResult finishPackage(@RequestParam("id") Long id) { + packageService.finishPackage(id); + return success(true); + } + + @GetMapping("/tree") + @Operation(summary = "获得装箱单树形结构") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult> getPackageTree() { + List list = packageService.getPackageTree(); + List voList = buildRespVOList(list); + // 构建树形结构 + return success(buildTree(voList)); + } + + // ========== 私有方法 ========== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 批量查询客户 + Map clientMap = clientService.getClientMap( + convertSet(list, MesWmPackageDO::getClientId)); + // 批量查询计量单位(尺寸 + 重量) + Set unitIds = new HashSet<>(); + list.forEach(p -> { + if (p.getSizeUnitId() != null) { + unitIds.add(p.getSizeUnitId()); + } + if (p.getWeightUnitId() != null) { + unitIds.add(p.getWeightUnitId()); + } + }); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap(unitIds); + // 批量查询检查员 + Map userMap = adminUserApi.getUserMap( + convertSet(list, MesWmPackageDO::getInspectorUserId)); + + return BeanUtils.toBean(list, MesWmPackageRespVO.class, vo -> { + MapUtils.findAndThen(clientMap, vo.getClientId(), + client -> vo.setClientCode(client.getCode()).setClientName(client.getName()) + .setClientNickname(client.getNickname())); + MapUtils.findAndThen(unitMeasureMap, vo.getSizeUnitId(), + unit -> vo.setSizeUnitName(unit.getName())); + MapUtils.findAndThen(unitMeasureMap, vo.getWeightUnitId(), + unit -> vo.setWeightUnitName(unit.getName())); + MapUtils.findAndThen(userMap, vo.getInspectorUserId(), + user -> vo.setInspectorName(user.getNickname())); + }); + } + + private List buildTree(List list) { + // 按 parentId 分组 + Map> parentMap = list.stream() + .collect(Collectors.groupingBy(vo -> vo.getParentId() != null ? vo.getParentId() : 0L)); + // 设置 children + list.forEach(vo -> vo.setChildren(parentMap.get(vo.getId()))); + // 返回顶级节点(parentId == 0 或 parentId == null) + return list.stream() + .filter(vo -> vo.getParentId() == null || vo.getParentId() == 0L) + .collect(Collectors.toList()); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java new file mode 100644 index 0000000..a15e511 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java @@ -0,0 +1,160 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import cn.iocoder.yudao.module.mes.service.wm.wmpackage.MesWmPackageLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +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 java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 装箱明细") +@RestController +@RequestMapping("/mes/wm/package-line") +@Validated +public class MesWmPackageLineController { + + @Resource + private MesWmPackageLineService packageLineService; + @Resource + private MesMdItemService itemService; + @Resource + private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesProWorkOrderService workOrderService; + @Resource + private MesWmWarehouseService warehouseService; + @Resource + private MesWmWarehouseLocationService locationService; + @Resource + private MesWmWarehouseAreaService areaService; + + @PostMapping("/create") + @Operation(summary = "创建装箱明细") + @PreAuthorize("@ss.hasPermission('mes:wm-package:create')") + public CommonResult createPackageLine(@Valid @RequestBody MesWmPackageLineSaveReqVO createReqVO) { + return success(packageLineService.createPackageLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改装箱明细") + @PreAuthorize("@ss.hasPermission('mes:wm-package:update')") + public CommonResult updatePackageLine(@Valid @RequestBody MesWmPackageLineSaveReqVO updateReqVO) { + packageLineService.updatePackageLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除装箱明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-package:delete')") + public CommonResult deletePackageLine(@RequestParam("id") Long id) { + packageLineService.deletePackageLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得装箱明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult getPackageLine(@RequestParam("id") Long id) { + MesWmPackageLineDO line = packageLineService.getPackageLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得装箱明细分页") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult> getPackageLinePage( + @Valid MesWmPackageLinePageReqVO pageReqVO) { + PageResult pageResult = packageLineService.getPackageLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/list-by-package-id") + @Operation(summary = "根据装箱单 ID 获得明细列表") + @Parameter(name = "packageId", description = "装箱单 ID", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") + public CommonResult> getPackageLineListByPackageId( + @RequestParam("packageId") Long packageId) { + List list = packageLineService.getPackageLineListByPackageId(packageId); + return success(buildRespVOList(list)); + } + + // ========== 私有方法 ========== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 批量查询物料 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmPackageLineDO::getItemId)); + // 批量查询计量单位 + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 批量查询工单 + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesWmPackageLineDO::getWorkOrderId)); + // 批量查询仓库 + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmPackageLineDO::getWarehouseId)); + // 批量查询库区 + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmPackageLineDO::getLocationId)); + // 批量查询库位 + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmPackageLineDO::getAreaId)); + // 拼接数据 + return BeanUtils.toBean(list, MesWmPackageLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()) + .setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unit -> vo.setUnitMeasureName(unit.getName())); + }); + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), + workOrder -> vo.setWorkOrderCode(workOrder.getCode()).setBatchCode(workOrder.getBatchCode())); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), + warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getLocationId(), + location -> vo.setLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), + area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java new file mode 100644 index 0000000..4238e8a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.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 org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - MES 装箱单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmPackagePageReqVO extends PageParam { + + @Schema(description = "装箱单编号", example = "PKG") + private String code; + + @Schema(description = "销售订单编号", example = "SO") + private String soCode; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "装箱日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate[] packageDate; + + @Schema(description = "状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java new file mode 100644 index 0000000..6b241ed --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java @@ -0,0 +1,113 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - MES 装箱单 Response VO") +@Data +@Accessors(chain = true) +@ExcelIgnoreUnannotated +public class MesWmPackageRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "装箱单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PKG20260307001") + @ExcelProperty("装箱单编号") + private String code; + + @Schema(description = "父箱 ID", example = "0") + private Long parentId; + + @Schema(description = "装箱日期") + @ExcelProperty("装箱日期") + private LocalDate packageDate; + + @Schema(description = "销售订单编号", example = "SO20260301") + @ExcelProperty("销售订单编号") + private String soCode; + + @Schema(description = "发票编号", example = "INV20260301") + @ExcelProperty("发票编号") + private String invoiceCode; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "客户编码", example = "C001") + @ExcelProperty("客户编码") + private String clientCode; + + @Schema(description = "客户名称", example = "某客户") + @ExcelProperty("客户名称") + private String clientName; + + @Schema(description = "客户简称", example = "某客户简称") + private String clientNickname; + + @Schema(description = "箱长度", example = "60.00") + @ExcelProperty("箱长度") + private BigDecimal length; + + @Schema(description = "箱宽度", example = "40.00") + @ExcelProperty("箱宽度") + private BigDecimal width; + + @Schema(description = "箱高度", example = "30.00") + @ExcelProperty("箱高度") + private BigDecimal height; + + @Schema(description = "尺寸单位 ID", example = "1") + private Long sizeUnitId; + + @Schema(description = "尺寸单位名称", example = "厘米") + @ExcelProperty("尺寸单位") + private String sizeUnitName; + + @Schema(description = "净重", example = "10.00") + @ExcelProperty("净重") + private BigDecimal netWeight; + + @Schema(description = "毛重", example = "12.00") + @ExcelProperty("毛重") + private BigDecimal grossWeight; + + @Schema(description = "重量单位 ID", example = "2") + private Long weightUnitId; + + @Schema(description = "重量单位名称", example = "千克") + @ExcelProperty("重量单位") + private String weightUnitName; + + @Schema(description = "检查员用户 ID", example = "1") + private Long inspectorUserId; + + @Schema(description = "检查员姓名", example = "张三") + @ExcelProperty("检查员") + private String inspectorName; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "子箱列表") + private List children; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java new file mode 100644 index 0000000..18fb504 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Schema(description = "管理后台 - MES 装箱单新增/修改 Request VO") +@Data +public class MesWmPackageSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "装箱单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PKG20260307001") + @NotEmpty(message = "装箱单编号不能为空") + private String code; + + @Schema(description = "父箱 ID", example = "0") + private Long parentId; + + @Schema(description = "装箱日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "装箱日期不能为空") + private LocalDate packageDate; + + @Schema(description = "销售订单编号", example = "SO20260301") + private String soCode; + + @Schema(description = "发票编号", example = "INV20260301") + private String invoiceCode; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "箱长度", example = "60.00") + private BigDecimal length; + + @Schema(description = "箱宽度", example = "40.00") + private BigDecimal width; + + @Schema(description = "箱高度", example = "30.00") + private BigDecimal height; + + @Schema(description = "尺寸单位 ID", example = "1") + private Long sizeUnitId; + + @Schema(description = "净重", example = "10.00") + private BigDecimal netWeight; + + @Schema(description = "毛重", example = "12.00") + private BigDecimal grossWeight; + + @Schema(description = "重量单位 ID", example = "2") + private Long weightUnitId; + + @Schema(description = "检查员用户 ID", example = "1") + private Long inspectorUserId; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java new file mode 100644 index 0000000..c2c8ae2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 装箱明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmPackageLinePageReqVO extends PageParam { + + @Schema(description = "装箱单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "装箱单 ID 不能为空") + private Long packageId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java new file mode 100644 index 0000000..6ac33e0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 装箱明细 Response VO") +@Data +@Accessors(chain = true) +public class MesWmPackageLineRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "装箱单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long packageId; + + @Schema(description = "库存记录 ID", example = "1") + private Long materialStockId; + + @Schema(description = "产品物料 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "螺栓") + private String itemName; + + @Schema(description = "规格型号", example = "M10*50") + private String specification; + + @Schema(description = "计量单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "装箱数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + + @Schema(description = "生产工单 ID", example = "1") + private Long workOrderId; + + @Schema(description = "生产工单编号", example = "WO20260301") + private String workOrderCode; + + @Schema(description = "批次号", example = "BATCH001") + private String batchCode; + + @Schema(description = "仓库 ID", example = "1") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "成品仓") + private String warehouseName; + + @Schema(description = "库区 ID", example = "1") + private Long locationId; + + @Schema(description = "库区名称", example = "A区") + private String locationName; + + @Schema(description = "库位 ID", example = "1") + private Long areaId; + + @Schema(description = "库位名称", example = "A-01-01") + private String areaName; + + @Schema(description = "有效期") + private LocalDate expireDate; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java new file mode 100644 index 0000000..ff63430 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Schema(description = "管理后台 - MES 装箱明细新增/修改 Request VO") +@Data +public class MesWmPackageLineSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "装箱单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "装箱单 ID 不能为空") + private Long packageId; + + @Schema(description = "库存记录 ID", example = "1") + private Long materialStockId; + + @Schema(description = "产品物料 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "产品物料不能为空") + private Long itemId; + + @Schema(description = "装箱数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "装箱数量不能为空") + @DecimalMin(value = "0.01", message = "装箱数量必须大于 0") + private BigDecimal quantity; + + @Schema(description = "生产工单 ID", example = "1") + private Long workOrderId; + + @Schema(description = "仓库 ID", example = "1") + private Long warehouseId; + + @Schema(description = "库区 ID", example = "1") + private Long locationId; + + @Schema(description = "库位 ID", example = "1") + private Long areaId; + + @Schema(description = "有效期") + private LocalDate expireDate; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java new file mode 100644 index 0000000..7837c20 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java @@ -0,0 +1,110 @@ +// TODO @AI:报名改成 packages 避免 Java 关键字冲突; +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +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.LocalDate; + +/** + * MES 装箱单 DO + */ +@TableName("mes_wm_package") +@KeySequence("mes_wm_package_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmPackageDO extends BaseDO { + + private static final Integer PARENT_ID_ROOT = 0; + + @TableId + private Long id; + /** + * 装箱单编号 + */ + private String code; + /** + * 父箱 ID + */ + private Long parentId; + /** + * 装箱日期 + */ + private LocalDate packageDate; + // TODO @AI:改成 salesOrderCode + /** + * 销售订单编号 + */ + private String soCode; + /** + * 发票编号 + */ + private String invoiceCode; + /** + * 客户 ID + * + * 关联 {@link MesMdClientDO#getId()} + */ + private Long clientId; + /** + * 箱长度 + */ + private BigDecimal length; + /** + * 箱宽度 + */ + private BigDecimal width; + /** + * 箱高度 + */ + private BigDecimal height; + /** + * 尺寸单位 ID + * + * 关联 {@link MesMdUnitMeasureDO#getId()} + */ + private Long sizeUnitId; + /** + * 净重 + */ + private BigDecimal netWeight; + /** + * 毛重 + */ + private BigDecimal grossWeight; + /** + * 重量单位 ID + * + * 关联 {@link MesMdUnitMeasureDO#getId()} + */ + private Long weightUnitId; + /** + * 检查员用户 ID + * + * 关联 AdminUserDO 的 id + */ + private Long inspectorUserId; + // TODO @AI:自定义一个属于自己的枚举类;类似:MesWmSalesNoticeStatusEnum + /** + * 状态 + * + * 枚举 {@link MesOrderStatusConstants#PREPARE}、{@link MesOrderStatusConstants#FINISHED} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java new file mode 100644 index 0000000..e803f7b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +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.LocalDate; + +/** + * MES 装箱明细 DO + */ +@TableName("mes_wm_package_line") +@KeySequence("mes_wm_package_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmPackageLineDO extends BaseDO { + + @TableId + private Long id; + /** + * 装箱单 ID + * + * 关联 {@link MesWmPackageDO#getId()} + */ + private Long packageId; + /** + * 库存记录 ID + */ + private Long materialStockId; + /** + * 产品物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 装箱数量 + */ + private BigDecimal quantity; + // TODO @AI:需要在确认下; + /** + * 生产工单 ID + * + * 关联 {@link MesProWorkOrderDO#getId()} + */ + private Long workOrderId; + /** + * 仓库 ID + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区 ID + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位 ID + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 有效期 + */ + private LocalDate expireDate; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java new file mode 100644 index 0000000..43904be --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MesWmPackageLineMapper extends BaseMapperX { + + default PageResult selectPage(MesWmPackageLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmPackageLineDO::getPackageId, reqVO.getPackageId()) + .orderByDesc(MesWmPackageLineDO::getId)); + } + + default List selectListByPackageId(Long packageId) { + return selectList(MesWmPackageLineDO::getPackageId, packageId); + } + + default void deleteByPackageId(Long packageId) { + delete(MesWmPackageLineDO::getPackageId, packageId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java new file mode 100644 index 0000000..4f4c0ff --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MesWmPackageMapper extends BaseMapperX { + + default PageResult selectPage(MesWmPackagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmPackageDO::getSoCode, reqVO.getSoCode()) + .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId()) + .betweenIfPresent(MesWmPackageDO::getPackageDate, reqVO.getPackageDate()) + .eqIfPresent(MesWmPackageDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesWmPackageDO::getId)); + } + + default MesWmPackageDO selectByCode(String code) { + return selectOne(MesWmPackageDO::getCode, code); + } + + default List selectListByParentId(Long parentId) { + return selectList(MesWmPackageDO::getParentId, parentId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index e581a91..3dd3090 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -351,8 +351,10 @@ public interface ErrorCodeConstants { ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "入库单状态不正确"); ErrorCode WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_705_006, "已完成或已取消的入库单不允许取消"); ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "采购入库单行不存在"); - ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_705_101, "入库单关联了到货通知单,必须选择到货通知单行"); - ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_705_102, "入库单未关联到货通知单,不能选择到货通知单行"); + ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_705_101, + "入库单关联了到货通知单,必须选择到货通知单行"); + ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_705_102, + "入库单未关联到货通知单,不能选择到货通知单行"); ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== @@ -509,4 +511,12 @@ public interface ErrorCodeConstants { ErrorCode BARCODE_BIZ_CODE_NOT_EXISTS = new ErrorCode(1_040_731_004, "业务编码不能为空"); ErrorCode BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_731_005, "条码配置不存在"); + // ========== MES 仓库管理-装箱单(1-040-740-000) ========== + ErrorCode WM_PACKAGE_NOT_EXISTS = new ErrorCode(1_040_740_000, "装箱单不存在"); + ErrorCode WM_PACKAGE_CODE_DUPLICATE = new ErrorCode(1_040_740_001, "装箱单编码已存在"); + ErrorCode WM_PACKAGE_STATUS_NOT_PREPARE = new ErrorCode(1_040_740_002, "只有草稿状态才允许此操作"); + ErrorCode WM_PACKAGE_PARENT_NOT_EXISTS = new ErrorCode(1_040_740_003, "父箱不存在"); + ErrorCode WM_PACKAGE_PARENT_SELF = new ErrorCode(1_040_740_004, "不能选择自己作为父箱"); + ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java new file mode 100644 index 0000000..d2645e0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.service.wm.wmpackage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 装箱明细 Service 接口 + */ +public interface MesWmPackageLineService { + + /** + * 创建装箱明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPackageLine(@Valid MesWmPackageLineSaveReqVO createReqVO); + + /** + * 修改装箱明细 + * + * @param updateReqVO 修改信息 + */ + void updatePackageLine(@Valid MesWmPackageLineSaveReqVO updateReqVO); + + /** + * 删除装箱明细 + * + * @param id 编号 + */ + void deletePackageLine(Long id); + + /** + * 获得装箱明细 + * + * @param id 编号 + * @return 装箱明细 + */ + MesWmPackageLineDO getPackageLine(Long id); + + /** + * 获得装箱明细分页 + * + * @param pageReqVO 分页查询 + * @return 分页结果 + */ + PageResult getPackageLinePage(MesWmPackageLinePageReqVO pageReqVO); + + /** + * 根据装箱单 ID 获得明细列表 + * + * @param packageId 装箱单 ID + * @return 明细列表 + */ + List getPackageLineListByPackageId(Long packageId); + + /** + * 根据装箱单 ID 删除所有明细 + * + * @param packageId 装箱单 ID + */ + void deletePackageLineByPackageId(Long packageId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java new file mode 100644 index 0000000..5657576 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java @@ -0,0 +1,107 @@ +package cn.iocoder.yudao.module.mes.service.wm.wmpackage; + +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage.MesWmPackageLineMapper; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +@Service +@Validated +public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { + + @Resource + private MesWmPackageLineMapper packageLineMapper; + @Resource + @Lazy + private MesWmPackageService packageService; + + @Override + public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) { + // TODO @AI:检查关联的 packageId(草稿)、itemId + + // 校验装箱单状态为草稿 + validatePackageStatusDraft(createReqVO.getPackageId()); + MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class); + packageLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) { + // 校验存在 + MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId()); + // TODO @AI:检查关联的 packageId(草稿)、itemId + + // 校验装箱单状态为草稿 + validatePackageStatusDraft(line.getPackageId()); + MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class); + packageLineMapper.updateById(updateObj); + } + + @Override + public void deletePackageLine(Long id) { + // 校验存在 + MesWmPackageLineDO line = validatePackageLineExists(id); + // 校验装箱单状态为草稿 + validatePackageStatusDraft(line.getPackageId()); + + // 删除 + packageLineMapper.deleteById(id); + } + + @Override + public MesWmPackageLineDO getPackageLine(Long id) { + return packageLineMapper.selectById(id); + } + + @Override + public PageResult getPackageLinePage(MesWmPackageLinePageReqVO pageReqVO) { + return packageLineMapper.selectPage(pageReqVO); + } + + @Override + public List getPackageLineListByPackageId(Long packageId) { + return packageLineMapper.selectListByPackageId(packageId); + } + + @Override + public void deletePackageLineByPackageId(Long packageId) { + packageLineMapper.deleteByPackageId(packageId); + } + + // ========== 校验方法 ========== + + private MesWmPackageLineDO validatePackageLineExists(Long id) { + MesWmPackageLineDO line = packageLineMapper.selectById(id); + if (line == null) { + throw exception(WM_PACKAGE_LINE_NOT_EXISTS); + } + return line; + } + + // TODO @AI:这个方法,应该 packageService 实现; + private void validatePackageStatusDraft(Long packageId) { + MesWmPackageDO packageDO = packageService.getPackage(packageId); + if (packageDO == null) { + throw exception(WM_PACKAGE_NOT_EXISTS); + } + if (ObjUtil.notEqual(MesOrderStatusConstants.PREPARE, packageDO.getStatus())) { + throw exception(WM_PACKAGE_STATUS_NOT_PREPARE); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java new file mode 100644 index 0000000..97b4a81 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.service.wm.wmpackage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 装箱单 Service 接口 + */ +public interface MesWmPackageService { + + /** + * 创建装箱单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPackage(@Valid MesWmPackageSaveReqVO createReqVO); + + /** + * 修改装箱单 + * + * @param updateReqVO 修改信息 + */ + void updatePackage(@Valid MesWmPackageSaveReqVO updateReqVO); + + /** + * 删除装箱单 + * + * @param id 编号 + */ + void deletePackage(Long id); + + /** + * 获得装箱单 + * + * @param id 编号 + * @return 装箱单 + */ + MesWmPackageDO getPackage(Long id); + + /** + * 获得装箱单分页 + * + * @param pageReqVO 分页查询 + * @return 分页结果 + */ + PageResult getPackagePage(MesWmPackagePageReqVO pageReqVO); + + /** + * 完成装箱单 + * + * @param id 编号 + */ + void finishPackage(Long id); + + /** + * 获得装箱单树形结构 + * + * @return 装箱单列表(树形) + */ + List getPackageTree(); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java new file mode 100644 index 0000000..31996cc --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java @@ -0,0 +1,149 @@ +package cn.iocoder.yudao.module.mes.service.wm.wmpackage; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage.MesWmPackageMapper; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +@Service +@Validated +public class MesWmPackageServiceImpl implements MesWmPackageService { + + @Resource + private MesWmPackageMapper packageMapper; + @Resource + private MesWmPackageLineService packageLineService; + + @Override + public Long createPackage(MesWmPackageSaveReqVO createReqVO) { + // 校验编码唯一性 + validateCodeUnique(null, createReqVO.getCode()); + // 校验父箱存在 + validateParentExists(createReqVO.getParentId()); + + // 创建装箱单,默认为草稿状态 + MesWmPackageDO packageDO = BeanUtils.toBean(createReqVO, MesWmPackageDO.class); + packageDO.setStatus(MesOrderStatusConstants.PREPARE); + if (packageDO.getParentId() == null) { + packageDO.setParentId(0L); + } + packageMapper.insert(packageDO); + return packageDO.getId(); + } + + @Override + public void updatePackage(MesWmPackageSaveReqVO updateReqVO) { + // 校验存在且为草稿 + validatePackageExistsAndDraft(updateReqVO.getId()); + // 校验编码唯一性 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // TODO @AI:是不是创建一个方法,校验 parent;因为 create 和 update 都需要; + // 校验父箱存在,且不能选自己或子节点 + validateParentExists(updateReqVO.getParentId()); + if (updateReqVO.getParentId() != null && ObjUtil.equal(updateReqVO.getParentId(), updateReqVO.getId())) { + throw exception(WM_PACKAGE_PARENT_SELF); + } + + // 更新装箱单 + MesWmPackageDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageDO.class); + packageMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deletePackage(Long id) { + // 校验存在且为草稿 + validatePackageExistsAndDraft(id); + + // 删除装箱明细 + packageLineService.deletePackageLineByPackageId(id); + // 删除装箱单 + packageMapper.deleteById(id); + + // 级联删除子箱 + List children = packageMapper.selectListByParentId(id); + if (CollUtil.isNotEmpty(children)) { + for (MesWmPackageDO child : children) { + deletePackage(child.getId()); + } + } + } + + @Override + public MesWmPackageDO getPackage(Long id) { + return packageMapper.selectById(id); + } + + @Override + public PageResult getPackagePage(MesWmPackagePageReqVO pageReqVO) { + return packageMapper.selectPage(pageReqVO); + } + + @Override + public void finishPackage(Long id) { + // 校验存在且为草稿 + validatePackageExistsAndDraft(id); + + // 更新状态为已完成 + packageMapper.updateById(new MesWmPackageDO() + .setId(id).setStatus(MesOrderStatusConstants.FINISHED)); + } + + @Override + public List getPackageTree() { + return packageMapper.selectList(); + } + + // ========== 校验方法 ========== + + private MesWmPackageDO validatePackageExists(Long id) { + MesWmPackageDO packageDO = packageMapper.selectById(id); + if (packageDO == null) { + throw exception(WM_PACKAGE_NOT_EXISTS); + } + return packageDO; + } + + private MesWmPackageDO validatePackageExistsAndDraft(Long id) { + MesWmPackageDO packageDO = validatePackageExists(id); + if (ObjUtil.notEqual(MesOrderStatusConstants.PREPARE, packageDO.getStatus())) { + throw exception(WM_PACKAGE_STATUS_NOT_PREPARE); + } + return packageDO; + } + + private void validateCodeUnique(Long id, String code) { + MesWmPackageDO packageDO = packageMapper.selectByCode(code); + if (packageDO == null) { + return; + } + if (ObjUtil.notEqual(id, packageDO.getId())) { + throw exception(WM_PACKAGE_CODE_DUPLICATE); + } + } + + private void validateParentExists(Long parentId) { + if (parentId == null || parentId == 0L) { + return; + } + MesWmPackageDO parent = packageMapper.selectById(parentId); + if (parent == null) { + throw exception(WM_PACKAGE_PARENT_NOT_EXISTS); + } + } + +} -- libgit2 0.21.4