From c093da8cad9a4fe47518e63a7a7880a10753ceb3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 12:35:58 +0800 Subject: [PATCH] feat(mes): 添加生产任务相关的请求和响应 VO,重构生产任务控制器及服务接口 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 779 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java new file mode 100644 index 0000000..4b800e9 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java @@ -0,0 +1,187 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.task; + +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.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +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.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +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.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; +import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; +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.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; + +@Tag(name = "管理后台 - MES 生产任务") +@RestController +@RequestMapping("/mes/pro/task") +@Validated +public class MesProTaskController { + + @Resource + private MesProTaskService taskService; + + @Resource + private MesProWorkOrderService workOrderService; + + @Resource + private MesMdWorkstationService workstationService; + + @Resource + private MesProProcessService processService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesMdClientService clientService; + + @PostMapping("/create") + @Operation(summary = "创建生产任务") + @PreAuthorize("@ss.hasPermission('mes:pro-task:create')") + public CommonResult createTask(@Valid @RequestBody MesProTaskSaveReqVO createReqVO) { + return success(taskService.createTask(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产任务") + @PreAuthorize("@ss.hasPermission('mes:pro-task:update')") + public CommonResult updateTask(@Valid @RequestBody MesProTaskSaveReqVO updateReqVO) { + taskService.updateTask(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产任务") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-task:delete')") + public CommonResult deleteTask(@RequestParam("id") Long id) { + taskService.deleteTask(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:pro-task:query')") + public CommonResult getTask(@RequestParam("id") Long id) { + MesProTaskDO task = taskService.getTask(id); + if (task == null) { + return success(null); + } + return success(buildTaskRespVOList(List.of(task)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产任务分页") + @PreAuthorize("@ss.hasPermission('mes:pro-task:query')") + public CommonResult> getTaskPage(@Valid MesProTaskPageReqVO pageReqVO) { + PageResult pageResult = taskService.getTaskPage(pageReqVO); + return success(new PageResult<>(buildTaskRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得生产任务精简列表", description = "主要用于前端的下拉选项") + public CommonResult> getTaskSimpleList( + @RequestParam(value = "workOrderId", required = false) Long workOrderId) { + List list = taskService.getTaskSimpleList(workOrderId); + return success(convertList(list, task -> new MesProTaskRespVO() + .setId(task.getId()).setCode(task.getCode()).setName(task.getName()) + .setWorkOrderId(task.getWorkOrderId()).setProcessId(task.getProcessId()) + .setStatus(task.getStatus()))); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产任务 Excel") + @PreAuthorize("@ss.hasPermission('mes:pro-task:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTaskExcel(@Valid MesProTaskPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = taskService.getTaskPage(pageReqVO).getList(); + List voList = buildTaskRespVOList(list); + ExcelUtils.write(response, "生产任务.xls", "数据", MesProTaskRespVO.class, voList); + } + + // ==================== 拼接 VO ==================== + + private List buildTaskRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 批量查询关联数据 + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesProTaskDO::getWorkOrderId)); + Map workstationMap = workstationService.getWorkstationMap( + convertSet(list, MesProTaskDO::getWorkstationId)); + Map processMap = processService.getProcessMap( + new java.util.ArrayList<>(convertSet(list, MesProTaskDO::getProcessId))); + Map itemMap = itemService.getItemMap( + convertSet(list, MesProTaskDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(list, MesProTaskDO::getUnitMeasureId)); + Map clientMap = clientService.getClientMap( + convertSet(list, MesProTaskDO::getClientId)); + + // 拼接 VO + return convertList(list, task -> { + MesProTaskRespVO vo = BeanUtils.toBean(task, MesProTaskRespVO.class); + findAndThen(workOrderMap, task.getWorkOrderId(), wo -> { + vo.setWorkOrderCode(wo.getCode()); + vo.setWorkOrderName(wo.getName()); + vo.setRequestDate(wo.getRequestDate()); + }); + findAndThen(workstationMap, task.getWorkstationId(), ws -> + vo.setWorkstationName(ws.getName())); + findAndThen(processMap, task.getProcessId(), p -> + vo.setProcessName(p.getName())); + findAndThen(itemMap, task.getItemId(), item -> { + vo.setItemCode(item.getCode()); + vo.setItemName(item.getName()); + vo.setItemSpec(item.getSpecification()); + }); + findAndThen(unitMeasureMap, task.getUnitMeasureId(), um -> + vo.setUnitMeasureName(um.getName())); + findAndThen(clientMap, task.getClientId(), c -> + vo.setClientName(c.getName())); + return vo; + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java new file mode 100644 index 0000000..8af0648 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import 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 MesProTaskPageReqVO extends PageParam { + + @Schema(description = "任务编码", example = "PT202503150001") + private String code; + + @Schema(description = "任务名称", example = "注塑任务") + private String name; + + @Schema(description = "生产工单编号", example = "1") + private Long workOrderId; + + @Schema(description = "工序编号", example = "1") + private Long processId; + + @Schema(description = "工作站编号", example = "1") + private Long workstationId; + + @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/task/vo/MesProTaskRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java new file mode 100644 index 0000000..da49826 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java @@ -0,0 +1,115 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo; + +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 MesProTaskRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "任务编码", example = "PT202503150001") + private String code; + + @Schema(description = "任务名称", example = "注塑任务") + private String name; + + @Schema(description = "生产工单编号", example = "1") + private Long workOrderId; + + @Schema(description = "工单编码", example = "WO-001") + private String workOrderCode; + + @Schema(description = "工单名称", example = "生产工单-A") + private String workOrderName; + + @Schema(description = "工作站编号", example = "1") + private Long workstationId; + + @Schema(description = "工作站名称", example = "注塑工作站") + private String workstationName; + + @Schema(description = "工艺路线编号", example = "1") + private Long routeId; + + @Schema(description = "工序编号", example = "1") + private Long processId; + + @Schema(description = "工序名称", example = "注塑") + private String processName; + + @Schema(description = "产品物料编号", example = "100") + private Long itemId; + + @Schema(description = "产品编码", example = "P-001") + private String itemCode; + + @Schema(description = "产品名称", example = "电路板") + private String itemName; + + @Schema(description = "规格型号", example = "100x200mm") + private String itemSpec; + + @Schema(description = "单位编号", example = "200") + private Long unitMeasureId; + + @Schema(description = "单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "排产数量", example = "100.00") + private BigDecimal quantity; + + @Schema(description = "已生产数量", example = "50.00") + private BigDecimal producedQuantity; + + @Schema(description = "合格品数量", example = "48.00") + private BigDecimal qualifyQuantity; + + @Schema(description = "不良品数量", example = "2.00") + private BigDecimal unqualifyQuantity; + + @Schema(description = "调整数量", example = "0") + private BigDecimal changedQuantity; + + @Schema(description = "客户编号", example = "300") + private Long clientId; + + @Schema(description = "客户名称", example = "客户A") + private String clientName; + + @Schema(description = "开始生产时间") + private LocalDateTime startTime; + + @Schema(description = "生产时长(工作日)", example = "3") + private Integer duration; + + @Schema(description = "结束生产时间") + private LocalDateTime endTime; + + @Schema(description = "甘特图显示颜色", example = "#00AEF3") + private String colorCode; + + @Schema(description = "需求日期") + private LocalDateTime requestDate; + + @Schema(description = "完成日期") + private LocalDateTime finishDate; + + @Schema(description = "取消日期") + private LocalDateTime cancelDate; + + @Schema(description = "任务状态", example = "0") + private Integer status; + + @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/pro/task/vo/MesProTaskSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java new file mode 100644 index 0000000..6931dbc --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.task.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.LocalDateTime; + +@Schema(description = "管理后台 - MES 生产任务新增/修改 Request VO") +@Data +public class MesProTaskSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "任务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PT202503150001") + @NotEmpty(message = "任务编码不能为空") + private String code; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "注塑任务") + @NotEmpty(message = "任务名称不能为空") + private String name; + + @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "生产工单不能为空") + private Long workOrderId; + + @Schema(description = "工作站编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "工作站不能为空") + private Long workstationId; + + @Schema(description = "工艺路线编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "工艺路线不能为空") + private Long routeId; + + @Schema(description = "工序编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "工序不能为空") + private Long processId; + + @Schema(description = "产品物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "产品不能为空") + private Long itemId; + + @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "单位不能为空") + private Long unitMeasureId; + + @Schema(description = "排产数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "排产数量不能为空") + private BigDecimal quantity; + + @Schema(description = "已生产数量", example = "0") + private BigDecimal producedQuantity; + + @Schema(description = "合格品数量", example = "0") + private BigDecimal qualifyQuantity; + + @Schema(description = "不良品数量", example = "0") + private BigDecimal unqualifyQuantity; + + @Schema(description = "调整数量", example = "0") + private BigDecimal changedQuantity; + + @Schema(description = "客户编号", example = "300") + private Long clientId; + + @Schema(description = "开始生产时间") + private LocalDateTime startTime; + + @Schema(description = "生产时长(工作日)", example = "3") + private Integer duration; + + @Schema(description = "结束生产时间") + private LocalDateTime endTime; + + @Schema(description = "甘特图显示颜色", example = "#00AEF3") + private String colorCode; + + @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/task/MesProTaskDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java new file mode 100644 index 0000000..5458811 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java @@ -0,0 +1,155 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.pro.task; + +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.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO; +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; +import java.time.LocalDateTime; + +/** + * MES 生产任务 DO + * + * @author 芋道源码 + */ +@TableName("mes_pro_task") +@KeySequence("mes_pro_task_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesProTaskDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 任务编码 + */ + private String code; + /** + * 任务名称 + */ + private String name; + /** + * 生产工单编号 + * + * 关联 {@link MesProWorkOrderDO#getId()} + */ + private Long workOrderId; + /** + * 工作站编号 + * + * 关联 {@link MesMdWorkstationDO#getId()} + */ + private Long workstationId; + /** + * 工艺路线编号 + * + * 关联 {@link MesProRouteDO#getId()} + */ + private Long routeId; + /** + * 工序编号 + * + * 关联 {@link MesProProcessDO#getId()} + */ + private Long processId; + /** + * 产品物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 单位编号 + * + * 关联 {@link MesMdUnitMeasureDO#getId()} + */ + private Long unitMeasureId; + /** + * 排产数量 + */ + private BigDecimal quantity; + /** + * 已生产数量 + */ + private BigDecimal producedQuantity; + /** + * 合格品数量 + */ + private BigDecimal qualifyQuantity; + /** + * 不良品数量 + */ + private BigDecimal unqualifyQuantity; + /** + * 调整数量 + */ + private BigDecimal changedQuantity; + /** + * 客户编号 + */ + private Long clientId; + /** + * 开始生产时间 + */ + private LocalDateTime startTime; + /** + * 生产时长(工作日,1=8小时) + */ + private Integer duration; + /** + * 结束生产时间 + */ + private LocalDateTime endTime; + /** + * 甘特图显示颜色 + */ + private String colorCode; + /** + * 完成日期 + */ + private LocalDateTime finishDate; + /** + * 取消日期 + */ + private LocalDateTime cancelDate; + /** + * 任务状态 + */ + 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/mysql/pro/task/MesProTaskMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java new file mode 100644 index 0000000..37f7d36 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.pro.task; + +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.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 生产任务 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesProTaskMapper extends BaseMapperX { + + default PageResult selectPage(MesProTaskPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesProTaskDO::getCode, reqVO.getCode()) + .likeIfPresent(MesProTaskDO::getName, reqVO.getName()) + .eqIfPresent(MesProTaskDO::getWorkOrderId, reqVO.getWorkOrderId()) + .eqIfPresent(MesProTaskDO::getProcessId, reqVO.getProcessId()) + .eqIfPresent(MesProTaskDO::getWorkstationId, reqVO.getWorkstationId()) + .eqIfPresent(MesProTaskDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesProTaskDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesProTaskDO::getId)); + } + + default List selectListByWorkOrderId(Long workOrderId) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesProTaskDO::getWorkOrderId, workOrderId) + .orderByDesc(MesProTaskDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java new file mode 100644 index 0000000..1798ff8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.mes.service.pro.task; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 生产任务 Service 接口 + * + * @author 芋道源码 + */ +public interface MesProTaskService { + + /** + * 创建生产任务 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTask(@Valid MesProTaskSaveReqVO createReqVO); + + /** + * 更新生产任务 + * + * @param updateReqVO 更新信息 + */ + void updateTask(@Valid MesProTaskSaveReqVO updateReqVO); + + /** + * 删除生产任务 + * + * @param id 编号 + */ + void deleteTask(Long id); + + /** + * 获得生产任务 + * + * @param id 编号 + * @return 生产任务 + */ + MesProTaskDO getTask(Long id); + + /** + * 获得生产任务分页 + * + * @param pageReqVO 分页查询 + * @return 生产任务分页 + */ + PageResult getTaskPage(MesProTaskPageReqVO pageReqVO); + + /** + * 获得生产任务精简列表 + * + * @param workOrderId 工单编号(可选) + * @return 生产任务列表 + */ + List getTaskSimpleList(Long workOrderId); + + /** + * 校验任务是否存在 + * + * @param id 编号 + */ + void validateTaskExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java new file mode 100644 index 0000000..4d43ed8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.service.pro.task; + +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.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper; +import jakarta.annotation.Resource; +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.PRO_TASK_NOT_EXISTS; + +/** + * MES 生产任务 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesProTaskServiceImpl implements MesProTaskService { + + @Resource + private MesProTaskMapper taskMapper; + + @Override + public Long createTask(MesProTaskSaveReqVO createReqVO) { + MesProTaskDO task = BeanUtils.toBean(createReqVO, MesProTaskDO.class); + taskMapper.insert(task); + return task.getId(); + } + + @Override + public void updateTask(MesProTaskSaveReqVO updateReqVO) { + validateTaskExists(updateReqVO.getId()); + MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class); + taskMapper.updateById(updateObj); + } + + @Override + public void deleteTask(Long id) { + validateTaskExists(id); + taskMapper.deleteById(id); + } + + @Override + public MesProTaskDO getTask(Long id) { + return taskMapper.selectById(id); + } + + @Override + public PageResult getTaskPage(MesProTaskPageReqVO pageReqVO) { + return taskMapper.selectPage(pageReqVO); + } + + @Override + public List getTaskSimpleList(Long workOrderId) { + if (workOrderId != null) { + return taskMapper.selectListByWorkOrderId(workOrderId); + } + return taskMapper.selectList(); + } + + @Override + public void validateTaskExists(Long id) { + if (taskMapper.selectById(id) == null) { + throw exception(PRO_TASK_NOT_EXISTS); + } + } + +} -- libgit2 0.21.4