fix:修复生产计划产品名称快照问题

main
HuangHuiKang 17 hours ago
parent 20d8391f82
commit f9e2a8376a

@ -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));
}
}
}

@ -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;
}
}

@ -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
*/

@ -33,6 +33,14 @@ public class TaskDetailDO extends BaseDO {
* ID
*/
private Long productId;
/**
*
*/
private String productNameSnapshot;
/**
*
*/
private String productCodeSnapshot;
/**
* ID
*/

@ -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<PlanDO> {
@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<Integer> statusList) {
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<PlanDO>()

@ -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) {
// 校验存在

@ -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);
/**
*
*

@ -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<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, PlanDO::getProductId));
Map<Long, String> productNameSnapshotMap = list.stream()
.filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductNameSnapshot()))
.collect(Collectors.toMap(PlanDO::getId, PlanDO::getProductNameSnapshot, (a, b) -> a));
Map<Long, AdminUserDO> userMap = userService.getUserMap(
convertSet(list, PlanDO::getProductionManagerId));
Map<Long, TaskDO> taskMap = taskService.getMap(
@ -678,8 +709,12 @@ public class PlanServiceImpl implements PlanService {
Map<Long, OrganizationDO> organizationMap = organizationService.getMap(
convertSet(list, PlanDO::getFeedingPipeline));
List<PlanRespVO> 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());

@ -323,6 +323,7 @@ public class TaskServiceImpl implements TaskService {
private void createTaskDetailList(Long taskId, List<TaskDetailDO> 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<Long, String> productNameSnapshotMap = list.stream()
.filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductNameSnapshot()))
.collect(Collectors.toMap(TaskDetailDO::getId, TaskDetailDO::getProductNameSnapshot, (a, b) -> a));
Map<Long, String> productCodeSnapshotMap = list.stream()
.filter(item -> item.getId() != null && StringUtils.isNotBlank(item.getProductCodeSnapshot()))
.collect(Collectors.toMap(TaskDetailDO::getId, TaskDetailDO::getProductCodeSnapshot, (a, b) -> a));
List<TaskDetailRespVO> 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<TaskDetailDO> 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<TaskDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return;

@ -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,

@ -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}, '%')
</if>
<if test="reqVO.productName != null and reqVO.productName != ''">
AND pr.name LIKE CONCAT('%', #{reqVO.productName}, '%')
AND COALESCE(NULLIF(p.product_name_snapshot, ''), pr.name) LIKE CONCAT('%', #{reqVO.productName}, '%')
</if>
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
</select>

@ -11,6 +11,8 @@
<resultMap id="BaseResultMap" type="cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO">
<id column="id" property="id" />
<result column="product_id" property="productId" />
<result column="product_name_snapshot" property="productNameSnapshot" />
<result column="product_code_snapshot" property="productCodeSnapshot" />
<result column="unit_id" property="unitId" />
<result column="task_id" property="taskId" />
<result column="number" property="number" />
@ -39,7 +41,7 @@
<result column="number" property="number" />
</resultMap>
<sql id="Base_Column_List">
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;
</select>
</mapper>
</mapper>

Loading…
Cancel
Save