From a8fb7cd2623341ed1c5f09d2e0dc0c98fa534d55 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 17 Apr 2026 17:47:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=8A=A5=E8=A1=A8=E7=9B=B8=E5=85=B3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/product/ErpProductController.java | 2 +- .../vo/product/ErpProductListReqVO.java | 26 +++++ .../product/vo/product/ErpProductRespVO.java | 2 +- .../dal/mysql/product/ErpProductMapper.java | 13 ++- .../service/product/ErpProductService.java | 1 + .../product/ErpProductServiceImpl.java | 1 - .../module/iot/enums/ErrorCodeConstants.java | 2 - .../module/mes/enums/ErrorCodeConstants.java | 2 +- .../vo/BaogongRecordPageReqVO.java | 5 +- .../vo/BaogongRecordStatPageReqVO.java | 3 + .../controller/admin/bom/BomController.java | 7 +- .../admin/dashboard/DashboardController.java | 16 ++++ .../controller/admin/plan/PlanController.java | 22 +++++ .../admin/plan/vo/PlanTaskPageReqVO.java | 20 ++++ .../admin/plan/vo/PlanTaskPageRespVO.java | 50 ++++++++++ .../planrecord/PlanRecordController.java | 95 +++++++++++++++++++ .../planrecord/vo/PlanRecordPageReqVO.java | 41 ++++++++ .../admin/planrecord/vo/PlanRecordRespVO.java | 47 +++++++++ .../planrecord/vo/PlanRecordSaveReqVO.java | 33 +++++++ .../admin/task/vo/TaskStatusEnum.java | 2 + .../admin/zjtask/ZjTaskController.java | 66 ++++++++++++- .../vo/ZjTaskQueryByTicketPageReqVO.java | 60 ++++++++++++ .../zjtask/vo/ZjTaskWithResultsRespVO.java | 17 ++++ .../dataobject/planrecord/PlanRecordDO.java | 56 +++++++++++ .../mes/dal/mysql/bom/BomDetailMapper.java | 9 +- .../module/mes/dal/mysql/bom/BomMapper.java | 11 ++- .../mysql/planrecord/PlanRecordMapper.java | 32 +++++++ .../mes/dal/mysql/zjtask/ZjTaskMapper.java | 20 +++- .../zjtaskresults/ZjTaskResultsMapper.java | 8 +- .../module/mes/service/bom/BomService.java | 4 +- .../mes/service/bom/BomServiceImpl.java | 15 ++- .../module/mes/service/plan/PlanService.java | 4 +- .../mes/service/plan/PlanServiceImpl.java | 66 ++++++++++++- .../service/planrecord/PlanRecordService.java | 56 +++++++++++ .../planrecord/PlanRecordServiceImpl.java | 75 +++++++++++++++ .../mes/service/zjtask/ZjTaskService.java | 4 +- .../mes/service/zjtask/ZjTaskServiceImpl.java | 11 ++- .../zjtaskresults/ZjTaskResultsService.java | 4 +- .../ZjTaskResultsServiceImpl.java | 10 +- .../baogongrecord/BaogongRecordMapper.xml | 3 + .../mapper/planrecord/PlanRecordMapper.xml | 12 +++ 41 files changed, 907 insertions(+), 26 deletions(-) create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductListReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/PlanRecordController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskQueryByTicketPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskWithResultsRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planrecord/PlanRecordDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planrecord/PlanRecordMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/planrecord/PlanRecordMapper.xml diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java index cee37efc8..e264000d8 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java @@ -246,4 +246,4 @@ public class ErpProductController { return success(true); // s } -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductListReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductListReqVO.java new file mode 100644 index 000000000..8110383b5 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductListReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.erp.controller.admin.product.vo.product; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - ERP 产品列表 Request VO") +@Data +public class ErpProductListReqVO { + + @Schema(description = "产品名称", example = "零件A") + private String name; + + @Schema(description = "产品分类编号", example = "11161") + private Long categoryId; + + @Schema(description = "产品编号", example = "11161") + private String code; + + @Schema(description = "产品规格", example = "红色") + private String standard; + + @Schema(description = "产品 id 集合") + private List ids; +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java index 8c4ff71d6..939a4c61b 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java @@ -105,4 +105,4 @@ public class ErpProductRespVO extends ErpProductDO { @Schema(description = "关联模具列表") private List molds; -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java index 002757b85..604cea91e 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 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.controller.admin.product.vo.product.ErpProductListReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductRelationRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; @@ -35,6 +36,16 @@ public interface ErpProductMapper extends BaseMapperX { .orderByDesc(ErpProductDO::getId)); } + default List selectList(ErpProductListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(ErpProductDO::getId, reqVO.getIds()) + .likeIfPresent(ErpProductDO::getName, reqVO.getName()) + .likeIfPresent(ErpProductDO::getBarCode, reqVO.getCode()) + .eqIfPresent(ErpProductDO::getCategoryId, reqVO.getCategoryId()) + .likeIfPresent(ErpProductDO::getStandard, reqVO.getStandard()) + .orderByDesc(ErpProductDO::getId)); + } + default PageResult selectProductCodeExist(ErpProductPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(ErpProductDO::getName, reqVO.getName()) @@ -92,4 +103,4 @@ public interface ErpProductMapper extends BaseMapperX { List selectMoldsByProductId(@Param("productId") Long productId); -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java index 05dd5daa0..f690778b8 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.erp.service.product; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductImportExcelVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductImportRespVO; +import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductListReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO; diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java index 188a874b1..35f9facb2 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java @@ -26,7 +26,6 @@ import cn.iocoder.yudao.module.erp.dal.mysql.productdevicerel.ProductDeviceRelMa import cn.iocoder.yudao.module.erp.dal.mysql.productmoldrel.ProductMoldRelMapper; import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMapper; import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java index 81f57e0f2..6fbfb9a98 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java @@ -86,6 +86,4 @@ public interface ErrorCodeConstants { ErrorCode TABLE_CREATION_FAILED = new ErrorCode(1_004_000_008, "TDengine 表创建失败"); ErrorCode COLOUMN_CREATION_FAILED = new ErrorCode(1_004_000_008, "TDengine 列创建失败"); ErrorCode COLUMN_RENAME_FAILED = new ErrorCode(1_004_000_008, "列名修改失败"); - - } 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 98ee039a4..f66970dd0 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 @@ -193,7 +193,7 @@ public interface ErrorCodeConstants { ErrorCode SCHEDULE_TIME_RANGE_INVALID = new ErrorCode(100_301_0013, "排产时间范围非法,start={}, end={},结束时间必须晚于开始时间"); ErrorCode SCHEDULE_WORK_HOURS_INVALID = new ErrorCode(100_301_0014, "排产工时非法,start={}, end={},可用工时必须大于0"); ErrorCode WAREHOUSE_NOT_EXISTS= new ErrorCode(100_301_0014, "仓库Id不能为空"); - + ErrorCode PLAN_RECORD_NOT_EXISTS = new ErrorCode(100_301_0015, "生产计划操作记录不存在"); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordPageReqVO.java index 05212746a..2b0798004 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordPageReqVO.java @@ -19,6 +19,9 @@ public class BaogongRecordPageReqVO extends PageParam { @Schema(description = "关联计划id", example = "3326") private Long planId; + @Schema(description = "任务单ID", example = "18331") + private Long taskId; + @Schema(description = "派工数量") private Long num; @@ -38,4 +41,4 @@ public class BaogongRecordPageReqVO extends PageParam { @Schema(description = "原因") private String remark; -} \ 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/baogongrecord/vo/BaogongRecordStatPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordStatPageReqVO.java index ea4141737..59bf3d97d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordStatPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/vo/BaogongRecordStatPageReqVO.java @@ -27,4 +27,7 @@ public class BaogongRecordStatPageReqVO extends PageParam { @Schema(description = "报工记录ID集合(用于多选导出)") private List ids; + + @Schema(description = "任务单Id") + private Long taskId ; } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/bom/BomController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/bom/BomController.java index e6df59d6e..f50b9a601 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/bom/BomController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/bom/BomController.java @@ -83,9 +83,8 @@ public class BomController { @Operation(summary = "获得产品BOM") @Parameter(name = "productId", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:bom:query')") - public CommonResult getByProductId(@RequestParam("id") Long id) { - BomDO bom = bomService.getBom(id); - return success(BeanUtils.toBean(bom, BomRespVO.class)); + public CommonResult> getByProductId(@RequestParam("productId") Long productId) { + return success(bomService.getBomDetailRespListByProductId(productId)); } @GetMapping("/page") @@ -119,4 +118,4 @@ public class BomController { return success(bomService.getBomDetailListByBomId(bomId)); } -} \ 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/dashboard/DashboardController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java index b20bf55d2..8fc9cce98 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.TaskVO; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.common.dal.dataobject.moldrepair.MoldRepairDO; @@ -54,6 +55,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -126,6 +128,10 @@ public class DashboardController { TaskRespVO taskRespVO = new TaskRespVO(); List taskItems = new ArrayList<>(); List planItems = new ArrayList<>(); + Map taskStatusCountMap = taskMapper.selectList(new LambdaQueryWrapperX() + .betweenIfPresent(TaskDO::getOrderDate, taskReqVO.getStartTime())) + .stream() + .collect(Collectors.groupingBy(TaskDO::getStatus, Collectors.counting())); // 生产任务总数 TaskRespVO.Item item = new TaskRespVO.Item(); item.setKey("1"); @@ -166,6 +172,8 @@ public class DashboardController { .in(TaskDO::getStatus, count3) .betweenIfPresent(TaskDO::getOrderDate, taskReqVO.getStartTime()))); taskItems.add(item); + + // 生产计划总数 item = new TaskRespVO.Item(); item.setKey("5"); @@ -233,6 +241,14 @@ public class DashboardController { item.setValue(passRate); planItems.add(item); + for (TaskStatusEnum taskStatusEnum : TaskStatusEnum.values()) { + item = new TaskRespVO.Item(); + item.setKey(String.valueOf(taskStatusEnum.getValue())); + item.setLabel(taskStatusEnum.name()); + item.setValue(taskStatusCountMap.getOrDefault(taskStatusEnum.getValue(), 0L)); + taskItems.add(item); + } + taskRespVO.setTaskItems(taskItems); taskRespVO.setPlanItems(planItems); return success(taskRespVO); 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 index 5c1c6690c..dbd591566 100644 --- 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 @@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.planrecord.PlanRecordDO; 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.dal.dataobject.zjproduct.ZjProductDO; @@ -34,6 +35,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.bom.BomDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.bom.BomMapper; import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.planrecord.PlanRecordMapper; import cn.iocoder.yudao.module.mes.service.bom.BomService; import cn.iocoder.yudao.module.mes.service.deviceledger.DeviceLedgerService; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemAnalysisService; @@ -106,6 +108,9 @@ public class PlanController { @Resource private BomDetailMapper bomDetailMapper; + @Resource + private PlanRecordMapper planRecordMapper; + @Resource private TaskService taskService; @@ -204,6 +209,13 @@ public class PlanController { return success(new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal())); } + @GetMapping("/page-by-task") + @Operation(summary = "根据任务单ID获得该任务下所有计划分页") + @PreAuthorize("@ss.hasPermission('mes:plan:query')") + public CommonResult> getPlanPageByTaskId(@Valid PlanTaskPageReqVO pageReqVO) { + return success(planService.getPlanPageByTaskId(pageReqVO)); + } + private List buildVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); @@ -301,6 +313,11 @@ public class PlanController { String code = statusUpdateVO.getCode(); + PlanRecordDO planRecordDO = new PlanRecordDO(); + planRecordDO.setTaskId(planDO.getTaskId()); + planRecordDO.setPlanId(planDO.getId()); + planRecordDO.setOperateTime(LocalDateTime.now()); + // 1) 先处理计划状态 if ("pre".equals(code)) { planDO.setStatus(PlanStatusEnum.试产.getValue()); @@ -308,17 +325,22 @@ public class PlanController { planDO.setStatus(PlanStatusEnum.量产.getValue()); } else if ("pause".equals(code)) { planDO.setStatus(PlanStatusEnum.暂停.getValue()); + planRecordDO.setOperateStatus(PlanStatusEnum.暂停.getValue()); } else if ("end".equals(code)) { planDO.setStatus(PlanStatusEnum.完工.getValue()); + planRecordDO.setOperateStatus(PlanStatusEnum.完工.getValue()); } else if ("store".equals(code)) { if (statusUpdateVO.getWarehouseId() ==null ){ throw exception(WAREHOUSE_NOT_EXISTS); } planDO.setStatus(PlanStatusEnum.已入库.getValue()); + planRecordDO.setOperateStatus(PlanStatusEnum.已入库.getValue()); } else if ("commence".equals(code)) { + planRecordDO.setOperateStatus(PlanStatusEnum.已开工.getValue()); planDO.setStatus(PlanStatusEnum.已开工.getValue()); } + planRecordMapper.insert(planRecordDO); // 2) 先落库计划状态(store 最后一条判断依赖这个) planMapper.updateById(planDO); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageReqVO.java new file mode 100644 index 000000000..575e745e7 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 按任务单查询生产计划分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PlanTaskPageReqVO extends PageParam { + + @Schema(description = "任务单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18331") + @NotNull(message = "任务单ID不能为空") + private Long taskId; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageRespVO.java new file mode 100644 index 000000000..1704ee4f1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanTaskPageRespVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.mes.controller.admin.plan.vo; + +import cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo.PlanRecordRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 按任务单查询生产计划分页 Response VO") +@Data +public class PlanTaskPageRespVO { + + @Schema(description = "计划单ID", example = "17689") + private Long id; + + @Schema(description = "产品名称") + private String productName; + + @Schema(description = "设备名称") + private String deviceName; + + @Schema(description = "计划数量") + private Long planNumber; + + @Schema(description = "完工数量") + private Long wangongNumber; + + @Schema(description = "合格数量") + private Long passNumber; + + @Schema(description = "不合格数量") + private Long noPassNumber; + + @Schema(description = "合格率") + private BigDecimal passRate; + + @Schema(description = "计划开始时间") + private LocalDateTime planStartTime; + + @Schema(description = "计划结束时间") + private LocalDateTime planEndTime; + + @Schema(description = "最晚开工时间") + private LocalDateTime latestStartTime; + + @Schema(description = "计划记录集合,按 operateTime 升序") + private List planRecordList; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/PlanRecordController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/PlanRecordController.java new file mode 100644 index 000000000..62b2f3acb --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/PlanRecordController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.mes.controller.admin.planrecord; + +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.planrecord.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.planrecord.PlanRecordDO; +import cn.iocoder.yudao.module.mes.service.planrecord.PlanRecordService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - 生产计划操作记录") +@RestController +@RequestMapping("/mes/plan-record") +@Validated +public class PlanRecordController { + + @Resource + private PlanRecordService planRecordService; + + @PostMapping("/create") + @Operation(summary = "创建生产计划操作记录") + @PreAuthorize("@ss.hasPermission('mes:plan-record:create')") + public CommonResult createPlanRecord(@Valid @RequestBody PlanRecordSaveReqVO createReqVO) { + return success(planRecordService.createPlanRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新生产计划操作记录") + @PreAuthorize("@ss.hasPermission('mes:plan-record:update')") + public CommonResult updatePlanRecord(@Valid @RequestBody PlanRecordSaveReqVO updateReqVO) { + planRecordService.updatePlanRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产计划操作记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:plan-record:delete')") + public CommonResult deletePlanRecord(@RequestParam("id") Long id) { + planRecordService.deletePlanRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产计划操作记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:plan-record:query')") + public CommonResult getPlanRecord(@RequestParam("id") Long id) { + PlanRecordDO planRecord = planRecordService.getPlanRecord(id); + return success(BeanUtils.toBean(planRecord, PlanRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产计划操作记录分页") + @PreAuthorize("@ss.hasPermission('mes:plan-record:query')") + public CommonResult> getPlanRecordPage(@Valid PlanRecordPageReqVO pageReqVO) { + PageResult pageResult = planRecordService.getPlanRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PlanRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产计划操作记录 Excel") + @PreAuthorize("@ss.hasPermission('mes:plan-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportPlanRecordExcel(@Valid PlanRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = planRecordService.getPlanRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "生产计划操作记录.xls", "数据", PlanRecordRespVO.class, + BeanUtils.toBean(list, PlanRecordRespVO.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/planrecord/vo/PlanRecordPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordPageReqVO.java new file mode 100644 index 000000000..90ab80ff2 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordPageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.mes.controller.admin.planrecord.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 PlanRecordPageReqVO extends PageParam { + + @Schema(description = "任务单ID", example = "337") + private Long taskId; + + @Schema(description = "计划ID", example = "20904") + private Long planId; + + @Schema(description = "操作状态", example = "2") + private String operateStatus; + + @Schema(description = "操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] operateTime; + + @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/planrecord/vo/PlanRecordRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordRespVO.java new file mode 100644 index 000000000..33382b67c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +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 PlanRecordRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23003") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "任务单ID", example = "337") + @ExcelProperty("任务单ID") + private Long taskId; + + @Schema(description = "计划ID", example = "20904") + @ExcelProperty("计划ID") + private Long planId; + + @Schema(description = "操作状态", example = "2") + @ExcelProperty("操作状态") + private String operateStatus; + + @Schema(description = "操作时间") + @ExcelProperty("操作时间") + private LocalDateTime operateTime; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用") + @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/planrecord/vo/PlanRecordSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordSaveReqVO.java new file mode 100644 index 000000000..673b5a149 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planrecord/vo/PlanRecordSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 生产计划操作记录新增/修改 Request VO") +@Data +public class PlanRecordSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23003") + private Long id; + + @Schema(description = "任务单ID", example = "337") + private Long taskId; + + @Schema(description = "计划ID", example = "20904") + private Long planId; + + @Schema(description = "操作状态", example = "2") + private String operateStatus; + + @Schema(description = "操作时间") + private LocalDateTime operateTime; + + @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/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 index a0227730b..852246055 100644 --- 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 @@ -13,10 +13,12 @@ public enum TaskStatusEnum { 草稿(0), 送审(1), 下达(2), + //旧状态-弃用 已排产(3), 开工(4), 完工(5), 入库(6), + //新增状态 部分排产(7), 待生产(8), 生产中(9), diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/ZjTaskController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/ZjTaskController.java index f1691eca9..d006f93bf 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/ZjTaskController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/ZjTaskController.java @@ -1,7 +1,17 @@ package cn.iocoder.yudao.module.mes.controller.admin.zjtask; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.common.controller.admin.moldrepair.vo.MoldRepairRespVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.TicketManagementBatchUpdateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.zjtaskresults.vo.ZjTaskResultsRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.zjtaskresults.ZjTaskResultsDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.zjtype.ZjTypeDO; +import cn.iocoder.yudao.module.mes.service.zjtaskresults.ZjTaskResultsService; +import cn.iocoder.yudao.module.mes.service.zjtype.ZjTypeService; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -16,12 +26,14 @@ import javax.validation.*; import javax.servlet.http.*; import java.util.*; import java.io.IOException; +import java.util.stream.Collectors; 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 static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -40,6 +52,12 @@ public class ZjTaskController { @Resource private ZjTaskService zjTaskService; + @Resource + private ZjTaskResultsService zjTaskResultsService; + @Resource + private ZjTypeService zjTypeService; + @Resource + private ErpProductUnitService productUnitService; @PostMapping("/create") @Operation(summary = "创建质量管理-检验任务") @@ -82,6 +100,14 @@ public class ZjTaskController { return success(BeanUtils.toBean(pageResult, ZjTaskRespVO.class)); } + @GetMapping("/page-by-ticket") + @Operation(summary = "根据任务单 id 获得质检任务分页,附带检验结果字段") + @PreAuthorize("@ss.hasPermission('mes:zj-task:query')") + public CommonResult> getZjTaskPageByTicket(@Valid ZjTaskQueryByTicketPageReqVO pageReqVO) { + PageResult pageResult = zjTaskService.getZjTaskPageByTicket(pageReqVO); + return success(new PageResult<>(buildTaskWithResultsVOList(pageResult.getList()), pageResult.getTotal())); + } + @GetMapping("/list") @Operation(summary = "获得质量管理-检验任务列表") @@ -129,6 +155,44 @@ public class ZjTaskController { return success(true); } + private List buildTaskWithResultsVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + + List taskResults = zjTaskResultsService.getTaskResultsByTaskIds(convertSet(list, ZjTaskDO::getId)); + Map> taskResultsMap = buildTaskResultsMap(taskResults); + + return BeanUtils.toBean(list, ZjTaskWithResultsRespVO.class, item -> { + item.setResults(taskResultsMap.getOrDefault(item.getId(), Collections.emptyList())); + }); + } + + private Map> buildTaskResultsMap(List taskResults) { + if (CollUtil.isEmpty(taskResults)) { + return Collections.emptyMap(); + } + + Map zjTypeMap = zjTypeService.getZjTypeVOMap(convertSet(taskResults, ZjTaskResultsDO::getZjType)); + List unitDOList = productUnitService.getProductUnitListByStatus(CommonStatusEnum.ENABLE.getStatus()); + Map unitNameMap = unitDOList.stream() + .collect(Collectors.toMap(unit -> String.valueOf(unit.getId()), ErpProductUnitDO::getName, (first, second) -> first)); + + Map> result = new HashMap<>(); + for (ZjTaskResultsDO taskResult : taskResults) { + if (taskResult.getTaskId() == null) { + continue; + } + ZjTaskResultsRespVO respVO = BeanUtils.toBean(taskResult, ZjTaskResultsRespVO.class); + MapUtils.findAndThen(zjTypeMap, taskResult.getZjType(), zjType -> respVO.setZjTypeName(zjType.getName())); + if (taskResult.getUnit() != null) { + respVO.setUnitName(unitNameMap.getOrDefault(taskResult.getUnit(), "")); + } + result.computeIfAbsent(taskResult.getTaskId(), key -> new ArrayList<>()).add(respVO); + } + return result; + } + -} \ 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/zjtask/vo/ZjTaskQueryByTicketPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskQueryByTicketPageReqVO.java new file mode 100644 index 000000000..48dcad6b5 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskQueryByTicketPageReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.zjtask.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 质检任务按任务单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ZjTaskQueryByTicketPageReqVO extends PageParam { + + @Schema(description = "任务单 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long ticket; + + @Schema(description = "任务名称") + private String name; + + @Schema(description = "质检分类") + private String type; + + @Schema(description = "检验方案 id") + private Long schemaId; + + @Schema(description = "检验方案名称") + private String schemaName; + + @Schema(description = "负责人 id") + private Long managerId; + + @Schema(description = "负责人名称") + private String managerName; + + @Schema(description = "执行人 id") + private Long executorId; + + @Schema(description = "执行人名称") + private String executorName; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "结果") + private String result; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "执行时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] executeTime; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskWithResultsRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskWithResultsRespVO.java new file mode 100644 index 000000000..ed7482a6c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/zjtask/vo/ZjTaskWithResultsRespVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.mes.controller.admin.zjtask.vo; + +import cn.iocoder.yudao.module.mes.controller.admin.zjtaskresults.vo.ZjTaskResultsRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Schema(description = "管理后台 - 质检任务带结果列表 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ZjTaskWithResultsRespVO extends ZjTaskRespVO { + + @Schema(description = "检验项结果列表") + private List results; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planrecord/PlanRecordDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planrecord/PlanRecordDO.java new file mode 100644 index 000000000..4dc64a351 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planrecord/PlanRecordDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.planrecord; + +import lombok.*; +import java.util.*; +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_record") +@KeySequence("mes_plan_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PlanRecordDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 任务单ID + */ + private Long taskId; + /** + * 计划ID + */ + private Long planId; + /** + * 操作状态 + */ + private Integer operateStatus; + /** + * 操作时间 + */ + private LocalDateTime operateTime; + /** + * 备注 + */ + 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/bom/BomDetailMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomDetailMapper.java index c5cc38fad..7dfd3d019 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomDetailMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomDetailMapper.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.mes.dal.mysql.bom; 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.bom.BomDetailDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -18,8 +20,13 @@ public interface BomDetailMapper extends BaseMapperX { return selectList(BomDetailDO::getBomId, bomId); } + default List selectListByBomIds(Collection bomIds) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(BomDetailDO::getBomId, bomIds)); + } + default int deleteByBomId(Long bomId) { return delete(BomDetailDO::getBomId, bomId); } -} \ 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/bom/BomMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java index d436adf0c..e2ff98655 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/bom/BomMapper.java @@ -7,6 +7,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.bom.vo.BomPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.bom.BomDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; +import java.util.List; + /** * 产品BOM Mapper * @@ -42,4 +45,10 @@ public interface BomMapper extends BaseMapperX { return selectOne(BomDO::getProductId, productId, BomDO::getIsEnable, true); } -} \ No newline at end of file + + default List selectListByProductIds(Collection productIds) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(BomDO::getProductId, productIds) + .eq(BomDO::getIsEnable, true)); + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planrecord/PlanRecordMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planrecord/PlanRecordMapper.java new file mode 100644 index 000000000..f91d3503a --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planrecord/PlanRecordMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.planrecord; + +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.planrecord.PlanRecordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo.*; + +/** + * 生产计划操作记录 Mapper + * + * @author 必硕智能 + */ +@Mapper +public interface PlanRecordMapper extends BaseMapperX { + + default PageResult selectPage(PlanRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(PlanRecordDO::getTaskId, reqVO.getTaskId()) + .eqIfPresent(PlanRecordDO::getPlanId, reqVO.getPlanId()) + .eqIfPresent(PlanRecordDO::getOperateStatus, reqVO.getOperateStatus()) + .betweenIfPresent(PlanRecordDO::getOperateTime, reqVO.getOperateTime()) + .eqIfPresent(PlanRecordDO::getRemark, reqVO.getRemark()) + .eqIfPresent(PlanRecordDO::getIsEnable, reqVO.getIsEnable()) + .betweenIfPresent(PlanRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(PlanRecordDO::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/zjtask/ZjTaskMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtask/ZjTaskMapper.java index be9a0f5f4..0d2bebb1d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtask/ZjTaskMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtask/ZjTaskMapper.java @@ -84,6 +84,24 @@ public interface ZjTaskMapper extends BaseMapperX { return selectList(wrapper); } + default PageResult selectPageByTicket(ZjTaskQueryByTicketPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ZjTaskDO::getTicket, reqVO.getTicket()) + .likeIfPresent(ZjTaskDO::getName, reqVO.getName()) + .eqIfPresent(ZjTaskDO::getType, reqVO.getType()) + .eqIfPresent(ZjTaskDO::getSchemaId, reqVO.getSchemaId()) + .likeIfPresent(ZjTaskDO::getSchemaName, reqVO.getSchemaName()) + .eqIfPresent(ZjTaskDO::getManagerId, reqVO.getManagerId()) + .likeIfPresent(ZjTaskDO::getManagerName, reqVO.getManagerName()) + .eqIfPresent(ZjTaskDO::getExecutorId, reqVO.getExecutorId()) + .likeIfPresent(ZjTaskDO::getExecutorName, reqVO.getExecutorName()) + .eqIfPresent(ZjTaskDO::getStatus, reqVO.getStatus()) + .eqIfPresent(ZjTaskDO::getResult, reqVO.getResult()) + .betweenIfPresent(ZjTaskDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(ZjTaskDO::getExecuteTime, reqVO.getExecuteTime()) + .orderByDesc(ZjTaskDO::getId)); + } + /** * 批量更新作业状态 * @@ -95,4 +113,4 @@ public interface ZjTaskMapper extends BaseMapperX { @Param("status") Integer status, @Param("cancelReason") String cancelReason); -} \ 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/zjtaskresults/ZjTaskResultsMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtaskresults/ZjTaskResultsMapper.java index 50d237cae..389ea26dd 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtaskresults/ZjTaskResultsMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/zjtaskresults/ZjTaskResultsMapper.java @@ -36,4 +36,10 @@ public interface ZjTaskResultsMapper extends BaseMapperX { .orderByDesc(ZjTaskResultsDO::getId)); } -} \ No newline at end of file + default List selectListByTaskIds(Collection taskIds) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(ZjTaskResultsDO::getTaskId, taskIds) + .orderByDesc(ZjTaskResultsDO::getId)); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java index 54cb4d414..1a3d9ba04 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomService.java @@ -66,6 +66,8 @@ public interface BomService { */ List getBomDetailListByBomId(Long bomId); + List getBomDetailRespListByProductId(Long productId); + /** * 获得产品需求明细列表 * @@ -83,4 +85,4 @@ public interface BomService { List getBomDetailListByProductId(Long productId, Long number); BomDO selectByProductId(Long productId); -} \ 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/bom/BomServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java index ce480710f..b5b59a4cb 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java @@ -161,6 +161,19 @@ public class BomServiceImpl implements BomService { return buildDetailVOList(list); } + @Override + public List getBomDetailRespListByProductId(Long productId) { + if (productId == null) { + return Collections.emptyList(); + } + BomDO bomDO = bomMapper.selectByProductId(productId); + if (bomDO == null || bomDO.getId() == null) { + return Collections.emptyList(); + } + List list = bomDetailMapper.selectListByBomId(bomDO.getId()); + return buildDetailVOList(list); + } + @Override public List getBomDetailListByProductId(Long productId) { BomDO bomDO = bomMapper.selectByProductId(productId); @@ -227,4 +240,4 @@ public class BomServiceImpl implements BomService { bomDetailMapper.deleteByBomId(bomId); } -} \ 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 index b98b10078..1438134ce 100644 --- 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 @@ -61,6 +61,8 @@ public interface PlanService { */ PageResult getPlanPage(PlanPageReqVO pageReqVO); + PageResult getPlanPageByTaskId(PlanTaskPageReqVO pageReqVO); + /** * 查询按日期排序最后一个未完成(已经下达)的计划 **/ @@ -110,4 +112,4 @@ public interface PlanService { List getDevicePlanGantt(DevicePlanGanttReqVO reqVO); -} \ 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 index f5b84f253..43c584c3c 100644 --- 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 @@ -19,17 +19,20 @@ import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; +import cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo.PlanRecordRespVO; import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.paigongrecord.PaigongRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.planrecord.PlanRecordDO; 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.dal.mysql.deviceledger.DeviceLedgerMapper; import cn.iocoder.yudao.module.mes.dal.mysql.paigongrecord.PaigongRecordMapper; import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.planrecord.PlanRecordMapper; import cn.iocoder.yudao.module.mes.dal.mysql.stockindetail.StockInDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; @@ -43,6 +46,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import io.swagger.v3.oas.annotations.media.Schema; import lombok.extern.slf4j.Slf4j; @@ -114,6 +118,10 @@ public class PlanServiceImpl implements PlanService { @Lazy private TaskMapper taskMapper; + @Resource + private PlanRecordMapper planRecordMapper; + + @Override @Transactional(rollbackFor = Exception.class) @@ -172,7 +180,13 @@ public class PlanServiceImpl implements PlanService { plan.setStartTime(LocalDateTime.now()); plan.setRequisitionId(id); planMapper.insert(plan); - + //添加计划操作记录 + PlanRecordDO planRecordDO = new PlanRecordDO(); + planRecordDO.setTaskId(plan.getTaskId()); + planRecordDO.setPlanId(plan.getId()); + planRecordDO.setOperateTime(LocalDateTime.now()); + planRecordDO.setOperateStatus(PlanStatusEnum.已排产.getValue()); + planRecordMapper.insert(planRecordDO); //判断计划是否全部完成 //查询任务明细总需求 @@ -399,6 +413,54 @@ public class PlanServiceImpl implements PlanService { return new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal()); } + @Override + public PageResult getPlanPageByTaskId(PlanTaskPageReqVO pageReqVO) { + Page mpPage = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + Page page = planMapper.selectPage(mpPage, Wrappers.lambdaQuery() + .eq(PlanDO::getTaskId, pageReqVO.getTaskId()) + .orderByDesc(PlanDO::getId)); + if (CollUtil.isEmpty(page.getRecords())) { + return new PageResult<>(Collections.emptyList(), page.getTotal()); + } + + Set productIds = page.getRecords().stream().map(PlanDO::getProductId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set deviceIds = page.getRecords().stream().map(PlanDO::getDeviceId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set planIds = page.getRecords().stream().map(PlanDO::getId).filter(Objects::nonNull).collect(Collectors.toSet()); + + Map productMap = erpProductService.getProductMap(productIds); + Map deviceMap = CollUtil.isEmpty(deviceIds) ? Collections.emptyMap() + : deviceLedgerMapper.selectBatchIds(deviceIds).stream().collect(Collectors.toMap(DeviceLedgerDO::getId, item -> item, (a, b) -> a)); + + List planRecords = planRecordMapper.selectList(Wrappers.lambdaQuery() + .in(PlanRecordDO::getPlanId, planIds) + .orderByAsc(PlanRecordDO::getOperateTime) + .orderByAsc(PlanRecordDO::getId)); + Map> planRecordMap = planRecords.stream() + .collect(Collectors.groupingBy(PlanRecordDO::getPlanId, LinkedHashMap::new, + Collectors.mapping(record -> BeanUtils.toBean(record, PlanRecordRespVO.class), Collectors.toList()))); + + List list = page.getRecords().stream().map(plan -> { + PlanTaskPageRespVO respVO = new PlanTaskPageRespVO(); + respVO.setId(plan.getId()); + ErpProductDO product = productMap.get(plan.getProductId()); + respVO.setProductName(product != null ? product.getName() : null); + DeviceLedgerDO device = deviceMap.get(plan.getDeviceId()); + respVO.setDeviceName(device != null ? device.getDeviceName() : null); + respVO.setPlanNumber(plan.getPlanNumber()); + respVO.setWangongNumber(plan.getWangongNumber()); + respVO.setPassNumber(plan.getPassNumber()); + respVO.setNoPassNumber(plan.getNoPassNumber()); + respVO.setPassRate(plan.getPassRate()); + respVO.setPlanStartTime(plan.getPlanStartTime()); + respVO.setPlanEndTime(plan.getPlanEndTime()); + respVO.setLatestStartTime(plan.getLatestStartTime()); + respVO.setPlanRecordList(planRecordMap.getOrDefault(plan.getId(), Collections.emptyList())); + return respVO; + }).collect(Collectors.toList()); + + return new PageResult<>(list, page.getTotal()); + } + @Resource private ErpProductService productService; @Resource @@ -653,4 +715,4 @@ public class PlanServiceImpl implements PlanService { -} \ 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/planrecord/PlanRecordService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordService.java new file mode 100644 index 000000000..14b4b46ab --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordService.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.service.planrecord; + +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.planrecord.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.planrecord.PlanRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * 生产计划操作记录 Service 接口 + * + * @author 必硕智能 + */ +public interface PlanRecordService { + + /** + * 创建生产计划操作记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPlanRecord(@Valid PlanRecordSaveReqVO createReqVO); + + /** + * 更新生产计划操作记录 + * + * @param updateReqVO 更新信息 + */ + void updatePlanRecord(@Valid PlanRecordSaveReqVO updateReqVO); + + /** + * 删除生产计划操作记录 + * + * @param id 编号 + */ + void deletePlanRecord(Long id); + + /** + * 获得生产计划操作记录 + * + * @param id 编号 + * @return 生产计划操作记录 + */ + PlanRecordDO getPlanRecord(Long id); + + /** + * 获得生产计划操作记录分页 + * + * @param pageReqVO 分页查询 + * @return 生产计划操作记录分页 + */ + PageResult getPlanRecordPage(PlanRecordPageReqVO 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/planrecord/PlanRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordServiceImpl.java new file mode 100644 index 000000000..cbd05942c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planrecord/PlanRecordServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.service.planrecord; + +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.planrecord.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.planrecord.PlanRecordDO; +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.planrecord.PlanRecordMapper; + +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 PlanRecordServiceImpl implements PlanRecordService { + + @Resource + private PlanRecordMapper planRecordMapper; + + @Override + public Long createPlanRecord(PlanRecordSaveReqVO createReqVO) { + // 插入 + PlanRecordDO planRecord = BeanUtils.toBean(createReqVO, PlanRecordDO.class); + planRecordMapper.insert(planRecord); + // 返回 + return planRecord.getId(); + } + + @Override + public void updatePlanRecord(PlanRecordSaveReqVO updateReqVO) { + // 校验存在 + validatePlanRecordExists(updateReqVO.getId()); + // 更新 + PlanRecordDO updateObj = BeanUtils.toBean(updateReqVO, PlanRecordDO.class); + planRecordMapper.updateById(updateObj); + } + + @Override + public void deletePlanRecord(Long id) { + // 校验存在 + validatePlanRecordExists(id); + // 删除 + planRecordMapper.deleteById(id); + } + + private void validatePlanRecordExists(Long id) { + if (planRecordMapper.selectById(id) == null) { + throw exception(PLAN_RECORD_NOT_EXISTS); + } + } + + @Override + public PlanRecordDO getPlanRecord(Long id) { + return planRecordMapper.selectById(id); + } + + @Override + public PageResult getPlanRecordPage(PlanRecordPageReqVO pageReqVO) { + return planRecordMapper.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/zjtask/ZjTaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskService.java index 39a0cf168..9def4cba4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskService.java @@ -64,4 +64,6 @@ public interface ZjTaskService { void batchUpdateJobStatus(@Valid ZjTaskBatchUpdateReqVO reqVO); List getZjTaskList(@Valid ZjTaskPageReqVO pageReqVO); -} \ No newline at end of file + + PageResult getZjTaskPageByTicket(@Valid ZjTaskQueryByTicketPageReqVO pageReqVO); +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java index 433f2f894..1696574e7 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtask/ZjTaskServiceImpl.java @@ -213,6 +213,15 @@ public class ZjTaskServiceImpl implements ZjTaskService { }); } + @Override + public PageResult getZjTaskPageByTicket(ZjTaskQueryByTicketPageReqVO pageReqVO) { + PageResult pageResult = zjTaskMapper.selectPageByTicket(pageReqVO); + Map planMap = planService.getPlanMap(convertSet(pageResult.getList(), ZjTaskDO::getTicket)); + return BeanUtils.toBean(pageResult, ZjTaskDO.class, zjTaskDO -> { + MapUtils.findAndThen(planMap, zjTaskDO.getTicket(), planDO -> zjTaskDO.setTicketCode(planDO.getCode())); + }); + } + /** * 解析逗号分隔的ID字符串 @@ -230,4 +239,4 @@ public class ZjTaskServiceImpl implements ZjTaskService { .collect(Collectors.toList()); } -} \ 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/zjtaskresults/ZjTaskResultsService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsService.java index 21b8d724e..23f709abd 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsService.java @@ -52,9 +52,11 @@ public interface ZjTaskResultsService { */ PageResult getZjTaskResultsPage(ZjTaskResultsPageReqVO pageReqVO); + List getTaskResultsByTaskIds(Collection taskIds); + /** * 批量更新检验结果(仅更新zjResult和images字段) */ void batchUpdateZjTaskResults(List resultItems); -} \ 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/zjtaskresults/ZjTaskResultsServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsServiceImpl.java index d54cafcc5..d74971869 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/zjtaskresults/ZjTaskResultsServiceImpl.java @@ -71,6 +71,14 @@ public class ZjTaskResultsServiceImpl implements ZjTaskResultsService { return zjTaskResultsMapper.selectPage(pageReqVO); } + @Override + public List getTaskResultsByTaskIds(Collection taskIds) { + if (taskIds == null || taskIds.isEmpty()) { + return Collections.emptyList(); + } + return zjTaskResultsMapper.selectListByTaskIds(taskIds); + } + @Override @Transactional(rollbackFor = Exception.class) public void batchUpdateZjTaskResults(List resultItems) { @@ -85,4 +93,4 @@ public class ZjTaskResultsServiceImpl implements ZjTaskResultsService { } } -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/baogongrecord/BaogongRecordMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/baogongrecord/BaogongRecordMapper.xml index 8d1d2367a..26f0b1a83 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/baogongrecord/BaogongRecordMapper.xml +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/baogongrecord/BaogongRecordMapper.xml @@ -34,6 +34,9 @@ LEFT JOIN erp_product pr ON pr.id = p.product_id AND pr.deleted = b'0' LEFT JOIN system_users u ON u.id = CAST(r.creator AS UNSIGNED) WHERE r.deleted = b'0' + + AND t.id = #{reqVO.taskId} + AND r.baogong_time >= #{reqVO.beginBaogongTime} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/planrecord/PlanRecordMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/planrecord/PlanRecordMapper.xml new file mode 100644 index 000000000..edce75ebe --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/planrecord/PlanRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file