From c9ef64512fcc7f6d044d2dfb67304a339d882530 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 11:58:14 +0800 Subject: [PATCH] feat(mes): 添加流转卡和工序记录相关的请求和响应 VO,重构服务接口及实现 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardPageReqVO.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessPageReqVO.java | 29 +++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessRespVO.java | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessSaveReqVO.java | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardProcessDO.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardMapper.java | 33 +++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardProcessMapper.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java | 31 +++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java | 22 ++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java | 11 +++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java | 20 ++++++++++++++++++++ 21 files changed, 1376 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardProcessDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardProcessMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java new file mode 100644 index 0000000..b383830 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java @@ -0,0 +1,139 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card; + +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.pro.card.vo.MesProCardPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; +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.card.MesProCardDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +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.card.MesProCardService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +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.Collections; +import java.util.List; +import java.util.Map; + +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/pro/card") +@Validated +public class MesProCardController { + + @Resource + private MesProCardService cardService; + + @Resource + private MesProWorkOrderService workOrderService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建生产流转卡") + @PreAuthorize("@ss.hasPermission('mes:pro-card:create')") + public CommonResult createCard(@Valid @RequestBody MesProCardSaveReqVO createReqVO) { + return success(cardService.createCard(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产流转卡") + @PreAuthorize("@ss.hasPermission('mes:pro-card:update')") + public CommonResult updateCard(@Valid @RequestBody MesProCardSaveReqVO updateReqVO) { + cardService.updateCard(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产流转卡") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-card:delete')") + public CommonResult deleteCard(@RequestParam("id") Long id) { + cardService.deleteCard(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产流转卡") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:pro-card:query')") + public CommonResult getCard(@RequestParam("id") Long id) { + MesProCardDO card = cardService.getCard(id); + if (card == null) { + return success(null); + } + return success(buildCardRespVOList(List.of(card)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产流转卡分页") + @PreAuthorize("@ss.hasPermission('mes:pro-card:query')") + public CommonResult> getCardPage(@Valid MesProCardPageReqVO pageReqVO) { + PageResult pageResult = cardService.getCardPage(pageReqVO); + return success(new PageResult<>(buildCardRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产流转卡 Excel") + @PreAuthorize("@ss.hasPermission('mes:pro-card:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportCardExcel(@Valid MesProCardPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = cardService.getCardPage(pageReqVO).getList(); + List voList = buildCardRespVOList(list); + ExcelUtils.write(response, "生产流转卡.xls", "数据", MesProCardRespVO.class, voList); + } + + // ==================== 拼接 VO ==================== + + private List buildCardRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 批量获取关联数据 + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesProCardDO::getWorkOrderId)); + Map itemMap = itemService.getItemMap( + convertSet(list, MesProCardDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(list, MesProCardDO::getUnitMeasureId)); + // 2. 拼接 VO + return BeanUtils.toBean(list, MesProCardRespVO.class, vo -> { + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> + vo.setWorkOrderCode(workOrder.getCode()).setWorkOrderName(workOrder.getName())); + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> + vo.setItemCode(item.getCode()).setItemName(item.getName())); + MapUtils.findAndThen(unitMeasureMap, vo.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java new file mode 100644 index 0000000..eaed207 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java @@ -0,0 +1,131 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card; + +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.CollectionUtils; +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.pro.card.vo.process.MesProCardProcessPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.card.MesProCardProcessService; +import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; +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.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +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/pro/card-process") +@Validated +public class MesProCardProcessController { + + @Resource + private MesProCardProcessService cardProcessService; + + @Resource + private MesProProcessService processService; + + @Resource + private MesMdWorkstationService workstationService; + + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/create") + @Operation(summary = "创建流转卡工序记录") + @PreAuthorize("@ss.hasPermission('mes:pro-card:create')") + public CommonResult createCardProcess(@Valid @RequestBody MesProCardProcessSaveReqVO createReqVO) { + return success(cardProcessService.createCardProcess(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新流转卡工序记录") + @PreAuthorize("@ss.hasPermission('mes:pro-card:update')") + public CommonResult updateCardProcess(@Valid @RequestBody MesProCardProcessSaveReqVO updateReqVO) { + cardProcessService.updateCardProcess(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除流转卡工序记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-card:delete')") + public CommonResult deleteCardProcess(@RequestParam("id") Long id) { + cardProcessService.deleteCardProcess(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得流转卡工序记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:pro-card:query')") + public CommonResult getCardProcess(@RequestParam("id") Long id) { + MesProCardProcessDO cardProcess = cardProcessService.getCardProcess(id); + if (cardProcess == null) { + return success(null); + } + return success(buildCardProcessRespVOList(List.of(cardProcess)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得流转卡工序记录分页") + @PreAuthorize("@ss.hasPermission('mes:pro-card:query')") + public CommonResult> getCardProcessPage(@Valid MesProCardProcessPageReqVO pageReqVO) { + PageResult pageResult = cardProcessService.getCardProcessPage(pageReqVO); + return success(new PageResult<>(buildCardProcessRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + // ==================== 拼接 VO ==================== + + private List buildCardProcessRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 批量获取关联数据 + Map processMap = CollectionUtils.convertMap( + processService.getProcessList(new ArrayList<>(convertSet(list, MesProCardProcessDO::getProcessId))), + MesProProcessDO::getId); + // 工位:逐个获取(MesMdWorkstationService 暂无批量方法,单页数据量小可接受) + // TODO @AI:还是批量,getWorkstationMap + Set workstationIds = convertSet(list, MesProCardProcessDO::getWorkstationId); + Map workstationMap = new HashMap<>(); + workstationIds.forEach(wsId -> { + if (wsId != null) { + MesMdWorkstationDO ws = workstationService.getWorkstation(wsId); + if (ws != null) { + workstationMap.put(wsId, ws); + } + } + }); + Map userMap = adminUserApi.getUserMap( + convertSet(list, MesProCardProcessDO::getUserId)); + // 2. 拼接 VO + return BeanUtils.toBean(list, MesProCardProcessRespVO.class, vo -> { + MapUtils.findAndThen(processMap, vo.getProcessId(), process -> + vo.setProcessCode(process.getCode()).setProcessName(process.getName())); + MapUtils.findAndThen(workstationMap, vo.getWorkstationId(), ws -> + vo.setWorkstationCode(ws.getCode()).setWorkstationName(ws.getName())); + MapUtils.findAndThen(userMap, vo.getUserId(), + user -> vo.setNickname(user.getNickname())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardPageReqVO.java new file mode 100644 index 0000000..ed85312 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardPageReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.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.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 生产流转卡分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesProCardPageReqVO extends PageParam { + + @Schema(description = "流转卡编码", example = "CARD-001") + private String code; + + @Schema(description = "生产工单编号", example = "100") + private Long workOrderId; + + @Schema(description = "产品物料编号", example = "200") + private Long itemId; + + @Schema(description = "批次号", example = "BATCH-001") + private String batchCode; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java new file mode 100644 index 0000000..facd466 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 生产流转卡 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesProCardRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "流转卡编码", example = "CARD-001") + @ExcelProperty("流转卡编码") + private String code; + + @Schema(description = "生产工单编号", example = "100") + private Long workOrderId; + + @Schema(description = "工单编码", example = "WO-001") + @ExcelProperty("工单编码") + private String workOrderCode; + + @Schema(description = "工单名称", example = "生产工单-A") + @ExcelProperty("工单名称") + private String workOrderName; + + @Schema(description = "批次号", example = "BATCH-001") + @ExcelProperty("批次号") + private String batchCode; + + @Schema(description = "产品物料编号", example = "200") + private Long itemId; + + @Schema(description = "产品编码", example = "P-001") + @ExcelProperty("产品编码") + private String itemCode; + + @Schema(description = "产品名称", example = "电路板 A") + @ExcelProperty("产品名称") + private String itemName; + + @Schema(description = "规格型号", example = "100x200mm") + @ExcelProperty("规格型号") + private String specification; + + @Schema(description = "单位编号", example = "300") + private Long unitMeasureId; + + @Schema(description = "单位名称", example = "个") + @ExcelProperty("单位") + private String unitMeasureName; + + @Schema(description = "条码地址", example = "https://xxx") + private String barcodeUrl; + + @Schema(description = "流转数量", example = "100.00") + @ExcelProperty("流转数量") + private BigDecimal transferedQuantity; + + @Schema(description = "状态", example = "0") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_PRO_WORK_ORDER_STATUS) + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java new file mode 100644 index 0000000..19a196f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.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; + +@Schema(description = "管理后台 - MES 生产流转卡新增/修改 Request VO") +@Data +public class MesProCardSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "流转卡编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "CARD-001") + @NotEmpty(message = "流转卡编码不能为空") + private String code; + + @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "生产工单不能为空") + private Long workOrderId; + + @Schema(description = "批次号", example = "BATCH-001") + private String batchCode; + + @Schema(description = "产品物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "产品物料不能为空") + private Long itemId; + + @Schema(description = "规格型号", example = "100x200mm") + private String specification; + + @Schema(description = "单位编号", example = "300") + private Long unitMeasureId; + + @Schema(description = "流转数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "流转数量不能为空") + private BigDecimal transferedQuantity; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessPageReqVO.java new file mode 100644 index 0000000..ee1e7dd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessPageReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process; + +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 MesProCardProcessPageReqVO extends PageParam { + + @Schema(description = "流转卡编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "流转卡编号不能为空") + private Long cardId; + + @Schema(description = "工序编号", example = "200") + private Long processId; + + @Schema(description = "工位编号", example = "300") + private Long workstationId; + + @Schema(description = "操作人编号", example = "400") + private Long userId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessRespVO.java new file mode 100644 index 0000000..38d105f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessRespVO.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 流转卡工序记录 Response VO") +@Data +public class MesProCardProcessRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "流转卡编号", example = "100") + private Long cardId; + + @Schema(description = "序号", example = "1") + private Integer sort; + + @Schema(description = "工序编号", example = "200") + private Long processId; + + @Schema(description = "工序编码", example = "PROC-001") + private String processCode; + + @Schema(description = "工序名称", example = "焊接") + private String processName; + + @Schema(description = "进入工序时间") + private LocalDateTime inputTime; + + @Schema(description = "出工序时间") + private LocalDateTime outputTime; + + @Schema(description = "投入数量", example = "100.00") + private BigDecimal inputQuantity; + + @Schema(description = "产出数量", example = "98.00") + private BigDecimal outputQuantity; + + @Schema(description = "不合格品数量", example = "2.00") + private BigDecimal unqualifiedQuantity; + + @Schema(description = "工位编号", example = "300") + private Long workstationId; + + @Schema(description = "工位编码", example = "WS-001") + private String workstationCode; + + @Schema(description = "工位名称", example = "焊接工位 1") + private String workstationName; + + @Schema(description = "操作人编号", example = "400") + private Long userId; + + @Schema(description = "操作人名称", example = "张三") + private String nickname; + + @Schema(description = "过程检验单编号", example = "500") + private Long ipqcId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @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/pro/card/vo/process/MesProCardProcessSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessSaveReqVO.java new file mode 100644 index 0000000..b10afa4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/process/MesProCardProcessSaveReqVO.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 流转卡工序记录新增/修改 Request VO") +@Data +public class MesProCardProcessSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "流转卡编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "流转卡不能为空") + private Long cardId; + + @Schema(description = "序号", example = "1") + private Integer sort; + + @Schema(description = "工序编号", example = "200") + private Long processId; + + @Schema(description = "进入工序时间") + private LocalDateTime inputTime; + + @Schema(description = "出工序时间") + private LocalDateTime outputTime; + + @Schema(description = "投入数量", example = "100.00") + private BigDecimal inputQuantity; + + @Schema(description = "产出数量", example = "98.00") + private BigDecimal outputQuantity; + + @Schema(description = "不合格品数量", example = "2.00") + private BigDecimal unqualifiedQuantity; + + @Schema(description = "工位编号", example = "300") + private Long workstationId; + + @Schema(description = "操作人编号", example = "400") + private Long userId; + + @Schema(description = "过程检验单编号", example = "500") + private Long ipqcId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java new file mode 100644 index 0000000..81e6334 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java @@ -0,0 +1,101 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.pro.card; + +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.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 生产流转卡 DO + * + * @author 芋道源码 + */ +@TableName("mes_pro_card") +@KeySequence("mes_pro_card_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesProCardDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 流转卡编码 + */ + private String code; + /** + * 生产工单编号 + * + * 关联 {@link MesProWorkOrderDO#getId()} + */ + private Long workOrderId; + /** + * 批次号 + */ + private String batchCode; + /** + * 产品物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 规格型号 + */ + private String specification; + /** + * 单位编号 + * + * 关联 {@link MesMdUnitMeasureDO#getId()} + */ + private Long unitMeasureId; + /** + * 条码地址 + * + * TODO @芋艿:条码生成功能,需等条码模块(wm_barcode)迁移后再对接 + */ + private String barcodeUrl; + /** + * 流转数量 + */ + private BigDecimal transferedQuantity; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardProcessDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardProcessDO.java new file mode 100644 index 0000000..3eeb647 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardProcessDO.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.pro.card; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * MES 流转卡工序记录 DO + * + * @author 芋道源码 + */ +@TableName("mes_pro_card_process") +@KeySequence("mes_pro_card_process_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesProCardProcessDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 流转卡编号 + * + * 关联 {@link MesProCardDO#getId()} + */ + private Long cardId; + /** + * 序号 + */ + private Integer sort; + /** + * 工序编号 + * + * 关联 {@link MesProProcessDO#getId()} + */ + private Long processId; + /** + * 进入工序时间 + */ + private LocalDateTime inputTime; + /** + * 出工序时间 + */ + private LocalDateTime outputTime; + /** + * 投入数量 + */ + private BigDecimal inputQuantity; + /** + * 产出数量 + */ + private BigDecimal outputQuantity; + /** + * 不合格品数量 + */ + private BigDecimal unqualifiedQuantity; + /** + * 工位编号 + * + * 关联 {@link MesMdWorkstationDO#getId()} + */ + private Long workstationId; + /** + * 操作人编号 + * + * 关联 AdminUserDO#getId() + */ + private Long userId; + /** + * 过程检验单编号 + * + * TODO @芋艿:关联 mes_qc_ipqc 表,等 IPQC 模块迁移后再对接 + */ + private Long ipqcId; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardMapper.java new file mode 100644 index 0000000..9811358 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardMapper.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.pro.card; + +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.pro.card.vo.MesProCardPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 生产流转卡 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesProCardMapper extends BaseMapperX { + + default PageResult selectPage(MesProCardPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesProCardDO::getCode, reqVO.getCode()) + .eqIfPresent(MesProCardDO::getWorkOrderId, reqVO.getWorkOrderId()) + .eqIfPresent(MesProCardDO::getItemId, reqVO.getItemId()) + .likeIfPresent(MesProCardDO::getBatchCode, reqVO.getBatchCode()) + .eqIfPresent(MesProCardDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesProCardDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesProCardDO::getId)); + } + + default MesProCardDO selectByCode(String code) { + return selectOne(MesProCardDO::getCode, code); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardProcessMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardProcessMapper.java new file mode 100644 index 0000000..1456d91 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/card/MesProCardProcessMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.pro.card; + +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.pro.card.vo.process.MesProCardProcessPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardProcessDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 流转卡工序记录 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesProCardProcessMapper extends BaseMapperX { + + default PageResult selectPage(MesProCardProcessPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesProCardProcessDO::getCardId, reqVO.getCardId()) + .eqIfPresent(MesProCardProcessDO::getProcessId, reqVO.getProcessId()) + .eqIfPresent(MesProCardProcessDO::getWorkstationId, reqVO.getWorkstationId()) + .eqIfPresent(MesProCardProcessDO::getUserId, reqVO.getUserId()) + .orderByAsc(MesProCardProcessDO::getSort)); + } + + default List selectListByCardId(Long cardId) { + return selectList(MesProCardProcessDO::getCardId, cardId); + } + + default void deleteByCardId(Long cardId) { + delete(MesProCardProcessDO::getCardId, cardId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java new file mode 100644 index 0000000..6308ae9 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/feedback/MesProFeedbackMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback; + +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.pro.feedback.vo.MesProFeedbackPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 生产报工 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesProFeedbackMapper extends BaseMapperX { + + default PageResult selectPage(MesProFeedbackPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesProFeedbackDO::getCode, reqVO.getCode()) + .eqIfPresent(MesProFeedbackDO::getType, reqVO.getType()) + .eqIfPresent(MesProFeedbackDO::getWorkOrderId, reqVO.getWorkOrderId()) + .eqIfPresent(MesProFeedbackDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesProFeedbackDO::getFeedbackTime, reqVO.getFeedbackTime()) + .eqIfPresent(MesProFeedbackDO::getItemId, reqVO.getItemId()) + .eqIfPresent(MesProFeedbackDO::getFeedbackUserId, reqVO.getFeedbackUserId()) + .eqIfPresent(MesProFeedbackDO::getCreator, reqVO.getCreator()) + .orderByDesc(MesProFeedbackDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java index 50b0a87..7c85d62 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java @@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.MesMdWorks import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * MES 工作站 Service 接口 @@ -92,4 +96,22 @@ public interface MesMdWorkstationService { */ Long getWorkstationCountByAreaId(Long areaId); + /** + * 获得工作站列表 + * + * @param ids 编号数组 + * @return 工作站列表 + */ + List getWorkstationList(Collection ids); + + /** + * 获得工作站 Map + * + * @param ids 编号数组 + * @return 工作站 Map + */ + default Map getWorkstationMap(Collection ids) { + return convertMap(getWorkstationList(ids), MesMdWorkstationDO::getId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java index c37d4c6..119c369 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.md.workstation; +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; @@ -21,6 +22,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.util.Collection; +import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -228,4 +231,12 @@ public class MesMdWorkstationServiceImpl implements MesMdWorkstationService { return workstationMapper.selectCountByAreaId(areaId); } + @Override + public List getWorkstationList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return workstationMapper.selectByIds(ids); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessService.java new file mode 100644 index 0000000..94ce489 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.service.pro.card; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardProcessDO; +import jakarta.validation.Valid; + +/** + * MES 流转卡工序记录 Service 接口 + * + * @author 芋道源码 + */ +public interface MesProCardProcessService { + + /** + * 创建流转卡工序记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCardProcess(@Valid MesProCardProcessSaveReqVO createReqVO); + + /** + * 更新流转卡工序记录 + * + * @param updateReqVO 更新信息 + */ + void updateCardProcess(@Valid MesProCardProcessSaveReqVO updateReqVO); + + /** + * 删除流转卡工序记录 + * + * @param id 编号 + */ + void deleteCardProcess(Long id); + + /** + * 获得流转卡工序记录 + * + * @param id 编号 + * @return 流转卡工序记录 + */ + MesProCardProcessDO getCardProcess(Long id); + + /** + * 获得流转卡工序记录分页 + * + * @param pageReqVO 分页查询 + * @return 流转卡工序记录分页 + */ + PageResult getCardProcessPage(MesProCardProcessPageReqVO pageReqVO); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java new file mode 100644 index 0000000..a122968 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.service.pro.card; + +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.pro.card.vo.process.MesProCardProcessPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardProcessDO; +import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardProcessMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_CARD_PROCESS_NOT_EXISTS; + +/** + * MES 流转卡工序记录 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesProCardProcessServiceImpl implements MesProCardProcessService { + + @Resource + private MesProCardProcessMapper cardProcessMapper; + + @Override + public Long createCardProcess(MesProCardProcessSaveReqVO createReqVO) { + // TODO @AI:card 存在,通过 cardService 的 validateCardExists() 方法校验 + MesProCardProcessDO cardProcess = BeanUtils.toBean(createReqVO, MesProCardProcessDO.class); + cardProcessMapper.insert(cardProcess); + return cardProcess.getId(); + } + + @Override + public void updateCardProcess(MesProCardProcessSaveReqVO updateReqVO) { + // 1. 校验存在 + validateCardProcessExists(updateReqVO.getId()); + // TODO @AI:card 存在,通过 cardService 的 validateCardExists() 方法校验 + + // 2. 更新 + MesProCardProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProCardProcessDO.class); + cardProcessMapper.updateById(updateObj); + } + + @Override + public void deleteCardProcess(Long id) { + // 1. 校验存在 + validateCardProcessExists(id); + + // 2. 删除 + cardProcessMapper.deleteById(id); + } + + @Override + public MesProCardProcessDO getCardProcess(Long id) { + return cardProcessMapper.selectById(id); + } + + @Override + public PageResult getCardProcessPage(MesProCardProcessPageReqVO pageReqVO) { + return cardProcessMapper.selectPage(pageReqVO); + } + + // ==================== 校验方法 ==================== + + private void validateCardProcessExists(Long id) { + if (cardProcessMapper.selectById(id) == null) { + throw exception(PRO_CARD_PROCESS_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java new file mode 100644 index 0000000..aa2c6c1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.service.pro.card; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; +import jakarta.validation.Valid; + +/** + * MES 生产流转卡 Service 接口 + * + * @author 芋道源码 + */ +public interface MesProCardService { + + /** + * 创建生产流转卡 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCard(@Valid MesProCardSaveReqVO createReqVO); + + /** + * 更新生产流转卡 + * + * @param updateReqVO 更新信息 + */ + void updateCard(@Valid MesProCardSaveReqVO updateReqVO); + + /** + * 删除生产流转卡 + * + * @param id 编号 + */ + void deleteCard(Long id); + + /** + * 获得生产流转卡 + * + * @param id 编号 + * @return 生产流转卡 + */ + MesProCardDO getCard(Long id); + + /** + * 获得生产流转卡分页 + * + * @param pageReqVO 分页查询 + * @return 生产流转卡分页 + */ + PageResult getCardPage(MesProCardPageReqVO pageReqVO); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java new file mode 100644 index 0000000..ea6b03d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.mes.service.pro.card; + +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.pro.card.vo.MesProCardPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; +import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardProcessMapper; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 生产流转卡 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesProCardServiceImpl implements MesProCardService { + + @Resource + private MesProCardMapper cardMapper; + + @Resource + private MesProCardProcessMapper cardProcessMapper; + + @Resource + private MesProWorkOrderService workOrderService; + + @Override + public Long createCard(MesProCardSaveReqVO createReqVO) { + // 1.1 校验编码唯一 + validateCardCodeUnique(null, createReqVO.getCode()); + // 1.2 校验工单存在 + workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); + + // 2. 插入 + MesProCardDO card = BeanUtils.toBean(createReqVO, MesProCardDO.class); + cardMapper.insert(card); + // TODO @芋艿:条码生成(barcode_url),需等条码模块(wm_barcode)迁移后再对接 + return card.getId(); + } + + @Override + public void updateCard(MesProCardSaveReqVO updateReqVO) { + // 1.1 校验存在 + validateCardExists(updateReqVO.getId()); + // 1.2 校验编码唯一 + validateCardCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 2. 更新 + MesProCardDO updateObj = BeanUtils.toBean(updateReqVO, MesProCardDO.class); + cardMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCard(Long id) { + // 1. 校验存在 + validateCardExists(id); + + // 2. 删除流转卡 + 级联删除工序记录 + cardMapper.deleteById(id); + cardProcessMapper.deleteByCardId(id); + } + + @Override + public MesProCardDO getCard(Long id) { + return cardMapper.selectById(id); + } + + @Override + public PageResult getCardPage(MesProCardPageReqVO pageReqVO) { + return cardMapper.selectPage(pageReqVO); + } + + // ==================== 校验方法 ==================== + + private void validateCardExists(Long id) { + if (cardMapper.selectById(id) == null) { + throw exception(PRO_CARD_NOT_EXISTS); + } + } + + private void validateCardCodeUnique(Long id, String code) { + if (code == null) { + return; + } + MesProCardDO card = cardMapper.selectByCode(code); + if (card == null) { + return; + } + if (ObjUtil.notEqual(card.getId(), id)) { + throw exception(PRO_CARD_CODE_DUPLICATE); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java new file mode 100644 index 0000000..1131176 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.mes.service.pro.feedback; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; +import jakarta.validation.Valid; + +/** + * MES 生产报工 Service 接口 + * + * @author 芋道源码 + */ +public interface MesProFeedbackService { + + /** + * 创建生产报工(草稿) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFeedback(@Valid MesProFeedbackSaveReqVO createReqVO); + + /** + * 修改生产报工 + * + * @param updateReqVO 更新信息 + */ + void updateFeedback(@Valid MesProFeedbackSaveReqVO updateReqVO); + + /** + * 删除生产报工(仅草稿) + * + * @param id 编号 + */ + void deleteFeedback(Long id); + + /** + * 获得生产报工 + * + * @param id 编号 + * @return 生产报工 + */ + MesProFeedbackDO getFeedback(Long id); + + /** + * 获得生产报工分页 + * + * @param pageReqVO 分页查询 + * @return 生产报工分页 + */ + PageResult getFeedbackPage(MesProFeedbackPageReqVO pageReqVO); + + /** + * 提交报工(草稿 → 审批中) + * + * @param id 编号 + */ + void submitFeedback(Long id); + + /** + * 驳回报工(审批中 → 草稿) + * + * @param id 编号 + */ + void rejectFeedback(Long id); + + /** + * 执行报工(审批中 → 已完成 或 待检验) + * + * @param id 编号 + */ + void executeFeedback(Long id); + + /** + * 取消报工 + * + * @param id 编号 + */ + void cancelFeedback(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java index b2878e7..22ace74 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java @@ -7,6 +7,9 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; import jakarta.validation.Valid; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * MES 生产工序 Service 接口 @@ -69,4 +72,21 @@ public interface MesProProcessService { */ List getProcessListByStatus(Integer status); + /** + * 校验工序存在 + * + * @param id 编号 + */ + void validateProcessExists(Long id); + + /** + * 获得工序 Map + * + * @param ids 编号列表 + * @return 工序 Map + */ + default Map getProcessMap(List ids) { + return convertMap(getProcessList(ids), MesProProcessDO::getId); + } + } -- libgit2 0.21.4