From f9e2a8376aabc9c69b05f0cb2295e709d17c73b3 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 15 Jul 2026 09:28:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E4=BA=A7=E5=93=81=E5=90=8D=E7=A7=B0=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaogongRecordController.java | 6 +-- .../baogongrecord/BaogongRecordDO.java | 10 +++- .../mes/dal/dataobject/plan/PlanDO.java | 7 ++- .../mes/dal/dataobject/task/TaskDetailDO.java | 8 +++ .../module/mes/dal/mysql/plan/PlanMapper.java | 8 +++ .../BaogongRecordServiceImpl.java | 50 +++++++++++++++++ .../module/mes/service/plan/PlanService.java | 3 ++ .../mes/service/plan/PlanServiceImpl.java | 53 +++++++++++++++---- .../mes/service/task/TaskServiceImpl.java | 40 +++++++++++++- .../baogongrecord/BaogongRecordMapper.xml | 4 +- .../main/resources/mapper/plan/PlanMapper.xml | 7 +-- .../mapper/task/TaskDetailMapper.xml | 6 ++- 12 files changed, 179 insertions(+), 23 deletions(-) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/BaogongRecordController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/BaogongRecordController.java index 138bd6cd0..908ae985f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/BaogongRecordController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/baogongrecord/BaogongRecordController.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionRespVO; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO; import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; @@ -82,7 +81,8 @@ public class BaogongRecordController { .divide(new BigDecimal(plan.getWangongNumber()), 4, RoundingMode.HALF_UP); plan.setPassRate(rate.multiply(new BigDecimal("100"))); } - planService.updatePlan(BeanUtils.toBean(plan, PlanSaveReqVO.class)); + planService.updateReportNumbers(plan.getId(), plan.getWangongNumber(), plan.getPassNumber(), + plan.getNoPassNumber(), plan.getPassRate()); return success(baogongRecordService.createBaogongRecord(createReqVO)); } @@ -171,4 +171,4 @@ public class BaogongRecordController { return success(baogongRecordService.getBaogongRecordTrend(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/dal/dataobject/baogongrecord/BaogongRecordDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/baogongrecord/BaogongRecordDO.java index d09d41848..9cd2f4fef 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/baogongrecord/BaogongRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/baogongrecord/BaogongRecordDO.java @@ -32,6 +32,14 @@ public class BaogongRecordDO extends BaseDO { * 关联计划id */ private Long planId; + /** + * 产品名称快照 + */ + private String productNameSnapshot; + /** + * 产品编码快照 + */ + private String productCodeSnapshot; /** * 派工数量 */ @@ -50,4 +58,4 @@ public class BaogongRecordDO extends BaseDO { */ 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/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 d258bb030..5b0731a93 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,6 +1,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.plan; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -27,7 +28,7 @@ public class PlanDO extends BaseDO { /** * ID */ - @TableId + @TableId(type= IdType.ASSIGN_ID) private Long id; /** * 计划编码 @@ -37,6 +38,10 @@ public class PlanDO extends BaseDO { * 产品ID */ private Long productId; + /** + * 产品名称快照 + */ + private String productNameSnapshot; /** * 任务单明细ID */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java index 8a4b6e376..17b12f852 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/task/TaskDetailDO.java @@ -33,6 +33,14 @@ public class TaskDetailDO extends BaseDO { * 产品ID */ private Long productId; + /** + * 产品名称快照 + */ + private String productNameSnapshot; + /** + * 产品编码快照 + */ + private String productCodeSnapshot; /** * 单位ID */ 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 12d08f532..768e07277 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 @@ -18,6 +18,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -125,6 +126,13 @@ public interface PlanMapper extends BaseMapperX { @Update("UPDATE mes_plan SET status = #{status} WHERE id = #{id}") void updateStatus(@Param("id") Long id, @Param("status") Integer status); + @Update("UPDATE mes_plan SET wangong_number = #{wangongNumber}, pass_number = #{passNumber}, no_pass_number = #{noPassNumber}, pass_rate = #{passRate} WHERE id = #{id}") + void updateReportNumbers(@Param("id") Long id, + @Param("wangongNumber") Long wangongNumber, + @Param("passNumber") Long passNumber, + @Param("noPassNumber") Long noPassNumber, + @Param("passRate") BigDecimal passRate); + default Long selectSumTaskDetail(Long taskDetailId, List statusList) { // SQL sum 查询 List> result = selectMaps(new QueryWrapper() diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/baogongrecord/BaogongRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/baogongrecord/BaogongRecordServiceImpl.java index 1d3dc943e..ad01d517a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/baogongrecord/BaogongRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/baogongrecord/BaogongRecordServiceImpl.java @@ -13,14 +13,21 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; +import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.baogongrecord.BaogongRecordDO; 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.dataobject.plan.PlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; import cn.iocoder.yudao.module.mes.enums.BaogongTrendTypeEnum; import cn.iocoder.yudao.module.mes.dal.mysql.baogongrecord.BaogongRecordMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskDetailMapper; +import org.apache.commons.lang3.StringUtils; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -37,16 +44,59 @@ public class BaogongRecordServiceImpl implements BaogongRecordService { @Resource private BaogongRecordMapper baogongRecordMapper; + @Resource + private PlanMapper planMapper; + + @Resource + private ErpProductService productService; + + @Resource + private TaskDetailMapper taskDetailMapper; + @Override public Long createBaogongRecord(BaogongRecordSaveReqVO createReqVO) { // 插入 BaogongRecordDO baogongRecord = BeanUtils.toBean(createReqVO, BaogongRecordDO.class); + fillProductSnapshot(baogongRecord); baogongRecord.setBaogongTime(LocalDateTime.now()); baogongRecordMapper.insert(baogongRecord); // 返回 return baogongRecord.getId(); } + private void fillProductSnapshot(BaogongRecordDO baogongRecord) { + if (baogongRecord == null || baogongRecord.getPlanId() == null) { + return; + } + PlanDO plan = planMapper.selectById(baogongRecord.getPlanId()); + if (plan == null) { + return; + } + baogongRecord.setProductNameSnapshot(plan.getProductNameSnapshot()); + if (plan.getTaskDetailId() != null) { + TaskDetailDO taskDetail = taskDetailMapper.selectById(plan.getTaskDetailId()); + if (taskDetail != null) { + if (StringUtils.isBlank(baogongRecord.getProductNameSnapshot())) { + baogongRecord.setProductNameSnapshot(taskDetail.getProductNameSnapshot()); + } + baogongRecord.setProductCodeSnapshot(taskDetail.getProductCodeSnapshot()); + } + } + if (plan.getProductId() == null) { + return; + } + ErpProductDO product = productService.getProduct(plan.getProductId()); + if (product == null) { + return; + } + if (StringUtils.isBlank(baogongRecord.getProductNameSnapshot())) { + baogongRecord.setProductNameSnapshot(product.getName()); + } + if (StringUtils.isBlank(baogongRecord.getProductCodeSnapshot())) { + baogongRecord.setProductCodeSnapshot(product.getBarCode()); + } + } + @Override public void updateBaogongRecord(BaogongRecordSaveReqVO updateReqVO) { // 校验存在 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 268277670..00f6f8344 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 @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock; import javax.validation.Valid; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Collection; import java.util.HashMap; @@ -38,6 +39,8 @@ public interface PlanService { */ void updatePlan(@Valid PlanSaveReqVO updateReqVO); + void updateReportNumbers(Long id, Long wangongNumber, Long passNumber, Long noPassNumber, BigDecimal passRate); + /** * 删除生产计划 * 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 0cd425c3f..43d77de30 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 @@ -172,9 +172,11 @@ public class PlanServiceImpl implements PlanService { if(plan.getProductId()==null && plan.getTaskDetailId()!=null){ TaskDetailDO taskDetailDO = taskService.getTaskDetail(plan.getTaskDetailId()); plan.setProductId(taskDetailDO.getProductId()); + plan.setProductNameSnapshot(taskDetailDO.getProductNameSnapshot()); } if (plan.getIsEnable() == null) plan.setIsEnable(true); if(plan.getPriorityNum()==null) plan.setPriorityNum(1L); + fillProductNameSnapshot(plan); fillProcessRouteSnapshot(plan); // if (createReqVO.getIsCalculateLoss() == null) { // createReqVO.setIsCalculateLoss(true); @@ -369,6 +371,7 @@ public class PlanServiceImpl implements PlanService { public void updatePlan(PlanSaveReqVO updateReqVO) { // 校验存在 validatePlanExists(updateReqVO.getId()); + PlanDO oldPlan = planMapper.selectById(updateReqVO.getId()); // 更新 PlanDO updateObj = BeanUtils.toBean(updateReqVO, PlanDO.class); if (updateObj.getIsEnable() == null) updateObj.setIsEnable(true); @@ -376,14 +379,36 @@ public class PlanServiceImpl implements PlanService { TaskDetailDO taskDetailDO = taskService.getTaskDetail(updateObj.getTaskDetailId()); updateObj.setProductId(taskDetailDO.getProductId()); } - fillProcessRouteSnapshot(updateObj); + fillProductNameSnapshot(updateObj); + if (updateReqVO.getProcessRouteId() == null) { + updateObj.setProcessRouteId(oldPlan.getProcessRouteId()); + updateObj.setProcessRouteName(oldPlan.getProcessRouteName()); + } else { + fillProcessRouteSnapshot(updateObj); + } planMapper.updateById(updateObj); - if (updateReqVO.getProcessRouteItems() != null || updateReqVO.getProcessRouteId() != null) { + if (updateReqVO.getProcessRouteItems() != null) { planProcessRouteItemMapper.deleteByPlanId(updateReqVO.getId()); savePlanProcessRouteItems(updateReqVO.getId(), updateObj.getProcessRouteId(), updateReqVO.getProcessRouteItems()); } } + @Override + public void updateReportNumbers(Long id, Long wangongNumber, Long passNumber, Long noPassNumber, BigDecimal passRate) { + validatePlanExists(id); + planMapper.updateReportNumbers(id, wangongNumber, passNumber, noPassNumber, passRate); + } + + private void fillProductNameSnapshot(PlanDO plan) { + if (plan == null || plan.getProductId() == null) { + return; + } + ErpProductDO product = productService.getProduct(plan.getProductId()); + if (product != null) { + plan.setProductNameSnapshot(product.getName()); + } + } + private void fillProcessRouteSnapshot(PlanDO plan) { if (plan.getProcessRouteId() == null) { plan.setProcessRouteName(null); @@ -435,12 +460,15 @@ public class PlanServiceImpl implements PlanService { public PlanRespVO getPlanRespVO(PlanDO planDO) { PlanRespVO planRespVO = BeanUtils.toBean(planDO, PlanRespVO.class); + planRespVO.setProductName(planDO.getProductNameSnapshot()); if (planDO.getProductId() != null) { ErpProductDO product = productService.getProduct(planDO.getProductId()); - planRespVO.setProductName(product == null ? null : product.getName()); + if (StringUtils.isBlank(planRespVO.getProductName())) { + planRespVO.setProductName(product == null ? null : product.getName()); + } planRespVO.setProductCode(product == null ? null : product.getBarCode()); } else { - planRespVO.setProductName(null); + planRespVO.setProductName(planDO.getProductNameSnapshot()); planRespVO.setProductCode(null); } @@ -573,7 +601,7 @@ public class PlanServiceImpl implements PlanService { item.setProductName(StringUtils.isNotBlank(product.getBarCode()) ? "【" + product.getBarCode() + "】" + product.getName() : product.getName()); - } else if (item.getProductId() != null) { + } else if (item.getProductId() != null && StringUtils.isBlank(item.getProductName())) { item.setProductName("产品[" + item.getProductId() + "]"); } item.setPassRate(calculatePassRate(item.getPassNumber(), item.getWangongNumber())); @@ -637,7 +665,7 @@ public class PlanServiceImpl implements PlanService { PlanTaskPageRespVO respVO = new PlanTaskPageRespVO(); respVO.setId(plan.getId()); ErpProductDO product = productMap.get(plan.getProductId()); - respVO.setProductName(product != null ? product.getName() : null); + respVO.setProductName(StringUtils.defaultIfBlank(plan.getProductNameSnapshot(), product != null ? product.getName() : null)); DeviceLedgerDO device = deviceMap.get(plan.getDeviceId()); respVO.setDeviceName(device != null ? device.getDeviceName() : null); respVO.setPlanNumber(plan.getPlanNumber()); @@ -671,6 +699,9 @@ public class PlanServiceImpl implements PlanService { list = buildProgress(list); Map map = productService.getProductMap( convertSet(list, PlanDO::getProductId)); + Map productNameSnapshotMap = list.stream() + .filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductNameSnapshot())) + .collect(Collectors.toMap(PlanDO::getId, PlanDO::getProductNameSnapshot, (a, b) -> a)); Map userMap = userService.getUserMap( convertSet(list, PlanDO::getProductionManagerId)); Map taskMap = taskService.getMap( @@ -678,8 +709,12 @@ public class PlanServiceImpl implements PlanService { Map organizationMap = organizationService.getMap( convertSet(list, PlanDO::getFeedingPipeline)); List respList = BeanUtils.toBean(list, PlanRespVO.class, item -> { - MapUtils.findAndThen(map, item.getProductId(), - product -> item.setProductName(product.getName())); + item.setProductName(StringUtils.defaultIfBlank(productNameSnapshotMap.get(item.getId()), item.getProductName())); + MapUtils.findAndThen(map, item.getProductId(), product -> { + if (StringUtils.isBlank(item.getProductName())) { + item.setProductName(product.getName()); + } + }); MapUtils.findAndThen(userMap, item.getProductionManagerId(), unit -> item.setProductionManager(unit.getNickname())); @@ -911,7 +946,7 @@ public class PlanServiceImpl implements PlanService { item.setLatestStartTime(plan.getLatestStartTime()); // 前提:PlanDO已加该字段 item.setPlanNumber(plan.getPlanNumber()); ErpProductDO product = productMap.get(plan.getProductId()); - item.setProductName(product == null ? null : product.getName()); + item.setProductName(StringUtils.defaultIfBlank(plan.getProductNameSnapshot(), product == null ? null : product.getName())); item.setDeviceName(device == null ? null : device.getDeviceName()); item.setProductCode(product == null ? null : product.getBarCode()); item.setDeviceCode(device == null ? null : device.getDeviceCode()); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index b3edd2d15..e28a342a6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -323,6 +323,7 @@ public class TaskServiceImpl implements TaskService { private void createTaskDetailList(Long taskId, List list) { list.forEach(o -> o.setTaskId(taskId)); + fillProductNameSnapshot(list); fillPackagingSchemeSnapshot(list); taskDetailMapper.insertBatch(list); } @@ -421,9 +422,24 @@ public class TaskServiceImpl implements TaskService { productDeviceDisplayMap.put(productId, deviceDisplay); } + Map productNameSnapshotMap = list.stream() + .filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductNameSnapshot())) + .collect(Collectors.toMap(TaskDetailDO::getId, TaskDetailDO::getProductNameSnapshot, (a, b) -> a)); + Map productCodeSnapshotMap = list.stream() + .filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductCodeSnapshot())) + .collect(Collectors.toMap(TaskDetailDO::getId, TaskDetailDO::getProductCodeSnapshot, (a, b) -> a)); + List resList = BeanUtils.toBean(list, TaskDetailRespVO.class, item -> { - MapUtils.findAndThen(map, item.getProductId(), - product -> item.setProductName(product.getName()).setBarCode(product.getBarCode())); + item.setProductName(StringUtils.defaultIfBlank(productNameSnapshotMap.get(item.getId()), item.getProductName())); + item.setBarCode(StringUtils.defaultIfBlank(productCodeSnapshotMap.get(item.getId()), item.getBarCode())); + MapUtils.findAndThen(map, item.getProductId(), product -> { + if (StringUtils.isBlank(item.getProductName())) { + item.setProductName(product.getName()); + } + if (StringUtils.isBlank(item.getBarCode())) { + item.setBarCode(product.getBarCode()); + } + }); MapUtils.findAndThen(unitMap, item.getUnitId(), unit -> item.setUnitName(unit.getName())); @@ -444,6 +460,7 @@ public class TaskServiceImpl implements TaskService { @Override public Long createTaskDetail(TaskDetailSaveReqVO createReqVO) { TaskDetailDO taskDetail = BeanUtils.toBean(createReqVO, TaskDetailDO.class); + fillProductNameSnapshot(taskDetail); fillPackagingSchemeSnapshot(taskDetail); taskDetailMapper.insert(taskDetail); return taskDetail.getId(); @@ -454,11 +471,30 @@ public class TaskServiceImpl implements TaskService { TaskDetailDO taskDetail = BeanUtils.toBean(updateReqVO, TaskDetailDO.class); // 校验存在 validateTaskDetailExists(taskDetail.getId()); + fillProductNameSnapshot(taskDetail); fillPackagingSchemeSnapshot(taskDetail); // 更新 taskDetailMapper.updateById(taskDetail); } + private void fillProductNameSnapshot(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + list.forEach(this::fillProductNameSnapshot); + } + + private void fillProductNameSnapshot(TaskDetailDO taskDetail) { + if (taskDetail == null || taskDetail.getProductId() == null) { + return; + } + ErpProductDO product = erpProductMapper.selectById(taskDetail.getProductId()); + if (product != null) { + taskDetail.setProductNameSnapshot(product.getName()); + taskDetail.setProductCodeSnapshot(product.getBarCode()); + } + } + private void fillPackagingSchemeSnapshot(List list) { if (CollUtil.isEmpty(list)) { return; 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 91d4f1692..d550ea9b9 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 @@ -17,8 +17,8 @@ p.code AS planCode, r.creator AS employeeId, u.nickname AS employeeName, - pr.name AS productName, - pr.bar_code AS productCode, + COALESCE(NULLIF(r.product_name_snapshot, ''), NULLIF(p.product_name_snapshot, ''), pr.name) AS productName, + COALESCE(NULLIF(r.product_code_snapshot, ''), pr.bar_code) AS productCode, (IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) AS baogongNum, IFNULL(r.num, 0) AS passNum, IFNULL(r.no_pass_num, 0) AS noPassNum, diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml index c10043603..2d69a4e0c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -34,6 +34,7 @@ resultType="cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanQualityOverviewRespVO$ProductPassRateItem"> SELECT product_id AS productId, + MAX(NULLIF(product_name_snapshot, '')) AS productName, IFNULL(SUM(wangong_number), 0) AS wangongNumber, IFNULL(SUM(pass_number), 0) AS passNumber, IFNULL(SUM(no_pass_number), 0) AS noPassNumber @@ -63,7 +64,7 @@ resultType="cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanProductCapacityRespVO"> SELECT pr.bar_code AS productCode, - pr.name AS productName, + COALESCE(NULLIF(p.product_name_snapshot, ''), pr.name) AS productName, SUM(IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) AS baogongTotal, CAST(ROUND(SUM(IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) / #{statDays}, 0) AS SIGNED) AS avgCapacity FROM mes_baogong_record r @@ -81,9 +82,9 @@ AND pr.bar_code LIKE CONCAT('%', #{reqVO.productCode}, '%') - AND pr.name LIKE CONCAT('%', #{reqVO.productName}, '%') + AND COALESCE(NULLIF(p.product_name_snapshot, ''), pr.name) LIKE CONCAT('%', #{reqVO.productName}, '%') - GROUP BY p.product_id, pr.bar_code, pr.name + GROUP BY p.product_id, pr.bar_code, COALESCE(NULLIF(p.product_name_snapshot, ''), pr.name) ORDER BY baogongTotal DESC, pr.bar_code ASC diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml index 2d3a3505e..18b2ea728 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/task/TaskDetailMapper.xml @@ -11,6 +11,8 @@ + + @@ -39,7 +41,7 @@ - id, product_id, unit_id, task_id, `number`, package_size, project_name, + id, product_id, product_name_snapshot, product_code_snapshot, unit_id, task_id, `number`, package_size, project_name, tech_requirements, remark, is_enable, creator, create_time, updater, update_time, deleted, tenant_id, package_number, finish_date, boxing_date, arrive_date, bar_code, attachment, sale_order_code @@ -52,4 +54,4 @@ WHERE task_id = #{taskId} GROUP BY product_id; - \ No newline at end of file +