From b9e72e30e1565ece0ed20886ea96f8b05f298b62 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 11 Mar 2026 17:16:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=B7=B2=E7=9F=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FeedingRecordController.java | 163 ++++++++++++------ .../feedingrecord/vo/FeedingRecordRespVO.java | 12 ++ .../vo/FeedingRecordSaveReqVO.java | 4 + .../feedingrecord/FeedingRecordDO.java | 9 + .../FeedingRecordServiceImpl.java | 41 +++++ 5 files changed, 181 insertions(+), 48 deletions(-) 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 81e46bc07..f4585d8a5 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 @@ -20,15 +20,19 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanD 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.dal.dataobject.itemrequisition.ItemRequisitionDO; +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.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.feedingplan.FeedingRecordPlanMapper; import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper; import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; import cn.iocoder.yudao.module.mes.service.organization.OrganizationService; import cn.iocoder.yudao.module.mes.service.plan.PlanService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -46,6 +50,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -70,6 +75,9 @@ public class FeedingRecordController { @Resource private FeedingRecordDetailMapper feedingRecordDetailMapper; + @Resource + private FeedingRecordPlanMapper feedingRecordPlanMapper; + @PostMapping("/create") @Operation(summary = "创建投料记录") @PreAuthorize("@ss.hasPermission('mes:feeding-record:create')") @@ -168,64 +176,122 @@ public class FeedingRecordController { private PlanService planService; @Resource private ItemRequisitionMapper itemRequisitionMapper; + @Resource + private ItemRequisitionDetailMapper itemRequisitionDetailMapper; + @PutMapping("/update-status") @Operation(summary = "提交状态") public CommonResult updateStatus(@RequestParam("id") Long id, @RequestParam("status") String status) { LoginUser user = SecurityFrameworkUtils.getLoginUser(); - if (user != null) { +// if (user != null) { +// FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); +// if (recordDO == null) throw exception(FEEDING_RECORD_NOT_EXISTS); +// //后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理 +// //计划及计划物料需求 +// List statusList = new ArrayList<>(); +// statusList.add(PlanStatusEnum.量产.getValue()); +// //获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。 +// List planDOList = planService.getPlanByStatusAndPipeline(statusList, String.valueOf(recordDO.getFeedingPipeline()));/** todo 这里改了 以前固定2 5立方制浆线*/ +// +// +// if (recordDO.getFeedingType().equals(FeedingTypeEnum.领料.getValue())) { +// List detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id); +// 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); +// } +// } +// //当只有一个计划在开工时,投料直接分配给该计划 +// if(planDOList.size()==1){ +// feedingRecordService.dealWithOnPlan( planDOList.get(0), detailDOList, planItemMap, user,recordDO); +// } +// else{ +// Map recordPlanDOMap = feedingRecordService.updateStatus(recordDO, detailDOList, status, user.getId(), planDOList, +// planItemListMap, planItemMap); +// //更新计划对应的领料单投料时间 +// Map map = new HashMap<>(); +// if (recordPlanDOMap!=null && !recordPlanDOMap.isEmpty()) { +// for (String key : recordPlanDOMap.keySet()) { +// FeedingRecordPlanDO item = recordPlanDOMap.get(key); +// if (!map.containsKey(item.getPlanId())) { +// ItemRequisitionDO itemRequisitionDO = itemRequisitionService.getItemRequisitionByPlanId(item.getPlanId()); +// if (itemRequisitionDO != null && itemRequisitionDO.getDeliveryDate() == null &&!map.containsKey(item.getPlanId())) { +// itemRequisitionDO.setDeliveryDate(LocalDate.now()); +// itemRequisitionMapper.updateById(itemRequisitionDO); +// map.put(item.getPlanId(), item.getPlanId()); +// } +// } +// } +// } +// } +// } else { +// +// } + // 处理投料 + List feedingRecordPlanDOS = new ArrayList<>(); + + // 获取投料记录 FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); - if (recordDO == null) throw exception(FEEDING_RECORD_NOT_EXISTS); - //后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理 - //计划及计划物料需求 - List statusList = new ArrayList<>(); - statusList.add(PlanStatusEnum.量产.getValue()); - //获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。 - List planDOList = planService.getPlanByStatusAndPipeline(statusList, String.valueOf(recordDO.getFeedingPipeline()));/** todo 这里改了 以前固定2 5立方制浆线*/ - - - if (recordDO.getFeedingType().equals(FeedingTypeEnum.领料.getValue())) { - List detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id); - 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); - } - } - //当只有一个计划在开工时,投料直接分配给该计划 - if(planDOList.size()==1){ - feedingRecordService.dealWithOnPlan( planDOList.get(0), detailDOList, planItemMap, user,recordDO); - } - else{ - Map recordPlanDOMap = feedingRecordService.updateStatus(recordDO, detailDOList, status, user.getId(), planDOList, - planItemListMap, planItemMap); - //更新计划对应的领料单投料时间 - Map map = new HashMap<>(); - if (recordPlanDOMap!=null && !recordPlanDOMap.isEmpty()) { - for (String key : recordPlanDOMap.keySet()) { - FeedingRecordPlanDO item = recordPlanDOMap.get(key); - if (!map.containsKey(item.getPlanId())) { - ItemRequisitionDO itemRequisitionDO = itemRequisitionService.getItemRequisitionByPlanId(item.getPlanId()); - if (itemRequisitionDO != null && itemRequisitionDO.getDeliveryDate() == null &&!map.containsKey(item.getPlanId())) { - itemRequisitionDO.setDeliveryDate(LocalDate.now()); - itemRequisitionMapper.updateById(itemRequisitionDO); - map.put(item.getPlanId(), item.getPlanId()); - } - } - } + Long planId = recordDO.getPlanId(); + + // 获取最新领料单 + ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectOne( + Wrappers.lambdaQuery() + .eq(ItemRequisitionDO::getPlanId, planId) + .orderByDesc(ItemRequisitionDO::getCreateTime) + .last("limit 1")); + + if (itemRequisitionDO != null) { + + // 领料明细 + List itemRequisitionDetailDOS = + itemRequisitionDetailMapper.selectList( + Wrappers.lambdaQuery() + .eq(ItemRequisitionDetailDO::getItemRequisitionId, itemRequisitionDO.getId())); + + // 投料明细 + List feedingRecordDetailDOS = + feedingRecordDetailMapper.selectListByRecordId(id); + + // 转成 Map + Map detailMap = feedingRecordDetailDOS.stream() + .collect(Collectors.toMap( + FeedingRecordDetailDO::getProductId, + v -> v, + (a, b) -> a + )); + + for (ItemRequisitionDetailDO itemDetail : itemRequisitionDetailDOS) { + + FeedingRecordPlanDO planDO = new FeedingRecordPlanDO(); + planDO.setPlanId(planId); + planDO.setItemId(itemDetail.getProductId()); + planDO.setUserId(user.getId()); + FeedingRecordDetailDO detail = detailMap.get(itemDetail.getProductId()); + if (detail != null) { + planDO.setWeight(detail.getWeight()); } + + feedingRecordPlanDOS.add(planDO); } - } else { + } + // 批量插入 + if (!feedingRecordPlanDOS.isEmpty()) { + feedingRecordPlanMapper.insertBatch(feedingRecordPlanDOS); } + + // if (recordDO.getWeight().compareTo(recordDO.getFeedingWeight()) == 0) { // recordDO.setRecordStatus(FeedingStatusEnum.已完成.getValue()); // } else { @@ -238,9 +304,10 @@ public class FeedingRecordController { // feedingRecordDetailMapper.insertBatch(list); // } recordDO.setRecordStatus(status); + recordDO.setActualFeedingTime(LocalDateTime.now()); feedingRecordMapper.updateById(recordDO); return success(true); - } else return CommonResult.error(500, "无法获取操作用户!请检查!"); +// } else return CommonResult.error(500, "无法获取操作用户!请检查!"); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordRespVO.java index e8d11ff97..72542786c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordRespVO.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -42,6 +43,10 @@ public class FeedingRecordRespVO { // @DictFormat("mes_feeding_pipeline") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private Long feedingPipeline; + @Schema(description = "生产计划编码", example = "随便") + @ExcelProperty("生产计划编码") + private String planCode; + @Schema(description = "制浆线名称") @ExcelProperty(value = "制浆线名称", converter = DictConvert.class) private String feedingPipelineName; @@ -59,6 +64,10 @@ public class FeedingRecordRespVO { @ExcelProperty("投料时间") private LocalDateTime feedingTime; + @Schema(description = "实际投料时间") + @ExcelProperty("实际投料时间") + private LocalDateTime actualFeedingTime; + @Schema(description = "记录人", example = "13784") private Long userId; @Schema(description = "记录人", example = "13784") @@ -80,4 +89,7 @@ public class FeedingRecordRespVO { @Schema(description = "记录人", example = "13784") private String creator; + + + } \ 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/vo/FeedingRecordSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordSaveReqVO.java index b04c1cb9f..fa6391adf 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/feedingrecord/vo/FeedingRecordSaveReqVO.java @@ -39,6 +39,9 @@ public class FeedingRecordSaveReqVO { @Schema(description = "投料时间") private LocalDateTime feedingTime; + @Schema(description = "实际投料时间") + private LocalDateTime actualFeedingTime; + @Schema(description = "记录人", example = "13784") private Long userId; @@ -51,4 +54,5 @@ public class FeedingRecordSaveReqVO { @Schema(description = "投料记录明细列表") private List feedingRecordDetails; + } \ 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/feedingrecord/FeedingRecordDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/feedingrecord/FeedingRecordDO.java index ffb06a3eb..56e4421c8 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/feedingrecord/FeedingRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/feedingrecord/FeedingRecordDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -84,4 +85,12 @@ public class FeedingRecordDO extends BaseDO { */ private String recordStatus; + @TableField(exist = false) + private String planCode; + + /** + * 实际投料时间 + */ + private LocalDateTime actualFeedingTime; + } \ 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/feedingrecord/FeedingRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/feedingrecord/FeedingRecordServiceImpl.java index 0f3f32e86..780231109 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 @@ -23,11 +23,13 @@ import cn.iocoder.yudao.module.mes.dal.mysql.feedingplan.FeedingRecordPlanMapper import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper; import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -38,6 +40,8 @@ import java.math.MathContext; import java.math.RoundingMode; import java.time.LocalDate; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -74,6 +78,10 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { @Resource private ItemRequisitionMapper itemRequisitionMapper; + @Resource + @Lazy + private PlanMapper planMapper; + @Override @Transactional(rollbackFor = Exception.class) public Long createFeedingRecord(FeedingRecordSaveReqVO createReqVO) { @@ -165,6 +173,8 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { @Override public PageResult getFeedingRecordPage(FeedingRecordPageReqVO pageReqVO) { PageResult pageResult = feedingRecordMapper.selectPage(pageReqVO); + + return new PageResult<>(buildList(pageResult.getList()),pageResult.getTotal()); } @Override @@ -172,6 +182,37 @@ public class FeedingRecordServiceImpl implements FeedingRecordService { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } + + // 1. 收集所有 planId + List planIds = list.stream() + .map(FeedingRecordDO::getPlanId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + if (!planIds.isEmpty()) { + // 2. 批量查询 PlanDO + List plans = planMapper.selectBatchIds(planIds); + + // 3. 转成 Map + Map planMap = plans.stream() + .collect(Collectors.toMap(PlanDO::getId, Function.identity())); + + // 4. 填充 planCode + list.forEach(feedingRecordDO -> { + if (feedingRecordDO.getPlanId() != null) { + PlanDO planDO = planMap.get(feedingRecordDO.getPlanId()); + if (planDO != null) { + feedingRecordDO.setPlanCode(planDO.getCode()); + } + } + }); + } + + + + + Map map = productService.getProductMap( convertSet(list, FeedingRecordDO::getItemId)); // 1.4 管理员信息