From 1494636e95ac5648aa94ca76d9bbeb97bf9270e9 Mon Sep 17 00:00:00 2001 From: chenyuan <1154693969@qq.com> Date: Tue, 21 May 2024 19:08:11 +0800 Subject: [PATCH] add task plan --- .../module/mes/enums/ErrorCodeConstants.java | 5 + .../ItemRequisitionController.java | 106 ++++++++++ .../vo/ItemRequisitionPageReqVO.java | 51 +++++ .../vo/ItemRequisitionRespVO.java | 58 ++++++ .../vo/ItemRequisitionSaveReqVO.java | 50 +++++ .../controller/admin/plan/PlanController.java | 94 +++++++++ .../admin/plan/vo/PlanPageReqVO.java | 68 +++++++ .../controller/admin/plan/vo/PlanRespVO.java | 84 ++++++++ .../admin/plan/vo/PlanSaveReqVO.java | 67 +++++++ .../controller/admin/task/TaskController.java | 148 ++++++++++++++ .../admin/task/vo/TaskPageReqVO.java | 45 +++++ .../controller/admin/task/vo/TaskRespVO.java | 58 ++++++ .../admin/task/vo/TaskSaveReqVO.java | 54 +++++ .../itemrequisition/ItemRequisitionDO.java | 65 +++++++ .../ItemRequisitionDetailDO.java | 56 ++++++ .../mes/dal/dataobject/plan/PlanDO.java | 95 +++++++++ .../mes/dal/dataobject/task/TaskDO.java | 65 +++++++ .../mes/dal/dataobject/task/TaskDetailDO.java | 67 +++++++ .../ItemRequisitionDetailMapper.java | 28 +++ .../ItemRequisitionMapper.java | 34 ++++ .../module/mes/dal/mysql/plan/PlanMapper.java | 40 ++++ .../mes/dal/mysql/task/TaskDetailMapper.java | 33 ++++ .../module/mes/dal/mysql/task/TaskMapper.java | 32 +++ .../ItemRequisitionService.java | 67 +++++++ .../ItemRequisitionServiceImpl.java | 113 +++++++++++ .../module/mes/service/plan/PlanService.java | 54 +++++ .../mes/service/plan/PlanServiceImpl.java | 75 +++++++ .../module/mes/service/task/TaskService.java | 106 ++++++++++ .../mes/service/task/TaskServiceImpl.java | 155 +++++++++++++++ .../itemrequisition/ItemRequisitionMapper.xml | 12 ++ .../main/resources/mapper/plan/PlanMapper.xml | 12 ++ .../main/resources/mapper/task/TaskMapper.xml | 12 ++ .../ItemRequisitionServiceImplTest.java | 159 +++++++++++++++ .../mes/service/plan/PlanServiceImplTest.java | 184 ++++++++++++++++++ .../mes/service/task/TaskServiceImplTest.java | 151 ++++++++++++++ .../src/test/resources/sql/clean.sql | 13 +- .../src/test/resources/sql/create_tables.sql | 95 +++++++++ 37 files changed, 2608 insertions(+), 3 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/ItemRequisitionController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDetailDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionDetailMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskDetailMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/itemrequisition/ItemRequisitionMapper.xml create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImplTest.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImplTest.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImplTest.java diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 9c1332b5cb..3dd715ffb9 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -16,5 +16,10 @@ public interface ErrorCodeConstants { ErrorCode ORGANIZATION_PARENT_ERROR = new ErrorCode(5_0014, "不能设置自己为父产线工位"); ErrorCode ORGANIZATION_NAME_DUPLICATE = new ErrorCode(5_0015, "已经存在该组织名称的产线工位"); ErrorCode ORGANIZATION_PARENT_IS_CHILD = new ErrorCode(5_0016, "不能设置自己的子Organization为父Organization"); + ErrorCode TASK_NOT_EXISTS = new ErrorCode(5_002, "生产任务单不存在"); + ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(5_005, "任务单明细不存在"); + ErrorCode PLAN_NOT_EXISTS = new ErrorCode(5_003, "生产计划不存在"); + + ErrorCode ITEM_REQUISITION_NOT_EXISTS = new ErrorCode(5_004, "生产领料不存在"); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/ItemRequisitionController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/ItemRequisitionController.java new file mode 100644 index 0000000000..addcfd5485 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/ItemRequisitionController.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.mes.controller.admin.itemrequisition; + +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; +import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; + +@Tag(name = "管理后台 - 生产领料") +@RestController +@RequestMapping("/mes/item-requisition") +@Validated +public class ItemRequisitionController { + + @Resource + private ItemRequisitionService itemRequisitionService; + + @PostMapping("/create") + @Operation(summary = "创建生产领料") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:create')") + public CommonResult createItemRequisition(@Valid @RequestBody ItemRequisitionSaveReqVO createReqVO) { + return success(itemRequisitionService.createItemRequisition(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产领料") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:update')") + public CommonResult updateItemRequisition(@Valid @RequestBody ItemRequisitionSaveReqVO updateReqVO) { + itemRequisitionService.updateItemRequisition(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产领料") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:item-requisition:delete')") + public CommonResult deleteItemRequisition(@RequestParam("id") Long id) { + itemRequisitionService.deleteItemRequisition(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产领料") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:query')") + public CommonResult getItemRequisition(@RequestParam("id") Long id) { + ItemRequisitionDO itemRequisition = itemRequisitionService.getItemRequisition(id); + return success(BeanUtils.toBean(itemRequisition, ItemRequisitionRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产领料分页") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:query')") + public CommonResult> getItemRequisitionPage(@Valid ItemRequisitionPageReqVO pageReqVO) { + PageResult pageResult = itemRequisitionService.getItemRequisitionPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ItemRequisitionRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产领料 Excel") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportItemRequisitionExcel(@Valid ItemRequisitionPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = itemRequisitionService.getItemRequisitionPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "生产领料.xls", "数据", ItemRequisitionRespVO.class, + BeanUtils.toBean(list, ItemRequisitionRespVO.class)); + } + + // ==================== 子表(领料明细) ==================== + + @GetMapping("/item-requisition-detail/list-by-item-requisition-id") + @Operation(summary = "获得领料明细列表") + @Parameter(name = "itemRequisitionId", description = "领料单ID") + @PreAuthorize("@ss.hasPermission('mes:item-requisition:query')") + public CommonResult> getItemRequisitionDetailListByItemRequisitionId(@RequestParam("itemRequisitionId") Long itemRequisitionId) { + return success(itemRequisitionService.getItemRequisitionDetailListByItemRequisitionId(itemRequisitionId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java new file mode 100644 index 0000000000..be27ded28d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo; + +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 生产领料分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemRequisitionPageReqVO extends PageParam { + + @Schema(description = "编码") + private String code; + + @Schema(description = "下料时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime[] requisitionDate; + + @Schema(description = "领料时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime[] deliveryDate; + + @Schema(description = "状态", example = "2") + private Integer status; + + @Schema(description = "流程实例的编号", example = "1634") + private String processInstanceId; + + @Schema(description = "计划ID", example = "15546") + private Long planId; + + @Schema(description = "备注", example = "随便") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java new file mode 100644 index 0000000000..a36da059bd --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 生产领料 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ItemRequisitionRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5100") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("编码") + private String code; + + @Schema(description = "下料时间") + @ExcelProperty("下料时间") + private LocalDateTime requisitionDate; + + @Schema(description = "领料时间") + @ExcelProperty("领料时间") + private LocalDateTime deliveryDate; + + @Schema(description = "状态", example = "2") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "流程实例的编号", example = "1634") + @ExcelProperty("流程实例的编号") + private String processInstanceId; + + @Schema(description = "计划ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15546") + @ExcelProperty("计划ID") + private Long planId; + + @Schema(description = "备注", example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java new file mode 100644 index 0000000000..0239b4cff9 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 生产领料新增/修改 Request VO") +@Data +public class ItemRequisitionSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5100") + private Long id; + + @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "编码不能为空") + private String code; + + @Schema(description = "下料时间") + private LocalDate requisitionDate; + + @Schema(description = "领料时间") + private LocalDate deliveryDate; + + @Schema(description = "状态", example = "2") + private Integer status; + + @Schema(description = "流程实例的编号", example = "1634") + private String processInstanceId; + + @Schema(description = "计划ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15546") + @NotNull(message = "计划ID不能为空") + private Long planId; + + @Schema(description = "备注", example = "随便") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + + @Schema(description = "领料明细列表") + private List itemRequisitionDetails; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java new file mode 100644 index 0000000000..9749f0ec28 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/PlanController.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan; + +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; + +@Tag(name = "管理后台 - 生产计划") +@RestController +@RequestMapping("/mes/plan") +@Validated +public class PlanController { + + @Resource + private PlanService planService; + + @PostMapping("/create") + @Operation(summary = "创建生产计划") + @PreAuthorize("@ss.hasPermission('mes:plan:create')") + public CommonResult createPlan(@Valid @RequestBody PlanSaveReqVO createReqVO) { + return success(planService.createPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产计划") + @PreAuthorize("@ss.hasPermission('mes:plan:update')") + public CommonResult updatePlan(@Valid @RequestBody PlanSaveReqVO updateReqVO) { + planService.updatePlan(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:plan:delete')") + public CommonResult deletePlan(@RequestParam("id") Long id) { + planService.deletePlan(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:plan:query')") + public CommonResult getPlan(@RequestParam("id") Long id) { + PlanDO plan = planService.getPlan(id); + return success(BeanUtils.toBean(plan, PlanRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产计划分页") + @PreAuthorize("@ss.hasPermission('mes:plan:query')") + public CommonResult> getPlanPage(@Valid PlanPageReqVO pageReqVO) { + PageResult pageResult = planService.getPlanPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PlanRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产计划 Excel") + @PreAuthorize("@ss.hasPermission('mes:plan:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportPlanExcel(@Valid PlanPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = planService.getPlanPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "生产计划.xls", "数据", PlanRespVO.class, + BeanUtils.toBean(list, PlanRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java new file mode 100644 index 0000000000..e344fe9181 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +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 = "管理后台 - 生产计划分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PlanPageReqVO extends PageParam { + + @Schema(description = "计划编码") + private String code; + + @Schema(description = "产品ID", example = "21176") + private Long productId; + + @Schema(description = "任务单明细ID", example = "18938") + private Long taskDetailId; + + @Schema(description = "任务单ID", example = "18331") + private Long taskId; + + @Schema(description = "数量") + private Long planNumber; + + @Schema(description = "成品数量") + private Long finishNumber; + + @Schema(description = "状态", example = "1") + private Integer status; + + @Schema(description = "计划开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] planStartTime; + + @Schema(description = "计划结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] planEndTime; + + @Schema(description = "实际开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] startTime; + + @Schema(description = "实际结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] endTime; + + @Schema(description = "生产主管ID", example = "10640") + private Long productionManagerId; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java new file mode 100644 index 0000000000..dff017131c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java @@ -0,0 +1,84 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 生产计划 Response VO") +@Data +@ExcelIgnoreUnannotated +public class PlanRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17689") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "计划编码") + @ExcelProperty("计划编码") + private String code; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21176") + @ExcelProperty("产品ID") + private Long productId; + + @Schema(description = "任务单明细ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18938") + @ExcelProperty("任务单明细ID") + private Long taskDetailId; + + @Schema(description = "任务单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18331") + @ExcelProperty("任务单ID") + private Long taskId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("数量") + private Long planNumber; + + @Schema(description = "成品数量") + @ExcelProperty("成品数量") + private Long finishNumber; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat("mes_plan_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "计划开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("计划开始时间") + private LocalDateTime planStartTime; + + @Schema(description = "计划结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("计划结束时间") + private LocalDateTime planEndTime; + + @Schema(description = "实际开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("实际开始时间") + private LocalDateTime startTime; + + @Schema(description = "实际结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("实际结束时间") + private LocalDateTime endTime; + + @Schema(description = "生产主管ID", example = "10640") + @ExcelProperty("生产主管ID") + private Long productionManagerId; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用") + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanSaveReqVO.java new file mode 100644 index 0000000000..7064bbbd42 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanSaveReqVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 生产计划新增/修改 Request VO") +@Data +public class PlanSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17689") + private Long id; + + @Schema(description = "计划编码") + private String code; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21176") + @NotNull(message = "产品ID不能为空") + private Long productId; + + @Schema(description = "任务单明细ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18938") + @NotNull(message = "任务单明细ID不能为空") + private Long taskDetailId; + + @Schema(description = "任务单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18331") + @NotNull(message = "任务单ID不能为空") + private Long taskId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数量不能为空") + private Long planNumber; + + @Schema(description = "成品数量") + private Long finishNumber; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "计划开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "计划开始时间不能为空") + private LocalDateTime planStartTime; + + @Schema(description = "计划结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "计划结束时间不能为空") + private LocalDateTime planEndTime; + + @Schema(description = "实际开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "实际开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "实际结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "实际结束时间不能为空") + private LocalDateTime endTime; + + @Schema(description = "生产主管ID", example = "10640") + private Long productionManagerId; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java new file mode 100644 index 0000000000..e6defd1b68 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java @@ -0,0 +1,148 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task; + +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.module.mes.service.task.TaskService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - 生产任务单") +@RestController +@RequestMapping("/mes/task") +@Validated +public class TaskController { + + @Resource + private TaskService taskService; + + @PostMapping("/create") + @Operation(summary = "创建生产任务单") + @PreAuthorize("@ss.hasPermission('mes:task:create')") + public CommonResult createTask(@Valid @RequestBody TaskSaveReqVO createReqVO) { + return success(taskService.createTask(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产任务单") + @PreAuthorize("@ss.hasPermission('mes:task:update')") + public CommonResult updateTask(@Valid @RequestBody TaskSaveReqVO updateReqVO) { + taskService.updateTask(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产任务单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes: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:task:query')") + public CommonResult getTask(@RequestParam("id") Long id) { + TaskDO task = taskService.getTask(id); + return success(BeanUtils.toBean(task, TaskRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产任务单分页") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult> getTaskPage(@Valid TaskPageReqVO pageReqVO) { + PageResult pageResult = taskService.getTaskPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, TaskRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产任务单 Excel") + @PreAuthorize("@ss.hasPermission('mes:task:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTaskExcel(@Valid TaskPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = taskService.getTaskPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "生产任务单.xls", "数据", TaskRespVO.class, + BeanUtils.toBean(list, TaskRespVO.class)); + } + + // ==================== 子表(生产任务单明细) ==================== + + @GetMapping("/task-detail/list-by-task-id") + @Operation(summary = "获得生产任务单明细列表") + @Parameter(name = "taskId", description = "task ID") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult> getTaskDetailListByTaskId(@RequestParam("taskId") Long taskId) { + return success(taskService.getTaskDetailListByTaskId(taskId)); + } + // ==================== 子表(生产任务单明细) ==================== + + @GetMapping("/task-detail/page") + @Operation(summary = "获得生产任务单明细分页") + @Parameter(name = "taskId", description = "task ID") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult> getTaskDetailPage(PageParam pageReqVO, + @RequestParam("taskId") Long taskId) { + return success(taskService.getTaskDetailPage(pageReqVO, taskId)); + } + + @PostMapping("/task-detail/create") + @Operation(summary = "创建生产任务单明细") + @PreAuthorize("@ss.hasPermission('mes:task:create')") + public CommonResult createTaskDetail(@Valid @RequestBody TaskDetailDO taskDetail) { + return success(taskService.createTaskDetail(taskDetail)); + } + + @PutMapping("/task-detail/update") + @Operation(summary = "更新生产任务单明细") + @PreAuthorize("@ss.hasPermission('mes:task:update')") + public CommonResult updateTaskDetail(@Valid @RequestBody TaskDetailDO taskDetail) { + taskService.updateTaskDetail(taskDetail); + return success(true); + } + + @DeleteMapping("/task-detail/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除生产任务单明细") + @PreAuthorize("@ss.hasPermission('mes:task:delete')") + public CommonResult deleteTaskDetail(@RequestParam("id") Long id) { + taskService.deleteTaskDetail(id); + return success(true); + } + + @GetMapping("/task-detail/get") + @Operation(summary = "获得生产任务单明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult getTaskDetail(@RequestParam("id") Long id) { + return success(taskService.getTaskDetail(id)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPageReqVO.java new file mode 100644 index 0000000000..0a284fe961 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPageReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 生产任务单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TaskPageReqVO extends PageParam { + + @Schema(description = "编码") + private String code; + + @Schema(description = "下达日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate[] orderDate; + + @Schema(description = "交货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate[] deliveryDate; + + @Schema(description = "状态", example = "2") + private Integer status; + + @Schema(description = "流程实例的编号", example = "13815") + private String processInstanceId; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskRespVO.java new file mode 100644 index 0000000000..f95dcc6cf4 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskRespVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 生产任务单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class TaskRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14570") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("编码") + private String code; + + @Schema(description = "下达日期") + @ExcelProperty("下达日期") + private LocalDate orderDate; + + @Schema(description = "交货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("交货日期") + private LocalDate deliveryDate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat("mes_task_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "流程实例的编号", example = "13815") + @ExcelProperty("流程实例的编号") + private String processInstanceId; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskSaveReqVO.java new file mode 100644 index 0000000000..57eb45b125 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskSaveReqVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 生产任务单新增/修改 Request VO") +@Data +public class TaskSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14570") + private Long id; + + @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "编码不能为空") + private String code; + + @Schema(description = "下达日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime orderDate; + + @Schema(description = "交货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "交货日期不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime deliveryDate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "流程实例的编号", example = "13815") + private String processInstanceId; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + + @Schema(description = "生产任务单明细列表") + private List taskDetails; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java new file mode 100644 index 0000000000..b25c7e02f4 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition; + +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 生产领料 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_item_requisition") +@KeySequence("mes_item_requisition_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemRequisitionDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 编码 + */ + private String code; + /** + * 下料时间 + */ + private LocalDate requisitionDate; + /** + * 领料时间 + */ + private LocalDate deliveryDate; + /** + * 状态 + */ + private Integer status; + /** + * 流程实例的编号 + */ + private String processInstanceId; + /** + * 计划ID + */ + private Long planId; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDetailDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDetailDO.java new file mode 100644 index 0000000000..0db7f640cb --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDetailDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 领料明细 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_item_requisition_detail") +@KeySequence("mes_item_requisition_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemRequisitionDetailDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 产品ID + */ + private Long productId; + /** + * 单位ID + */ + private Long unitId; + /** + * 领料单ID + */ + private Long itemRequisitionId; + /** + * 数量 + */ + private BigDecimal number; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java new file mode 100644 index 0000000000..018422cd76 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.plan; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 生产计划 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_plan") +@KeySequence("mes_plan_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PlanDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 计划编码 + */ + private String code; + /** + * 产品ID + */ + private Long productId; + /** + * 任务单明细ID + */ + private Long taskDetailId; + /** + * 任务单ID + */ + private Long taskId; + /** + * 数量 + */ + private Long planNumber; + /** + * 成品数量 + */ + private Long finishNumber; + /** + * 状态 + * + * 枚举 {@link TODO mes_plan_status 对应的类} + */ + private Integer status; + /** + * 计划开始时间 + */ + private LocalDateTime planStartTime; + /** + * 计划结束时间 + */ + private LocalDateTime planEndTime; + /** + * 实际开始时间 + */ + private LocalDateTime startTime; + /** + * 实际结束时间 + */ + private LocalDateTime endTime; + /** + * 生产主管ID + */ + private Long productionManagerId; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + * + * 枚举 {@link TODO infra_boolean_string 对应的类} + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDO.java new file mode 100644 index 0000000000..8e69b285a1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.task; + +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 生产任务单 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_task") +@KeySequence("mes_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TaskDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 编码 + */ + private String code; + /** + * 下达日期 + */ + private LocalDateTime orderDate; + /** + * 交货日期 + */ + private LocalDateTime deliveryDate; + /** + * 状态 + * + * 枚举 {@link TODO mes_task_status 对应的类} + */ + private Integer status; + /** + * 流程实例的编号 + */ + private String processInstanceId; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + * + * 枚举 {@link TODO infra_boolean_string 对应的类} + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java new file mode 100644 index 0000000000..11b14735f8 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.task; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 生产任务单明细 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_task_detail") +@KeySequence("mes_task_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TaskDetailDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 产品ID + */ + private Long productId; + /** + * 单位ID + */ + private Long unitId; + /** + * task ID + */ + private Long taskId; + /** + * 数量 + */ + private Long number; + /** + * 打包要求(每包/个) + */ + private Long packageSize; + /** + * 项目名称 + */ + private String projectName; + /** + * 技术要求 + */ + private String techRequirements; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionDetailMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionDetailMapper.java new file mode 100644 index 0000000000..5fe87e65d7 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionDetailMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 领料明细 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface ItemRequisitionDetailMapper extends BaseMapperX { + + default List selectListByItemRequisitionId(Long itemRequisitionId) { + return selectList(ItemRequisitionDetailDO::getItemRequisitionId, itemRequisitionId); + } + + default int deleteByItemRequisitionId(Long itemRequisitionId) { + return delete(ItemRequisitionDetailDO::getItemRequisitionId, itemRequisitionId); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionMapper.java new file mode 100644 index 0000000000..8e3d9312f8 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/itemrequisition/ItemRequisitionMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; + +/** + * 生产领料 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface ItemRequisitionMapper extends BaseMapperX { + + default PageResult selectPage(ItemRequisitionPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemRequisitionDO::getCode, reqVO.getCode()) + .betweenIfPresent(ItemRequisitionDO::getRequisitionDate, reqVO.getRequisitionDate()) + .betweenIfPresent(ItemRequisitionDO::getDeliveryDate, reqVO.getDeliveryDate()) + .eqIfPresent(ItemRequisitionDO::getStatus, reqVO.getStatus()) + .eqIfPresent(ItemRequisitionDO::getProcessInstanceId, reqVO.getProcessInstanceId()) + .eqIfPresent(ItemRequisitionDO::getPlanId, reqVO.getPlanId()) + .eqIfPresent(ItemRequisitionDO::getRemark, reqVO.getRemark()) + .eqIfPresent(ItemRequisitionDO::getIsEnable, reqVO.getIsEnable()) + .betweenIfPresent(ItemRequisitionDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemRequisitionDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java new file mode 100644 index 0000000000..2a22128bce --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.plan; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; + +/** + * 生产计划 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface PlanMapper extends BaseMapperX { + + default PageResult selectPage(PlanPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(PlanDO::getCode, reqVO.getCode()) + .eqIfPresent(PlanDO::getProductId, reqVO.getProductId()) + .eqIfPresent(PlanDO::getTaskDetailId, reqVO.getTaskDetailId()) + .eqIfPresent(PlanDO::getTaskId, reqVO.getTaskId()) + .eqIfPresent(PlanDO::getPlanNumber, reqVO.getPlanNumber()) + .eqIfPresent(PlanDO::getFinishNumber, reqVO.getFinishNumber()) + .eqIfPresent(PlanDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(PlanDO::getPlanStartTime, reqVO.getPlanStartTime()) + .betweenIfPresent(PlanDO::getPlanEndTime, reqVO.getPlanEndTime()) + .betweenIfPresent(PlanDO::getStartTime, reqVO.getStartTime()) + .betweenIfPresent(PlanDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(PlanDO::getProductionManagerId, reqVO.getProductionManagerId()) + .eqIfPresent(PlanDO::getRemark, reqVO.getRemark()) + .eqIfPresent(PlanDO::getIsEnable, reqVO.getIsEnable()) + .betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(PlanDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskDetailMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskDetailMapper.java new file mode 100644 index 0000000000..e557795222 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskDetailMapper.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.task; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 生产任务单明细 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface TaskDetailMapper extends BaseMapperX { + + default List selectListByTaskId(Long taskId) { + return selectList(TaskDetailDO::getTaskId, taskId); + } + + default int deleteByTaskId(Long taskId) { + return delete(TaskDetailDO::getTaskId, taskId); + } + default PageResult selectPage(PageParam reqVO, Long taskId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(TaskDetailDO::getTaskId, taskId) + .orderByDesc(TaskDetailDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java new file mode 100644 index 0000000000..52efa36777 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/TaskMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.task; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; + +/** + * 生产任务单 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface TaskMapper extends BaseMapperX { + + default PageResult selectPage(TaskPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(TaskDO::getCode, reqVO.getCode()) + .betweenIfPresent(TaskDO::getOrderDate, reqVO.getOrderDate()) + .betweenIfPresent(TaskDO::getDeliveryDate, reqVO.getDeliveryDate()) + .eqIfPresent(TaskDO::getStatus, reqVO.getStatus()) + .eqIfPresent(TaskDO::getProcessInstanceId, reqVO.getProcessInstanceId()) + .eqIfPresent(TaskDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TaskDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TaskDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java new file mode 100644 index 0000000000..3359c6e1cf --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * 生产领料 Service 接口 + * + * @author 内蒙必硕 + */ +public interface ItemRequisitionService { + + /** + * 创建生产领料 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemRequisition(@Valid ItemRequisitionSaveReqVO createReqVO); + + /** + * 更新生产领料 + * + * @param updateReqVO 更新信息 + */ + void updateItemRequisition(@Valid ItemRequisitionSaveReqVO updateReqVO); + + /** + * 删除生产领料 + * + * @param id 编号 + */ + void deleteItemRequisition(Long id); + + /** + * 获得生产领料 + * + * @param id 编号 + * @return 生产领料 + */ + ItemRequisitionDO getItemRequisition(Long id); + + /** + * 获得生产领料分页 + * + * @param pageReqVO 分页查询 + * @return 生产领料分页 + */ + PageResult getItemRequisitionPage(ItemRequisitionPageReqVO pageReqVO); + + // ==================== 子表(领料明细) ==================== + + /** + * 获得领料明细列表 + * + * @param itemRequisitionId 领料单ID + * @return 领料明细列表 + */ + List getItemRequisitionDetailListByItemRequisitionId(Long itemRequisitionId); + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java new file mode 100644 index 0000000000..62268a1c13 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java @@ -0,0 +1,113 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionDetailMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * 生产领料 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class ItemRequisitionServiceImpl implements ItemRequisitionService { + + @Resource + private ItemRequisitionMapper itemRequisitionMapper; + @Resource + private ItemRequisitionDetailMapper itemRequisitionDetailMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createItemRequisition(ItemRequisitionSaveReqVO createReqVO) { + // 插入 + ItemRequisitionDO itemRequisition = BeanUtils.toBean(createReqVO, ItemRequisitionDO.class); + itemRequisitionMapper.insert(itemRequisition); + + // 插入子表 + createItemRequisitionDetailList(itemRequisition.getId(), createReqVO.getItemRequisitionDetails()); + // 返回 + return itemRequisition.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateItemRequisition(ItemRequisitionSaveReqVO updateReqVO) { + // 校验存在 + validateItemRequisitionExists(updateReqVO.getId()); + // 更新 + ItemRequisitionDO updateObj = BeanUtils.toBean(updateReqVO, ItemRequisitionDO.class); + itemRequisitionMapper.updateById(updateObj); + + // 更新子表 + updateItemRequisitionDetailList(updateReqVO.getId(), updateReqVO.getItemRequisitionDetails()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteItemRequisition(Long id) { + // 校验存在 + validateItemRequisitionExists(id); + // 删除 + itemRequisitionMapper.deleteById(id); + + // 删除子表 + deleteItemRequisitionDetailByItemRequisitionId(id); + } + + private void validateItemRequisitionExists(Long id) { + if (itemRequisitionMapper.selectById(id) == null) { + throw exception(ITEM_REQUISITION_NOT_EXISTS); + } + } + + @Override + public ItemRequisitionDO getItemRequisition(Long id) { + return itemRequisitionMapper.selectById(id); + } + + @Override + public PageResult getItemRequisitionPage(ItemRequisitionPageReqVO pageReqVO) { + return itemRequisitionMapper.selectPage(pageReqVO); + } + + // ==================== 子表(领料明细) ==================== + + @Override + public List getItemRequisitionDetailListByItemRequisitionId(Long itemRequisitionId) { + return itemRequisitionDetailMapper.selectListByItemRequisitionId(itemRequisitionId); + } + + private void createItemRequisitionDetailList(Long itemRequisitionId, List list) { + list.forEach(o -> o.setItemRequisitionId(itemRequisitionId)); + itemRequisitionDetailMapper.insertBatch(list); + } + + private void updateItemRequisitionDetailList(Long itemRequisitionId, List list) { + deleteItemRequisitionDetailByItemRequisitionId(itemRequisitionId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createItemRequisitionDetailList(itemRequisitionId, list); + } + + private void deleteItemRequisitionDetailByItemRequisitionId(Long itemRequisitionId) { + itemRequisitionDetailMapper.deleteByItemRequisitionId(itemRequisitionId); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java new file mode 100644 index 0000000000..70acac1241 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.service.plan; + +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.validation.Valid; + +/** + * 生产计划 Service 接口 + * + * @author 内蒙必硕 + */ +public interface PlanService { + + /** + * 创建生产计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPlan(@Valid PlanSaveReqVO createReqVO); + + /** + * 更新生产计划 + * + * @param updateReqVO 更新信息 + */ + void updatePlan(@Valid PlanSaveReqVO updateReqVO); + + /** + * 删除生产计划 + * + * @param id 编号 + */ + void deletePlan(Long id); + + /** + * 获得生产计划 + * + * @param id 编号 + * @return 生产计划 + */ + PlanDO getPlan(Long id); + + /** + * 获得生产计划分页 + * + * @param pageReqVO 分页查询 + * @return 生产计划分页 + */ + PageResult getPlanPage(PlanPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java new file mode 100644 index 0000000000..9ad31d2471 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.service.plan; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * 生产计划 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class PlanServiceImpl implements PlanService { + + @Resource + private PlanMapper planMapper; + + @Override + public Long createPlan(PlanSaveReqVO createReqVO) { + // 插入 + PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class); + planMapper.insert(plan); + // 返回 + return plan.getId(); + } + + @Override + public void updatePlan(PlanSaveReqVO updateReqVO) { + // 校验存在 + validatePlanExists(updateReqVO.getId()); + // 更新 + PlanDO updateObj = BeanUtils.toBean(updateReqVO, PlanDO.class); + planMapper.updateById(updateObj); + } + + @Override + public void deletePlan(Long id) { + // 校验存在 + validatePlanExists(id); + // 删除 + planMapper.deleteById(id); + } + + private void validatePlanExists(Long id) { + if (planMapper.selectById(id) == null) { + throw exception(PLAN_NOT_EXISTS); + } + } + + @Override + public PlanDO getPlan(Long id) { + return planMapper.selectById(id); + } + + @Override + public PageResult getPlanPage(PlanPageReqVO pageReqVO) { + return planMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java new file mode 100644 index 0000000000..8ec2a69cc6 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.mes.service.task; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * 生产任务单 Service 接口 + * + * @author 内蒙必硕 + */ +public interface TaskService { + + /** + * 创建生产任务单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTask(@Valid TaskSaveReqVO createReqVO); + + /** + * 更新生产任务单 + * + * @param updateReqVO 更新信息 + */ + void updateTask(@Valid TaskSaveReqVO updateReqVO); + + /** + * 删除生产任务单 + * + * @param id 编号 + */ + void deleteTask(Long id); + + /** + * 获得生产任务单 + * + * @param id 编号 + * @return 生产任务单 + */ + TaskDO getTask(Long id); + + /** + * 获得生产任务单分页 + * + * @param pageReqVO 分页查询 + * @return 生产任务单分页 + */ + PageResult getTaskPage(TaskPageReqVO pageReqVO); + + // ==================== 子表(生产任务单明细) ==================== + + /** + * 获得生产任务单明细列表 + * + * @param taskId task ID + * @return 生产任务单明细列表 + */ + List getTaskDetailListByTaskId(Long taskId); + + /** + * 获得生产任务单明细分页 + * + * @param pageReqVO 分页查询 + * @param taskId task ID + * @return 生产任务单明细分页 + */ + PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId); + + /** + * 创建生产任务单明细 + * + * @param taskDetail 创建信息 + * @return 编号 + */ + Long createTaskDetail(@Valid TaskDetailDO taskDetail); + + /** + * 更新生产任务单明细 + * + * @param taskDetail 更新信息 + */ + void updateTaskDetail(@Valid TaskDetailDO taskDetail); + + /** + * 删除生产任务单明细 + * + * @param id 编号 + */ + void deleteTaskDetail(Long id); + + /** + * 获得生产任务单明细 + * + * @param id 编号 + * @return 生产任务单明细 + */ + TaskDetailDO getTaskDetail(Long id); + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java new file mode 100644 index 0000000000..e84639c87e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -0,0 +1,155 @@ +package cn.iocoder.yudao.module.mes.service.task; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskDetailMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * 生产任务单 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class TaskServiceImpl implements TaskService { + + @Resource + private TaskMapper taskMapper; + @Resource + private TaskDetailMapper taskDetailMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createTask(TaskSaveReqVO createReqVO) { + // 插入 + TaskDO task = BeanUtils.toBean(createReqVO, TaskDO.class); + taskMapper.insert(task); + + // 插入子表 + createTaskDetailList(task.getId(), createReqVO.getTaskDetails()); + // 返回 + return task.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTask(TaskSaveReqVO updateReqVO) { + // 校验存在 + validateTaskExists(updateReqVO.getId()); + // 更新 + TaskDO updateObj = BeanUtils.toBean(updateReqVO, TaskDO.class); + taskMapper.updateById(updateObj); + + // 更新子表 + updateTaskDetailList(updateReqVO.getId(), updateReqVO.getTaskDetails()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTask(Long id) { + // 校验存在 + validateTaskExists(id); + // 删除 + taskMapper.deleteById(id); + + // 删除子表 + deleteTaskDetailByTaskId(id); + } + + private void validateTaskExists(Long id) { + if (taskMapper.selectById(id) == null) { + throw exception(TASK_NOT_EXISTS); + } + } + + @Override + public TaskDO getTask(Long id) { + return taskMapper.selectById(id); + } + + @Override + public PageResult getTaskPage(TaskPageReqVO pageReqVO) { + return taskMapper.selectPage(pageReqVO); + } + + // ==================== 子表(生产任务单明细) ==================== + + @Override + public List getTaskDetailListByTaskId(Long taskId) { + return taskDetailMapper.selectListByTaskId(taskId); + } + + private void createTaskDetailList(Long taskId, List list) { + list.forEach(o -> o.setTaskId(taskId)); + taskDetailMapper.insertBatch(list); + } + + private void updateTaskDetailList(Long taskId, List list) { + deleteTaskDetailByTaskId(taskId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createTaskDetailList(taskId, list); + } + + private void deleteTaskDetailByTaskId(Long taskId) { + taskDetailMapper.deleteByTaskId(taskId); + } + + // ==================== 子表(生产任务单明细) ==================== + + @Override + public PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId) { + return taskDetailMapper.selectPage(pageReqVO, taskId); + } + + @Override + public Long createTaskDetail(TaskDetailDO taskDetail) { + taskDetailMapper.insert(taskDetail); + return taskDetail.getId(); + } + + @Override + public void updateTaskDetail(TaskDetailDO taskDetail) { + // 校验存在 + validateTaskDetailExists(taskDetail.getId()); + // 更新 + taskDetailMapper.updateById(taskDetail); + } + + @Override + public void deleteTaskDetail(Long id) { + // 校验存在 + validateTaskDetailExists(id); + // 删除 + taskDetailMapper.deleteById(id); + } + + @Override + public TaskDetailDO getTaskDetail(Long id) { + return taskDetailMapper.selectById(id); + } + + private void validateTaskDetailExists(Long id) { + if (taskDetailMapper.selectById(id) == null) { + throw exception(TASK_DETAIL_NOT_EXISTS); + } + } + + + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/itemrequisition/ItemRequisitionMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/itemrequisition/ItemRequisitionMapper.xml new file mode 100644 index 0000000000..6c5f8e5af1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/itemrequisition/ItemRequisitionMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml new file mode 100644 index 0000000000..3e60daf6ac --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml new file mode 100644 index 0000000000..f2e7369b82 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImplTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImplTest.java new file mode 100644 index 0000000000..5620d338df --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImplTest.java @@ -0,0 +1,159 @@ +package cn.iocoder.yudao.module.mes.service.itemrequisition; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link ItemRequisitionServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(ItemRequisitionServiceImpl.class) +public class ItemRequisitionServiceImplTest extends BaseDbUnitTest { + + @Resource + private ItemRequisitionServiceImpl itemRequisitionService; + + @Resource + private ItemRequisitionMapper itemRequisitionMapper; + + @Test + public void testCreateItemRequisition_success() { + // 准备参数 + ItemRequisitionSaveReqVO createReqVO = randomPojo(ItemRequisitionSaveReqVO.class).setId(null); + + // 调用 + Long itemRequisitionId = itemRequisitionService.createItemRequisition(createReqVO); + // 断言 + assertNotNull(itemRequisitionId); + // 校验记录的属性是否正确 + ItemRequisitionDO itemRequisition = itemRequisitionMapper.selectById(itemRequisitionId); + assertPojoEquals(createReqVO, itemRequisition, "id"); + } + + @Test + public void testUpdateItemRequisition_success() { + // mock 数据 + ItemRequisitionDO dbItemRequisition = randomPojo(ItemRequisitionDO.class); + itemRequisitionMapper.insert(dbItemRequisition);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ItemRequisitionSaveReqVO updateReqVO = randomPojo(ItemRequisitionSaveReqVO.class, o -> { + o.setId(dbItemRequisition.getId()); // 设置更新的 ID + }); + + // 调用 + itemRequisitionService.updateItemRequisition(updateReqVO); + // 校验是否更新正确 + ItemRequisitionDO itemRequisition = itemRequisitionMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, itemRequisition); + } + + @Test + public void testUpdateItemRequisition_notExists() { + // 准备参数 + ItemRequisitionSaveReqVO updateReqVO = randomPojo(ItemRequisitionSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> itemRequisitionService.updateItemRequisition(updateReqVO), ITEM_REQUISITION_NOT_EXISTS); + } + + @Test + public void testDeleteItemRequisition_success() { + // mock 数据 + ItemRequisitionDO dbItemRequisition = randomPojo(ItemRequisitionDO.class); + itemRequisitionMapper.insert(dbItemRequisition);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbItemRequisition.getId(); + + // 调用 + itemRequisitionService.deleteItemRequisition(id); + // 校验数据不存在了 + assertNull(itemRequisitionMapper.selectById(id)); + } + + @Test + public void testDeleteItemRequisition_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> itemRequisitionService.deleteItemRequisition(id), ITEM_REQUISITION_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetItemRequisitionPage() { + // mock 数据 + ItemRequisitionDO dbItemRequisition = randomPojo(ItemRequisitionDO.class, o -> { // 等会查询到 + o.setCode(null); + o.setRequisitionDate(null); + o.setDeliveryDate(null); + o.setStatus(null); + o.setProcessInstanceId(null); + o.setPlanId(null); + o.setRemark(null); + o.setIsEnable(null); + o.setCreateTime(null); + }); + itemRequisitionMapper.insert(dbItemRequisition); + // 测试 code 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setCode(null))); + // 测试 requisitionDate 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setRequisitionDate(null))); + // 测试 deliveryDate 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setDeliveryDate(null))); + // 测试 status 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setStatus(null))); + // 测试 processInstanceId 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setProcessInstanceId(null))); + // 测试 planId 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setPlanId(null))); + // 测试 remark 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setRemark(null))); + // 测试 isEnable 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setIsEnable(null))); + // 测试 createTime 不匹配 + itemRequisitionMapper.insert(cloneIgnoreId(dbItemRequisition, o -> o.setCreateTime(null))); + // 准备参数 + ItemRequisitionPageReqVO reqVO = new ItemRequisitionPageReqVO(); + reqVO.setCode(null); + + reqVO.setStatus(null); + reqVO.setProcessInstanceId(null); + reqVO.setPlanId(null); + reqVO.setRemark(null); + reqVO.setIsEnable(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = itemRequisitionService.getItemRequisitionPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbItemRequisition, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImplTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImplTest.java new file mode 100644 index 0000000000..0b1f9287f1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImplTest.java @@ -0,0 +1,184 @@ +package cn.iocoder.yudao.module.mes.service.plan; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link PlanServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(PlanServiceImpl.class) +public class PlanServiceImplTest extends BaseDbUnitTest { + + @Resource + private PlanServiceImpl planService; + + @Resource + private PlanMapper planMapper; + + @Test + public void testCreatePlan_success() { + // 准备参数 + PlanSaveReqVO createReqVO = randomPojo(PlanSaveReqVO.class).setId(null); + + // 调用 + Long planId = planService.createPlan(createReqVO); + // 断言 + assertNotNull(planId); + // 校验记录的属性是否正确 + PlanDO plan = planMapper.selectById(planId); + assertPojoEquals(createReqVO, plan, "id"); + } + + @Test + public void testUpdatePlan_success() { + // mock 数据 + PlanDO dbPlan = randomPojo(PlanDO.class); + planMapper.insert(dbPlan);// @Sql: 先插入出一条存在的数据 + // 准备参数 + PlanSaveReqVO updateReqVO = randomPojo(PlanSaveReqVO.class, o -> { + o.setId(dbPlan.getId()); // 设置更新的 ID + }); + + // 调用 + planService.updatePlan(updateReqVO); + // 校验是否更新正确 + PlanDO plan = planMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, plan); + } + + @Test + public void testUpdatePlan_notExists() { + // 准备参数 + PlanSaveReqVO updateReqVO = randomPojo(PlanSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> planService.updatePlan(updateReqVO), PLAN_NOT_EXISTS); + } + + @Test + public void testDeletePlan_success() { + // mock 数据 + PlanDO dbPlan = randomPojo(PlanDO.class); + planMapper.insert(dbPlan);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbPlan.getId(); + + // 调用 + planService.deletePlan(id); + // 校验数据不存在了 + assertNull(planMapper.selectById(id)); + } + + @Test + public void testDeletePlan_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> planService.deletePlan(id), PLAN_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetPlanPage() { + // mock 数据 + PlanDO dbPlan = randomPojo(PlanDO.class, o -> { // 等会查询到 + o.setCode(null); + o.setProductId(null); + o.setTaskDetailId(null); + o.setTaskId(null); + o.setPlanNumber(null); + o.setFinishNumber(null); + o.setStatus(null); + o.setPlanStartTime(null); + o.setPlanEndTime(null); + o.setStartTime(null); + o.setEndTime(null); + o.setProductionManagerId(null); + o.setRemark(null); + o.setIsEnable(null); + o.setCreateTime(null); + }); + planMapper.insert(dbPlan); + // 测试 code 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setCode(null))); + // 测试 productId 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setProductId(null))); + // 测试 taskDetailId 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setTaskDetailId(null))); + // 测试 taskId 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setTaskId(null))); + // 测试 planNumber 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setPlanNumber(null))); + // 测试 finishNumber 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setFinishNumber(null))); + // 测试 status 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setStatus(null))); + // 测试 planStartTime 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setPlanStartTime(null))); + // 测试 planEndTime 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setPlanEndTime(null))); + // 测试 startTime 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setStartTime(null))); + // 测试 endTime 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setEndTime(null))); + // 测试 productionManagerId 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setProductionManagerId(null))); + // 测试 remark 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setRemark(null))); + // 测试 isEnable 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setIsEnable(null))); + // 测试 createTime 不匹配 + planMapper.insert(cloneIgnoreId(dbPlan, o -> o.setCreateTime(null))); + // 准备参数 + PlanPageReqVO reqVO = new PlanPageReqVO(); + reqVO.setCode(null); + reqVO.setProductId(null); + reqVO.setTaskDetailId(null); + reqVO.setTaskId(null); + reqVO.setPlanNumber(null); + reqVO.setFinishNumber(null); + reqVO.setStatus(null); + reqVO.setPlanStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setPlanEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setProductionManagerId(null); + reqVO.setRemark(null); + reqVO.setIsEnable(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = planService.getPlanPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbPlan, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImplTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImplTest.java new file mode 100644 index 0000000000..20084eb8e3 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImplTest.java @@ -0,0 +1,151 @@ +package cn.iocoder.yudao.module.mes.service.task; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link TaskServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(TaskServiceImpl.class) +public class TaskServiceImplTest extends BaseDbUnitTest { + + @Resource + private TaskServiceImpl taskService; + + @Resource + private TaskMapper taskMapper; + + @Test + public void testCreateTask_success() { + // 准备参数 + TaskSaveReqVO createReqVO = randomPojo(TaskSaveReqVO.class).setId(null); + + // 调用 + Long taskId = taskService.createTask(createReqVO); + // 断言 + assertNotNull(taskId); + // 校验记录的属性是否正确 + TaskDO task = taskMapper.selectById(taskId); + assertPojoEquals(createReqVO, task, "id"); + } + + @Test + public void testUpdateTask_success() { + // mock 数据 + TaskDO dbTask = randomPojo(TaskDO.class); + taskMapper.insert(dbTask);// @Sql: 先插入出一条存在的数据 + // 准备参数 + TaskSaveReqVO updateReqVO = randomPojo(TaskSaveReqVO.class, o -> { + o.setId(dbTask.getId()); // 设置更新的 ID + }); + + // 调用 + taskService.updateTask(updateReqVO); + // 校验是否更新正确 + TaskDO task = taskMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, task); + } + + @Test + public void testUpdateTask_notExists() { + // 准备参数 + TaskSaveReqVO updateReqVO = randomPojo(TaskSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> taskService.updateTask(updateReqVO), TASK_NOT_EXISTS); + } + + @Test + public void testDeleteTask_success() { + // mock 数据 + TaskDO dbTask = randomPojo(TaskDO.class); + taskMapper.insert(dbTask);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTask.getId(); + + // 调用 + taskService.deleteTask(id); + // 校验数据不存在了 + assertNull(taskMapper.selectById(id)); + } + + @Test + public void testDeleteTask_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> taskService.deleteTask(id), TASK_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetTaskPage() { + // mock 数据 + TaskDO dbTask = randomPojo(TaskDO.class, o -> { // 等会查询到 + o.setCode(null); + o.setOrderDate(null); + o.setDeliveryDate(null); + o.setStatus(null); + o.setProcessInstanceId(null); + o.setRemark(null); + o.setCreateTime(null); + }); + taskMapper.insert(dbTask); + // 测试 code 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setCode(null))); + // 测试 orderDate 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setOrderDate(null))); + // 测试 deliveryDate 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setDeliveryDate(null))); + // 测试 status 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setStatus(null))); + // 测试 processInstanceId 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setProcessInstanceId(null))); + // 测试 remark 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setRemark(null))); + // 测试 createTime 不匹配 + taskMapper.insert(cloneIgnoreId(dbTask, o -> o.setCreateTime(null))); + // 准备参数 + TaskPageReqVO reqVO = new TaskPageReqVO(); + reqVO.setCode(null); + + reqVO.setStatus(null); + reqVO.setProcessInstanceId(null); + reqVO.setRemark(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = taskService.getTaskPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbTask, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/clean.sql b/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/clean.sql index 91348b4767..9bd7dad815 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/clean.sql +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/clean.sql @@ -2,9 +2,16 @@ -- 将该删表 SQL 语句,添加到 yudao-module-mes-biz 模块的 test/resources/sql/clean.sql 文件里 DELETE FROM "mes_bom"; --- 将该删表 SQL 语句,添加到 yudao-module-mes-biz 模块的 test/resources/sql/clean.sql 文件里 DELETE FROM "mes_bom_detail"; +DELETE FROM "mes_organization"; --- 将该删表 SQL 语句,添加到 yudao-module-mes-biz 模块的 test/resources/sql/clean.sql 文件里 -DELETE FROM "mes_organization"; \ No newline at end of file +DELETE FROM "mes_task"; + +DELETE FROM "mes_task_detail"; + +DELETE FROM "mes_plan"; + +DELETE FROM "mes_item_requisition_detail"; + +DELETE FROM "mes_item_requisition"; \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/create_tables.sql b/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/create_tables.sql index e7310a1cb5..21281036ae 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/create_tables.sql +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/resources/sql/create_tables.sql @@ -58,3 +58,98 @@ CREATE TABLE IF NOT EXISTS "mes_organization" "tenant_id" bigint , PRIMARY KEY ("id") ) COMMENT '工厂组织表'; +CREATE TABLE IF NOT EXISTS "mes_task" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar NOT NULL, + "order_date" varchar, + "delivery_date" varchar NOT NULL, + "status" int NOT NULL, + "process_instance_id" varchar, + "remark" varchar, + "is_enable" bit NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint, + PRIMARY KEY ("id") +) COMMENT '生产任务单'; +CREATE TABLE IF NOT EXISTS "mes_task_detail" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "product_id" bigint NOT NULL, + "unit_id" bigint NOT NULL, + "task_id" bigint NOT NULL, + "number" bigint NOT NULL, + "package_size" bigint NOT NULL, + "project_name" varchar, + "tech_requirements" varchar, + "remark" varchar, + "is_enable" bit, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint, + PRIMARY KEY ("id") +) COMMENT '生产任务单明细'; +CREATE TABLE IF NOT EXISTS "mes_plan" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar, + "product_id" bigint NOT NULL, + "task_detail_id" bigint NOT NULL, + "task_id" bigint NOT NULL, + "plan_number" bigint NOT NULL, + "finish_number" bigint, + "status" int NOT NULL, + "plan_start_time" varchar NOT NULL, + "plan_end_time" varchar NOT NULL, + "start_time" varchar NOT NULL, + "end_time" varchar NOT NULL, + "production_manager_id" bigint, + "remark" varchar, + "is_enable" bit, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint, + PRIMARY KEY ("id") +) COMMENT '生产计划'; +CREATE TABLE IF NOT EXISTS "mes_item_requisition_detail" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "product_id" bigint NOT NULL, + "unit_id" bigint NOT NULL, + "item_requisition_id" bigint NOT NULL, + "number" varchar, + "remark" varchar, + "is_enable" bit, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint, + PRIMARY KEY ("id") +) COMMENT '领料明细'; + +CREATE TABLE IF NOT EXISTS "mes_item_requisition" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar NOT NULL, + "requisition_date" varchar, + "delivery_date" varchar, + "status" int, + "process_instance_id" varchar, + "plan_id" bigint NOT NULL, + "remark" varchar, + "is_enable" bit NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint, + PRIMARY KEY ("id") +) COMMENT '生产领料';