diff --git a/sql/mysql/mesdata.sql b/sql/mysql/mesdata.sql index 0c8a48666..df0af3a68 100644 --- a/sql/mysql/mesdata.sql +++ b/sql/mysql/mesdata.sql @@ -203,20 +203,20 @@ CREATE TABLE `mes_feeding_record` CREATE TABLE `mes_feeding_record_detail` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `record_id` bigint DEFAULT NULL COMMENT '记录id', - `item_id` bigint DEFAULT NULL COMMENT '原料id', - `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', - `unit_id` bigint DEFAULT NULL COMMENT '单位', - `user_id` bigint DEFAULT NULL COMMENT '记录人', - `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `record_id` bigint DEFAULT NULL COMMENT '记录id', + `item_id` bigint DEFAULT NULL COMMENT '原料id', + `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', + `unit_id` bigint DEFAULT NULL COMMENT '单位', + `user_id` bigint DEFAULT NULL COMMENT '记录人', + `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 @@ -226,25 +226,48 @@ CREATE TABLE `mes_feeding_record_detail` CREATE TABLE `mes_feeding_record_plan` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `record_id` bigint DEFAULT NULL COMMENT '记录id', - `record_detail_id` bigint DEFAULT NULL COMMENT '记录明细id', - `plan_id` bigint DEFAULT NULL COMMENT '计划id', - `item_id` bigint DEFAULT NULL COMMENT '原料id', - `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', - `unit_id` bigint DEFAULT NULL COMMENT '单位', - `user_id` bigint DEFAULT NULL COMMENT '记录人', - `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `record_id` bigint DEFAULT NULL COMMENT '记录id', + `record_detail_id` bigint DEFAULT NULL COMMENT '记录明细id', + `plan_id` bigint DEFAULT NULL COMMENT '计划id', + `item_id` bigint DEFAULT NULL COMMENT '原料id', + `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', + `unit_id` bigint DEFAULT NULL COMMENT '单位', + `user_id` bigint DEFAULT NULL COMMENT '记录人', + `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 2 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci + ROW_FORMAT = DYNAMIC COMMENT ='投料记录分配计划'; + + +CREATE TABLE `mes_error_record` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '标题', + `location` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '位置', + `exception` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '异常', + `pre_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '前数据', + `post_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '后数据', + + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci - ROW_FORMAT = DYNAMIC COMMENT ='投料记录分配计划'; \ No newline at end of file + ROW_FORMAT = DYNAMIC COMMENT ='错误记录'; diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderSaveReqVO.java index 78b4d2e0e..bac4b6d73 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderSaveReqVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderSaveReqVO.java @@ -16,14 +16,12 @@ public class ErpPurchaseOrderSaveReqVO { private Long id; @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1724") - @NotNull(message = "供应商编号不能为空") private Long supplierId; @Schema(description = "结算账户编号", example = "31189") private Long accountId; @Schema(description = "采购时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "采购时间不能为空") private LocalDateTime orderTime; @Schema(description = "优惠率,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "99.88") 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 8a60e95fe..5ff25a468 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 @@ -46,7 +46,7 @@ public interface ErpProductMapper extends BaseMapperX { /**查询不同类型的产品**/ default List selectByCategorys(List categoryIds){ return selectList(new QueryWrapper() - .eq("is_enable", true) + .eq("status", 0) .in("category_id" ,categoryIds)); } } \ 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/feedingplan/FeedingRecordPlanController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingplan/FeedingRecordPlanController.java index a64bd48af..204b10fa7 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingplan/FeedingRecordPlanController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingplan/FeedingRecordPlanController.java @@ -1,5 +1,17 @@ package cn.iocoder.yudao.module.mes.controller.admin.feedingplan; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +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.feedingrecord.FeedingRecordDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; @@ -20,6 +32,7 @@ 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 static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO; @@ -37,6 +50,16 @@ public class FeedingRecordPlanController { @Resource private FeedingRecordPlanService feedingRecordPlanService; + @Resource + private ErpProductService productService; + @Resource + private ErpProductUnitService productUnitService; + @Resource + private AdminUserApi adminUserApi; + @Resource + private PlanService planService; + @Resource + private FeedingRecordService feedingRecordService; @PostMapping("/create") @Operation(summary = "创建投料分配计划") @@ -75,8 +98,10 @@ public class FeedingRecordPlanController { @Operation(summary = "获得投料分配计划分页") @PreAuthorize("@ss.hasPermission('mes:feeding-record-plan:query')") public CommonResult> getFeedingRecordPlanPage(@Valid FeedingRecordPlanPageReqVO pageReqVO) { - PageResult pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO); - return success(pageResult); + + PageResult pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO); + PageResult pageResult1 = new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal()); + return success(pageResult1); } @GetMapping("/export-excel") @@ -86,10 +111,42 @@ public class FeedingRecordPlanController { public void exportFeedingRecordPlanExcel(@Valid FeedingRecordPlanPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO).getList(); + List list = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO).getList(); + List list1 = buildVOList(list); // 导出 Excel ExcelUtils.write(response, "投料分配计划.xls", "数据", FeedingRecordPlanRespVO.class, - list); + list1); + } + private List buildVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map map = productService.getProductMap( + convertSet(list, FeedingRecordPlanDO::getItemId)); + Map unitMap = productUnitService.getProductUnitMap( + convertSet(list, FeedingRecordPlanDO::getUnitId)); + // 1.4 管理员信息 + Map userMap = adminUserApi.getUserMap( + convertSet(list, FeedingRecordPlanDO::getUserId)); + //投料单 + Map recordMap = feedingRecordService.getRecordMap( + convertSet(list, FeedingRecordPlanDO::getRecordId)); + //生产计划 + Map planMap = planService.getPlanMap( + convertSet(list, FeedingRecordPlanDO::getPlanId)); + + return BeanUtils.toBean(list, FeedingRecordPlanRespVO.class, item -> { + MapUtils.findAndThen(map, item.getItemId(), + product -> item.setItemName(product.getName())); + MapUtils.findAndThen(unitMap, item.getUnitId(), + unit -> item.setUnitName(unit.getName())); + MapUtils.findAndThen(userMap, item.getUserId(), + user -> item.setUserName(user.getNickname())); + + MapUtils.findAndThen(recordMap, item.getRecordId(), + record -> item.setRecordCode(record.getFeedingRecordCode())); + MapUtils.findAndThen(planMap, item.getPlanId(), + plan -> item.setPlanCode(plan.getCode())); + }); } - } \ 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/feedingrecord/FeedingRecordController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/FeedingRecordController.java index f5993ae19..f7a7e9345 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/FeedingRecordController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/FeedingRecordController.java @@ -1,5 +1,12 @@ package cn.iocoder.yudao.module.mes.controller.admin.feedingrecord; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper; +import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; +import cn.iocoder.yudao.module.mes.service.plan.PlanService; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; @@ -14,18 +21,21 @@ 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.exception.util.ServiceExceptionUtil.exception; 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 static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.FEEDING_RECORD_NOT_EXISTS; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO; import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService; - +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; @@ -103,12 +113,54 @@ public class FeedingRecordController { List< FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(recordId); return success(feedingRecordService.buildVOList(detailDOList)); } + @Resource + private FeedingRecordMapper feedingRecordMapper; + @Resource + private ItemRequisitionService itemRequisitionService; + @Resource + private PlanService planService; @PutMapping("/update-status") @Operation(summary = "提交状态") public CommonResult updateStatus(@RequestParam("id") Long id, @RequestParam("status") String status) { - feedingRecordService.updateStatus(id, status); - return success(true); + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if(user!=null){ + FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); + if(recordDO==null) throw exception(FEEDING_RECORD_NOT_EXISTS); + //后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理 + if(recordDO.getFeedingType().equals(FeedingTypeEnum.领料.getValue())) { + List detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id); + //计划及计划物料需求 + List statusList = new ArrayList<>(); + statusList.add(PlanStatusEnum.开工.getValue()); + //获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。 + List planDOList = planService.getPlanByStatusAndPipeline(statusList,recordDO.getFeedingPipeline()); + Map> planItemListMap = new HashMap<>(); + Map planItemMap = new HashMap<>(); + + for (int i = 0; i < planDOList.size(); i++) { + //获取计划的物料需求 + List list = itemRequisitionService.getItemRequisitionList(planDOList.get(i).getId()); + planItemListMap.put(planDOList.get(i).getId(), list); + + for (ItemRequisitionDetailRespVO respVO: list ) { + String key = getMapKey(planDOList.get(i).getId(), respVO.getProductId()); + planItemMap.put(key, respVO); + } + } + feedingRecordService.updateStatus(recordDO,detailDOList, status , user.getId(),planDOList, + planItemListMap, planItemMap); + } + else { + recordDO.setRecordStatus(FeedingStatusEnum.提交.getValue()); + feedingRecordMapper.updateById(recordDO); + } + return success(true); + } + else return CommonResult.error(500,"无法获取操作用户!请检查!"); + } + private String getMapKey(Long planId, Long itemId){ + return planId + "-" + itemId; } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java index 150cdf1c7..40d17d2db 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionPageReqVO.java @@ -50,4 +50,7 @@ public class ItemRequisitionPageReqVO extends PageParam { @Schema(description = "领料人ID",example = "15546") private Long workerId; + + @Schema(description = "制浆线") + private String feedingPipeline; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java index 9095d93fa..8ded08073 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionRespVO.java @@ -59,4 +59,8 @@ public class ItemRequisitionRespVO { @Schema(description = "领料人ID",example = "15546") private Long workerId; + + @Schema(description = "制浆线") + @ExcelProperty("制浆线") + private String feedingPipeline; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java index 88a05f894..e0adf84ec 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/itemrequisition/vo/ItemRequisitionSaveReqVO.java @@ -47,4 +47,6 @@ public class ItemRequisitionSaveReqVO { @Schema(description = "领料人ID",example = "15546") private Long workerId; + @Schema(description = "制浆线") + private String feedingPipeline; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java index e344fe918..b5c351268 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanPageReqVO.java @@ -65,4 +65,6 @@ public class PlanPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "制浆线") + private String feedingPipeline; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java index 4df626c18..57a538f93 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/PlanRespVO.java @@ -87,4 +87,7 @@ public class PlanRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "制浆线") + @ExcelProperty("创建时间") + private String feedingPipeline; } \ 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 32f38e90a..9407e2592 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 @@ -59,5 +59,6 @@ public class PlanSaveReqVO { @Schema(description = "是否启用") private Boolean isEnable; - + @Schema(description = "制浆线") + private String feedingPipeline; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java index 5042d46b8..911486131 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/itemrequisition/ItemRequisitionDO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -65,4 +66,8 @@ public class ItemRequisitionDO extends BaseDO { private Long workerId; +// @Schema(description = "制浆线") +// @ExcelProperty("制浆线") + private String feedingPipeline; + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java index 018422cd7..0a9e7e145 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/plan/PlanDO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.plan; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; import java.time.LocalDateTime; @@ -91,5 +92,7 @@ public class PlanDO extends BaseDO { * 枚举 {@link TODO infra_boolean_string 对应的类} */ private Boolean isEnable; + //@Schema(description = "制浆线") + private String feedingPipeline; } \ 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 e88d14e69..562a5c02a 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 @@ -29,6 +29,7 @@ public interface PlanMapper extends BaseMapperX { .eqIfPresent(PlanDO::getPlanNumber, reqVO.getPlanNumber()) .eqIfPresent(PlanDO::getFinishNumber, reqVO.getFinishNumber()) .eqIfPresent(PlanDO::getStatus, reqVO.getStatus()) + .eqIfPresent(PlanDO::getFeedingPipeline, reqVO.getFeedingPipeline()) .betweenIfPresent(PlanDO::getPlanStartTime, reqVO.getPlanStartTime()) .betweenIfPresent(PlanDO::getPlanEndTime, reqVO.getPlanEndTime()) .betweenIfPresent(PlanDO::getStartTime, reqVO.getStartTime()) @@ -37,7 +38,8 @@ public interface PlanMapper extends BaseMapperX { .eqIfPresent(PlanDO::getRemark, reqVO.getRemark()) .eqIfPresent(PlanDO::getIsEnable, reqVO.getIsEnable()) .betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PlanDO::getId)); + .orderByDesc(PlanDO::getPlanStartTime) + .orderByDesc(PlanDO::getPlanEndTime)); } default PlanDO selectByNo(String no) { return selectOne(PlanDO::getCode, no); @@ -71,4 +73,7 @@ public interface PlanMapper extends BaseMapperX { default List selectBy(List statusList) { return selectList(PlanDO::getStatus, statusList); } + default List selectBy(List statusList, String pipeline) { + return selectList(PlanDO::getStatus, statusList, PlanDO::getFeedingPipeline, pipeline); + } } \ 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/feedingplan/FeedingRecordPlanService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanService.java index 24bff1fc7..94bf4aa33 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanService.java @@ -51,6 +51,6 @@ public interface FeedingRecordPlanService { * @param pageReqVO 分页查询 * @return 投料分配计划分页 */ - PageResult getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO); + PageResult getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO); BigDecimal selectSumBy(Long planId, Long itemId); } \ 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/feedingplan/FeedingRecordPlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImpl.java index 963c99e7b..ec8c05f91 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImpl.java @@ -46,16 +46,7 @@ public class FeedingRecordPlanServiceImpl implements FeedingRecordPlanService { @Resource private FeedingRecordPlanMapper feedingRecordPlanMapper; - @Resource - private ErpProductService productService; - @Resource - private ErpProductUnitService productUnitService; - @Resource - private AdminUserApi adminUserApi; - @Resource - private PlanService planService; - @Resource - private FeedingRecordService feedingRecordService; + @Override public Long createFeedingRecordPlan(FeedingRecordPlanSaveReqVO createReqVO) { @@ -95,42 +86,10 @@ public class FeedingRecordPlanServiceImpl implements FeedingRecordPlanService { } @Override - public PageResult getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO) { - PageResult pageResult = feedingRecordPlanMapper.selectPage(pageReqVO); - return new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal()); + public PageResult getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO) { + return feedingRecordPlanMapper.selectPage(pageReqVO); } - private List buildVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - Map map = productService.getProductMap( - convertSet(list, FeedingRecordPlanDO::getItemId)); - Map unitMap = productUnitService.getProductUnitMap( - convertSet(list, FeedingRecordPlanDO::getUnitId)); - // 1.4 管理员信息 - Map userMap = adminUserApi.getUserMap( - convertSet(list, FeedingRecordPlanDO::getUserId)); - //投料单 - Map recordMap = feedingRecordService.getRecordMap( - convertSet(list, FeedingRecordPlanDO::getRecordId)); - //生产计划 - Map planMap = planService.getPlanMap( - convertSet(list, FeedingRecordPlanDO::getPlanId)); - return BeanUtils.toBean(list, FeedingRecordPlanRespVO.class, item -> { - MapUtils.findAndThen(map, item.getItemId(), - product -> item.setItemName(product.getName())); - MapUtils.findAndThen(unitMap, item.getUnitId(), - unit -> item.setUnitName(unit.getName())); - MapUtils.findAndThen(userMap, item.getUserId(), - user -> item.setUnitName(user.getNickname())); - - MapUtils.findAndThen(recordMap, item.getRecordId(), - record -> item.setRecordCode(record.getFeedingRecordCode())); - MapUtils.findAndThen(planMap, item.getPlanId(), - plan -> item.setPlanCode(plan.getCode())); - }); - } @Override public BigDecimal selectSumBy(Long planId, Long itemId){ return feedingRecordPlanMapper.selectSumBy(planId,itemId); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordService.java index f853717ed..4b15022ef 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordService.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.feedingrecord; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -73,7 +74,9 @@ public interface FeedingRecordService { if(ids.isEmpty())return new HashMap<>(); return convertMap(getFeedingRecordList(ids), FeedingRecordDO::getId); } - void updateStatus(Long id, String status); + void updateStatus(FeedingRecordDO recordDO,List detailDOList, String status , Long userId + ,List planDOList,Map> planItemListMap, + Map planItemMap); //提交、反提交投料记录单 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordServiceImpl.java index 9f0ac3e33..c1906caf7 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordServiceImpl.java @@ -7,13 +7,18 @@ 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.controller.admin.feedingplan.vo.FeedingRecordPlanRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.StockWorkShopTypeEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO; +import cn.iocoder.yudao.module.mes.dal.mysql.feedingplan.FeedingRecordPlanMapper; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import cn.iocoder.yudao.module.mes.service.feedingplan.FeedingRecordPlanService; +import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; import cn.iocoder.yudao.module.mes.service.plan.PlanService; import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopDetailService; import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService; @@ -24,6 +29,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; @@ -38,6 +45,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordDetailMa import javax.annotation.Resource; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -65,11 +73,10 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { @Resource private FeedingRecordPlanService recordPlanService; @Resource - private StockWorkshopService workshopService; - @Resource - private StockWorkshopDetailService workshopDetailService; + private FeedingRecordPlanMapper recordPlanMapper; @Resource - private PlanService planService; + private StockWorkshopService workshopService; + @Override @@ -80,6 +87,7 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { FeedingRecordDO feedingRecord = BeanUtils.toBean(createReqVO, FeedingRecordDO.class); feedingRecord.setRecordStatus(FeedingStatusEnum.草稿.getValue()); feedingRecordMapper.insert(feedingRecord); + //todo 检查投料原料项,如果不是kg,则转为kg // 插入子表 createFeedingRecordDetailList(feedingRecord.getId(), createReqVO.getFeedingRecordDetails()); @@ -183,34 +191,123 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { * **/ @Override @Transactional(rollbackFor = Exception.class) - public void updateStatus(Long id, String status) { - FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); - if(recordDO==null) throw exception(FEEDING_RECORD_NOT_EXISTS); - //后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理 - if(!recordDO.getFeedingType().equals(FeedingTypeEnum.领料.getValue())) - return; - List detailDOList = getFeedingRecordDetailListByRecordId(id); - - List statusList = new ArrayList<>(); - statusList.add(PlanStatusEnum.开工.getValue()); - List planDOList = planService.getPlanByStatus(statusList); + public void updateStatus(FeedingRecordDO recordDO,List detailDOList, String status , Long userId + ,List planDOList,Map> planItemListMap, + Map planItemMap) { if(status.equals(FeedingStatusEnum.提交.getValue())) { - + //detailDOMap 汇总投料原料 + MapdetailDOMap = new HashMap<>(); for (FeedingRecordDetailDO recordDetailDO: detailDOList) { + //车间仓投料出库 StockWorkshopDO workshopDO = new StockWorkshopDO() .setItemId(recordDetailDO.getItemId()) .setCount(recordDetailDO.getWeight().multiply(BigDecimal.valueOf(-1))) .setCategoryId(1L); workshopService.updateStock(workshopDO, StockWorkShopTypeEnum.投料出库.getValue(), recordDO.getId(), recordDO.getFeedingRecordCode()); - - + //合并同原料 + if(detailDOMap.containsKey(recordDetailDO.getItemId())){ + BigDecimal totalWeight = detailDOMap.get(recordDetailDO.getItemId()).getWeight() + .add(recordDetailDO.getWeight()); + detailDOMap.get(recordDetailDO.getItemId()).setWeight(totalWeight); + }else detailDOMap.put(recordDetailDO.getItemId(), recordDetailDO); } + dealPlan(detailDOMap,recordDO, userId, planDOList, planItemListMap, planItemMap); } //todo 需要回退吗? else if(status.equals(FeedingStatusEnum.草稿.getValue())) { } } + private void dealPlan(Map detailDOMap , FeedingRecordDO recordDO, Long userId, + List planDOList,Map> planItemListMap, + Map planItemMap){ + MathContext mc = new MathContext(3, RoundingMode.HALF_UP); + //分配计划 + //totalPlanNeedItem记录所有计划需要的该原料总数,用于最后按比例分配原料 + MaptotalPlanNeedItem = new HashMap<>(); + //recordPlanDOMap 记录已分配计划id原料id对应的分配量,同计划id原料id的合并为一个记录,最终插入数据库 + Map recordPlanDOMap = new HashMap<>(); + for (int i = 0; i < planDOList.size(); i++) { + List list = planItemListMap.get(planDOList.get(i).getId()); + + for(ItemRequisitionDetailRespVO respVO: list){ + //原料需要分配 + int cp = respVO.getNumber().compareTo(respVO.getFinishNumber()); + if(detailDOMap.containsKey(respVO.getProductId()) + && detailDOMap.get(respVO.getProductId()).getWeight().compareTo(BigDecimal.ZERO) > 0 + && cp > 0 ){ + FeedingRecordDetailDO detailDO = detailDOMap.get(respVO.getProductId()); + BigDecimal weight = respVO.getNumber().subtract(respVO.getFinishNumber(), mc); + //投料不能满足计划需求,则对该计划投料为实际投料数量, 否则满足,为需求数量 + if(weight.compareTo(detailDO.getWeight()) > 0 ){ + weight = detailDO.getWeight(); + } + //未分配投料数量减少 + detailDO.setWeight(detailDO.getWeight().subtract(weight)); + + String key = getMapKey(planDOList.get(i).getId(), respVO.getProductId()); + if(recordPlanDOMap.containsKey(key)){ + //正常来说单个计划再做物料分析的时候只会产生一条ItemRequisitionDetailRespVO + recordPlanDOMap.get(key).setWeight( recordPlanDOMap.get(key).getWeight().add(weight)); + }else{ + FeedingRecordPlanDO recordPlanDO = new FeedingRecordPlanDO() + .setPlanId(planDOList.get(i).getId()) + .setItemId(respVO.getProductId()) + .setRecordId(recordDO.getId()).setUserId(userId).setUnitId(respVO.getUnitId()) + .setRecordDetailId(respVO.getId()).setFeedingTime(detailDO.getFeedingTime()) + .setWeight(weight); + recordPlanDOMap.put(key, recordPlanDO); + } + } + if(totalPlanNeedItem.containsKey(respVO.getProductId())){ + BigDecimal totalNumber = totalPlanNeedItem.get(respVO.getProductId()).add(respVO.getNumber()); + totalPlanNeedItem.put(respVO.getProductId(), totalNumber); + }else totalPlanNeedItem.put(respVO.getProductId(), respVO.getNumber()); + } + } + + dealLast(detailDOMap, recordDO.getId(), userId, planDOList, totalPlanNeedItem, recordPlanDOMap, planItemMap); + //插入 + recordPlanMapper.insertBatch(recordPlanDOMap.values()); + } + //处理剩余未分配原料,按照totalPlanNeedItem 比例分配到每个计划 + private Map dealLast(Map detailDOMap, Long recordId, Long userId + , List planDOList, MaptotalPlanNeedItem, Map recordPlanDOMap , + Map planItemMap){ + MathContext mc = new MathContext(5, RoundingMode.HALF_UP); + + for (Long itemId : detailDOMap.keySet()) { + //原料有未分配数量 + if(detailDOMap.get(itemId).getWeight().compareTo(BigDecimal.ZERO) <= 0)continue; + BigDecimal factor = detailDOMap.get(itemId).getWeight().divide(totalPlanNeedItem.get(itemId), mc); + for (PlanDO plan : planDOList) { + ItemRequisitionDetailRespVO detailRespVO = planItemMap.get(getMapKey(plan.getId(),itemId)); + //该计划不需要这种物料 + if(detailRespVO==null){ + System.out.println("~~~~~~~计算出错!~~~~~~"); + continue; + } + + BigDecimal weight = factor.multiply(detailRespVO.getNumber()); + String key = getMapKey(plan.getId(), itemId); + if(recordPlanDOMap.containsKey(key)){ + recordPlanDOMap.get(key).setWeight( recordPlanDOMap.get(key).getWeight().add(weight)); + }else{ + FeedingRecordPlanDO recordPlanDO = new FeedingRecordPlanDO() + .setPlanId(plan.getId()).setItemId(itemId) + .setRecordId(recordId).setUserId(userId).setUnitId(detailRespVO.getUnitId()) + .setRecordDetailId(detailDOMap.get(itemId).getId()) + .setFeedingTime(detailDOMap.get(itemId).getFeedingTime()) + .setWeight(weight); + recordPlanDOMap.put(key, recordPlanDO); + } + } + } + return recordPlanDOMap; + } + private String getMapKey(Long planId, Long itemId){ + return planId + "-" + itemId; + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java index ce3b7698a..7a29ff6a5 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionService.java @@ -65,5 +65,7 @@ public interface ItemRequisitionService { List getItemRequisitionDetailListByItemRequisitionId(Long itemRequisitionId); List buildDetailVOList(List list, Long planId); - ItemRequisitionDetailRespVO getItemRequisition(Long planId, Long itemId); + ItemRequisitionDetailRespVO getItemRequisitionDetailRespVO(Long planId, Long itemId); + + List getItemRequisitionList(Long planId); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java index 60c3271dc..93fbb2881 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemRequisitionServiceImpl.java @@ -163,12 +163,12 @@ public class ItemRequisitionServiceImpl implements ItemRequisitionService { } @Override - public ItemRequisitionDetailRespVO getItemRequisition(Long planId, Long itemId){ + public ItemRequisitionDetailRespVO getItemRequisitionDetailRespVO(Long planId, Long itemId){ ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectByPlanId(planId); if(itemRequisitionDO != null){ ItemRequisitionDetailDO detailDO = itemRequisitionDetailMapper.selectBy(itemRequisitionDO.getId(), itemId); - + if(detailDO == null) return null; ItemRequisitionDetailRespVO respVO = new ItemRequisitionDetailRespVO() .setItemRequisitionId(itemRequisitionDO.getId()) .setUnitId(detailDO.getUnitId()) @@ -179,4 +179,23 @@ public class ItemRequisitionServiceImpl implements ItemRequisitionService { } return null; } + @Override + public List getItemRequisitionList(Long planId){ + ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectByPlanId(planId); + List respVOList = new ArrayList<>(); + if(itemRequisitionDO != null){ + List detailDOList = + itemRequisitionDetailMapper.selectListByItemRequisitionId(itemRequisitionDO.getId()); + for (ItemRequisitionDetailDO detailDO :detailDOList) { + ItemRequisitionDetailRespVO respVO = new ItemRequisitionDetailRespVO() + .setItemRequisitionId(itemRequisitionDO.getId()) + .setUnitId(detailDO.getUnitId()) + .setNumber(detailDO.getNumber()) + .setProductId(detailDO.getProductId()); + respVO.setFinishNumber(recordPlanService.selectSumBy(planId, detailDO.getProductId())); + respVOList.add(respVO); + } + } + return respVOList; + } } \ 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 6d8abe30f..3d9d5abf4 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 @@ -73,4 +73,5 @@ public interface PlanService { } List getPlanByStatus(List statusList); + List getPlanByStatusAndPipeline(List statusList, String pipeline); } \ 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 3b28d4406..62c5f713d 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,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDateTime; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; @@ -159,6 +160,8 @@ public class PlanServiceImpl implements PlanService { //更新计划状态 planDO.setStatus(PlanStatusEnum.派工.getValue()); planDO.setIsEnable(true); + planDO.setFeedingPipeline(saveReqVO.getFeedingPipeline()); + planDO.setStartTime(LocalDateTime.now()); planMapper.updateById(planDO); return true; } @@ -171,4 +174,9 @@ public class PlanServiceImpl implements PlanService { public List getPlanByStatus(List statusList){ return planMapper.selectBy(statusList); } + + @Override + public List getPlanByStatusAndPipeline(List statusList, String pipeline){ + return planMapper.selectBy(statusList,pipeline); + } } \ 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/feedingplan/FeedingRecordPlanServiceImplTest.java b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImplTest.java index f31fe3ce2..6cb12d5f3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/test/java/cn/iocoder/yudao/module/mes/service/feedingplan/FeedingRecordPlanServiceImplTest.java @@ -150,7 +150,7 @@ public class FeedingRecordPlanServiceImplTest extends BaseDbUnitTest { reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); // 调用 - PageResult pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(reqVO); + PageResult pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size());