From 8a3eec1373582c855cd8d614c08a0fa587b73e94 Mon Sep 17 00:00:00 2001 From: chenshuichuan <1154693969@qq.com> Date: Wed, 12 Jun 2024 17:11:52 +0800 Subject: [PATCH] add task and plan --- script/temp.txt | 9 +++ .../sale/ErpSaleOrderServiceImplTest.java | 18 ++++++ .../admin/plan/vo/PlanSaveReqVO.java | 2 - .../controller/admin/task/TaskController.java | 41 +++++++++++++- .../admin/task/vo/TaskStatusEnum.java | 30 ++++++++++ .../dataobject/task/TaskDetailSumResult.java | 34 ++++++++++++ .../task/ViewTaskProductSummary.java | 49 +++++++++++++++++ .../module/mes/dal/mysql/plan/PlanMapper.java | 19 +++++++ .../mes/dal/mysql/task/TaskDetailMapper.java | 9 ++- .../module/mes/dal/mysql/task/TaskMapper.java | 20 +++++++ .../task/ViewTaskProductSummaryMapper.java | 35 ++++++++++++ .../module/mes/service/task/TaskService.java | 24 ++++++-- .../mes/service/task/TaskServiceImpl.java | 36 +++++++++++- .../mapper/task/TaskDetailMapper.xml | 55 +++++++++++++++++++ .../mes/service/bom/BomServiceImplTest.java | 3 +- .../module/mes/service/task/MapperTest.java | 52 ++++++++++++++++++ .../src/main/resources/application.yaml | 1 + 17 files changed, 425 insertions(+), 12 deletions(-) create mode 100644 script/temp.txt create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImplTest.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskStatusEnum.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailSumResult.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/ViewTaskProductSummary.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/ViewTaskProductSummaryMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/MapperTest.java diff --git a/script/temp.txt b/script/temp.txt new file mode 100644 index 000000000..0d4737158 --- /dev/null +++ b/script/temp.txt @@ -0,0 +1,9 @@ +字典标签 +字典键值 +入库 6 +完工 5 +开工 4 +计划 3 +下达 2 +送审 1 +草稿 0 diff --git a/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImplTest.java b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImplTest.java new file mode 100644 index 000000000..e16ff903a --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImplTest.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.erp.service.sale; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import static org.junit.jupiter.api.Assertions.*; +@Import(ErpSaleOrderServiceImpl.class) +class ErpSaleOrderServiceImplTest extends BaseDbUnitTest { + + @Test + void createSaleOrder() { + } + + @Test + void getSaleOrder() { + } +} \ 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 index 6560e1e9b..32f38e90a 100644 --- 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 @@ -21,7 +21,6 @@ public class PlanSaveReqVO { 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") @@ -36,7 +35,6 @@ public class PlanSaveReqVO { private Long finishNumber; @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") private Integer status; @Schema(description = "计划开始时间", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java index f1f97e94c..60523863a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.task; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.ViewTaskProductSummary; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; @@ -71,7 +72,37 @@ public class TaskController { TaskDO task = taskService.getTask(id); return success(BeanUtils.toBean(task, TaskRespVO.class)); } - + @GetMapping("/getTaskList") + @Operation(summary = "获得可查询计划的生产任务单列表") + public CommonResult> getTaskList() { + List statusList = new ArrayList<>(); + statusList.add(TaskStatusEnum.下达.getValue()); + statusList.add(TaskStatusEnum.计划.getValue()); + statusList.add(TaskStatusEnum.开工.getValue()); + statusList.add(TaskStatusEnum.完工.getValue()); + statusList.add(TaskStatusEnum.入库.getValue()); + List taskDOList = taskService.selectList(statusList); + + return success(taskDOList); + } + @GetMapping("/getPlanTaskList") + @Operation(summary = "获得可做计划的生产任务单列表") + public CommonResult> getPlanTaskList() { + List statusList = new ArrayList<>(); + statusList.add(TaskStatusEnum.下达.getValue()); + statusList.add(TaskStatusEnum.计划.getValue()); + statusList.add(TaskStatusEnum.开工.getValue()); + List taskDOList = taskService.selectList(statusList); + + return success(taskDOList); + } + @GetMapping("/pagePlanTask") + @Operation(summary = "获得可安排计划的任务单分页") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult> pagePlanTask(@Valid TaskPageReqVO pageReqVO) { + PageResult pageResult = taskService.getTaskPage2(pageReqVO); + return success(BeanUtils.toBean(pageResult, TaskRespVO.class)); + } @GetMapping("/page") @Operation(summary = "获得生产任务单分页") @PreAuthorize("@ss.hasPermission('mes:task:query')") @@ -144,5 +175,11 @@ public class TaskController { public CommonResult getTaskDetail(@RequestParam("id") Long id) { return success(taskService.getTaskDetail(id)); } - + @GetMapping("/task-detail/summary") + @Operation(summary = "获得生产任务单汇总明细") + @Parameter(name = "taskId", description = "task ID") + @PreAuthorize("@ss.hasPermission('mes:task:query')") + public CommonResult> getTaskDetailSummary(@RequestParam("taskId") Long taskId) { + return success(taskService.getTaskProductSummaryList(taskId)); + } } \ 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/TaskStatusEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskStatusEnum.java new file mode 100644 index 000000000..722249604 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskStatusEnum.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.task.vo; + +import cn.hutool.core.util.ObjUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum TaskStatusEnum { + + 草稿(0), + 送审(1), + 下达(2), + 计划(3), + 开工(4), + 完工(5), + 入库(6); + + private final int value; + + // 一个可选的方法,用于根据整数值获取对应的枚举实例 + public static TaskStatusEnum fromValue(int value) { + for (TaskStatusEnum status : TaskStatusEnum.values()) { + if (status.getValue() == value) { + return status; + } + } + throw new IllegalArgumentException("Unknown value: " + value); + } +} \ 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/TaskDetailSumResult.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailSumResult.java new file mode 100644 index 000000000..843d2f9e3 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailSumResult.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.task; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 生产任务单明细 DO + * + * @author 内蒙必硕 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TaskDetailSumResult { + + /** + * 产品ID + */ + private Long productId; + /** + * task ID + */ + private Long taskId; + /** + * 数量 + */ + private Long number; +} \ 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/ViewTaskProductSummary.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/ViewTaskProductSummary.java new file mode 100644 index 000000000..00239bc7e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/ViewTaskProductSummary.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.task; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 生产任务单明细 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_view_task_product_summary") +@KeySequence("mes_view_task_product_summary_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ViewTaskProductSummary { + + /** + * 产品ID + */ + private Long productId; + /** + * 产品ID + */ + private String productName; + /** + * task ID + */ + private Long taskId; + /** + * task ID + */ + private String taskCode; + /** + * 数量 + */ + private Long totalNumber; + /** + * 计划数量 + */ + private Long planNumber; +} \ 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 index bb593effc..09b24e2cb 100644 --- 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 @@ -1,12 +1,17 @@ package cn.iocoder.yudao.module.mes.dal.mysql.plan; +import java.math.BigDecimal; import java.util.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; 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.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; @@ -40,4 +45,18 @@ public interface PlanMapper extends BaseMapperX { default PlanDO selectByNo(String no) { return selectOne(PlanDO::getCode, no); } + + default Long selectSum(Long taskId, Long productId, ListstatusList) { + // SQL sum 查询 + List> result = selectMaps(new QueryWrapper() + .select("SUM(plan_number) AS sumCount") + .in(statusList!=null&&statusList.size()>0,"status", statusList) + .eq(taskId!=null,"task_id", taskId) + .eq(productId!=null,"product_id", productId)); + // 获得数量 + if (CollUtil.isEmpty(result)) { + return 0L; + } + return MapUtil.getLong(result.get(0), "sumCount", 0L); + } } \ 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 index e55779522..9a9b195cc 100644 --- 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 @@ -1,12 +1,19 @@ package cn.iocoder.yudao.module.mes.dal.mysql.task; +import java.math.BigDecimal; import java.util.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; 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.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailSumResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; /** @@ -29,5 +36,5 @@ public interface TaskDetailMapper extends BaseMapperX { .eq(TaskDetailDO::getTaskId, taskId) .orderByDesc(TaskDetailDO::getId)); } - + public List selectSumListByTaskId(Long taskId); } \ 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 index aa7d3b026..dba761d18 100644 --- 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 @@ -5,6 +5,7 @@ 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.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; import org.apache.ibatis.annotations.Mapper; @@ -29,7 +30,26 @@ public interface TaskMapper extends BaseMapperX { .betweenIfPresent(TaskDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(TaskDO::getId)); } + default PageResult selectPage2(TaskPageReqVO reqVO) { + List statusList = new ArrayList<>(); + statusList.add(TaskStatusEnum.下达.getValue()); + statusList.add(TaskStatusEnum.计划.getValue()); + statusList.add(TaskStatusEnum.开工.getValue()); + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(TaskDO::getCode, reqVO.getCode()) + .betweenIfPresent(TaskDO::getOrderDate, reqVO.getOrderDate()) + .betweenIfPresent(TaskDO::getDeliveryDate, reqVO.getDeliveryDate()) + .inIfPresent(TaskDO::getStatus,statusList) + .eqIfPresent(TaskDO::getProcessInstanceId, reqVO.getProcessInstanceId()) + .eqIfPresent(TaskDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TaskDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TaskDO::getId)); + } default TaskDO selectByNo(String no) { return selectOne(TaskDO::getCode, no); } + + default List selectList(List status) { + return selectList(TaskDO::getStatus, status); + } } \ 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/ViewTaskProductSummaryMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/ViewTaskProductSummaryMapper.java new file mode 100644 index 000000000..f7c857f9c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/task/ViewTaskProductSummaryMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.task; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailSumResult; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.ViewTaskProductSummary; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 生产任务单明细 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface ViewTaskProductSummaryMapper extends BaseMapperX { + + default List selectListByTaskId(Long taskId) { + return selectList(ViewTaskProductSummary::getTaskId, taskId); + } + + default int deleteByTaskId(Long taskId) { + return delete(ViewTaskProductSummary::getTaskId, taskId); + } + default PageResult selectPage(PageParam reqVO, Long taskId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(ViewTaskProductSummary::getTaskId, taskId) + .orderByDesc(ViewTaskProductSummary::getTaskId)); + } + public List selectSumListByTaskId(Long taskId); +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java index e1029baf2..6e14c96a2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java @@ -5,10 +5,13 @@ import java.util.*; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; 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.module.mes.dal.dataobject.task.ViewTaskProductSummary; +import cn.iocoder.yudao.module.mes.service.plan.PlanServiceImpl; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import javax.validation.Valid; @@ -70,9 +73,15 @@ public interface TaskService { * @return 生产任务单分页 */ PageResult getTaskPage(TaskPageReqVO pageReqVO); - + /** + * 获得生产任务单分页 + * + * @param pageReqVO 分页查询 + * @return 生产任务单分页 + */ + PageResult getTaskPage2(TaskPageReqVO pageReqVO); // ==================== 子表(生产任务单明细) ==================== - + List selectList(List status); /** * 获得生产任务单明细列表 * @@ -89,7 +98,7 @@ public interface TaskService { * @return 生产任务单明细分页 */ PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId); - + List getTaskProductSummaryList(Long taskId); /** * 创建生产任务单明细 * @@ -119,5 +128,12 @@ public interface TaskService { * @return 生产任务单明细 */ TaskDetailDO getTaskDetail(Long id); - + /** + * 根据生产任务单以及选定明细,生成生产计划 + * @param taskId 任务单编号 + * @param sizeOfPlan 生成的计划数 + * @param productsOfPlan 每个计划的产品数 + * @return 生产任务单明细 + */ + List generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan); } \ 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 index 8c6a33dd4..3bfc63627 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -6,7 +6,13 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailSumResult; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.ViewTaskProductSummary; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.task.ViewTaskProductSummaryMapper; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -113,9 +119,15 @@ public class TaskServiceImpl implements TaskService { public PageResult getTaskPage(TaskPageReqVO pageReqVO) { return taskMapper.selectPage(pageReqVO); } - + @Override + public PageResult getTaskPage2(TaskPageReqVO pageReqVO) { + return taskMapper.selectPage2(pageReqVO); + } // ==================== 子表(生产任务单明细) ==================== - + @Override + public List selectList(List status){ + return taskMapper.selectList(status); + } @Override public List getTaskDetailListByTaskId(Long taskId) { return taskDetailMapper.selectListByTaskId(taskId); @@ -141,11 +153,26 @@ public class TaskServiceImpl implements TaskService { private ErpProductService productService; @Resource private ErpProductUnitService productUnitService; + @Resource + private ViewTaskProductSummaryMapper summaryMapper; + @Resource + private PlanMapper planMapper; @Override public PageResult getTaskDetailPage(PageParam pageReqVO, Long taskId) { PageResult pageResult = taskDetailMapper.selectPage(pageReqVO, taskId); return new PageResult<>(buildDetailVOList(pageResult.getList()), pageResult.getTotal()); } + @Override + public List getTaskProductSummaryList(Long taskId) { +// List resultList = taskDetailMapper.selectSumListByTaskId(taskId); +// System.out.println(Arrays.toString(resultList.toArray())); + List summaryList = summaryMapper.selectListByTaskId(taskId); + for (ViewTaskProductSummary summary:summaryList) { + Long planTotalNumber = planMapper.selectSum(summary.getTaskId(),summary.getProductId(),null); + summary.setPlanNumber(planTotalNumber); + } + return summaryList; + } private List buildDetailVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); @@ -196,5 +223,10 @@ public class TaskServiceImpl implements TaskService { } + @Override + public List generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan) { + return null; + } + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml new file mode 100644 index 000000000..2d3a3505e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, product_id, unit_id, task_id, `number`, package_size, project_name, + tech_requirements, remark, is_enable, creator, create_time, updater, update_time, + deleted, tenant_id, package_number, finish_date, boxing_date, arrive_date, + bar_code, attachment, sale_order_code + + + + + \ 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/bom/BomServiceImplTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImplTest.java index 8a8201c0f..167885f69 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImplTest.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.bom; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -32,7 +33,7 @@ import static org.mockito.Mockito.*; * @author 内蒙必硕 */ @Import(BomServiceImpl.class) -public class BomServiceImplTest extends BaseDbUnitTest { +public class BomServiceImplTest extends BaseDbAndRedisUnitTest { @Resource private BomServiceImpl bomService; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/MapperTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/MapperTest.java new file mode 100644 index 000000000..8005c28f5 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/task/MapperTest.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.service.task; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailSumResult; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskDetailMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; +import cn.iocoder.yudao.module.mes.service.machine.MachineComponentServiceImpl; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link TaskServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(MachineComponentServiceImpl.class) +public class MapperTest extends BaseDbUnitTest { + + @Resource + private TaskMapper taskMapper; + @Resource + private TaskDetailMapper taskDetailMapper; + + @Test + public void testCreateTask_success() { + List list = taskDetailMapper.selectSumListByTaskId(94L); + // 断言 + assertNotNull(list); + // 校验记录的属性是否正确 + System.out.println(list.size()); + } + + +} \ No newline at end of file diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 0f0e5d503..e4a69ed74 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -238,6 +238,7 @@ yudao: - tmp_report_data_income - iot_gateway - iot_mqtt_record + - mes_view_task_product_summary sms-code: # 短信验证码相关的配置项 expire-times: 10m send-frequency: 1m