fix:修复已知bug

liutao_branch
HuangHuiKang 1 week ago
parent fa9d61e75d
commit b9e72e30e1

@ -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.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO; 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.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.organization.OrganizationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; 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.FeedingRecordDetailMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper; 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.dal.mysql.itemrequisition.ItemRequisitionMapper;
import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService; 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.itemrequisition.ItemRequisitionService;
import cn.iocoder.yudao.module.mes.service.organization.OrganizationService; import cn.iocoder.yudao.module.mes.service.organization.OrganizationService;
import cn.iocoder.yudao.module.mes.service.plan.PlanService; 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.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -46,6 +50,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -70,6 +75,9 @@ public class FeedingRecordController {
@Resource @Resource
private FeedingRecordDetailMapper feedingRecordDetailMapper; private FeedingRecordDetailMapper feedingRecordDetailMapper;
@Resource
private FeedingRecordPlanMapper feedingRecordPlanMapper;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建投料记录") @Operation(summary = "创建投料记录")
@PreAuthorize("@ss.hasPermission('mes:feeding-record:create')") @PreAuthorize("@ss.hasPermission('mes:feeding-record:create')")
@ -168,64 +176,122 @@ public class FeedingRecordController {
private PlanService planService; private PlanService planService;
@Resource @Resource
private ItemRequisitionMapper itemRequisitionMapper; private ItemRequisitionMapper itemRequisitionMapper;
@Resource
private ItemRequisitionDetailMapper itemRequisitionDetailMapper;
@PutMapping("/update-status") @PutMapping("/update-status")
@Operation(summary = "提交状态") @Operation(summary = "提交状态")
public CommonResult<Boolean> updateStatus(@RequestParam("id") Long id, public CommonResult<Boolean> updateStatus(@RequestParam("id") Long id,
@RequestParam("status") String status) { @RequestParam("status") String status) {
LoginUser user = SecurityFrameworkUtils.getLoginUser(); 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<Integer> statusList = new ArrayList<>();
// statusList.add(PlanStatusEnum.量产.getValue());
// //获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。
// List<PlanDO> planDOList = planService.getPlanByStatusAndPipeline(statusList, String.valueOf(recordDO.getFeedingPipeline()));/** todo 这里改了 以前固定2 5立方制浆线*/
//
//
// if (recordDO.getFeedingType().equals(FeedingTypeEnum.领料.getValue())) {
// List<FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id);
// Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap = new HashMap<>();
// Map<String, ItemRequisitionDetailRespVO> planItemMap = new HashMap<>();
//
// for (int i = 0; i < planDOList.size(); i++) {
// //获取计划的物料需求
// List<ItemRequisitionDetailRespVO> 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<String, FeedingRecordPlanDO> recordPlanDOMap = feedingRecordService.updateStatus(recordDO, detailDOList, status, user.getId(), planDOList,
// planItemListMap, planItemMap);
// //更新计划对应的领料单投料时间
// Map<Long, Long> 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<FeedingRecordPlanDO> feedingRecordPlanDOS = new ArrayList<>();
// 获取投料记录
FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); FeedingRecordDO recordDO = feedingRecordMapper.selectById(id);
if (recordDO == null) throw exception(FEEDING_RECORD_NOT_EXISTS); Long planId = recordDO.getPlanId();
//后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理
//计划及计划物料需求
List<Integer> statusList = new ArrayList<>();
statusList.add(PlanStatusEnum..getValue());
//获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。
List<PlanDO> planDOList = planService.getPlanByStatusAndPipeline(statusList, String.valueOf(recordDO.getFeedingPipeline()));/** todo 这里改了 以前固定2 5立方制浆线*/
// 获取最新领料单
ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectOne(
Wrappers.<ItemRequisitionDO>lambdaQuery()
.eq(ItemRequisitionDO::getPlanId, planId)
.orderByDesc(ItemRequisitionDO::getCreateTime)
.last("limit 1"));
if (recordDO.getFeedingType().equals(FeedingTypeEnum..getValue())) { if (itemRequisitionDO != null) {
List<FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id);
Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap = new HashMap<>();
Map<String, ItemRequisitionDetailRespVO> planItemMap = new HashMap<>();
for (int i = 0; i < planDOList.size(); i++) { // 领料明细
//获取计划的物料需求 List<ItemRequisitionDetailDO> itemRequisitionDetailDOS =
List<ItemRequisitionDetailRespVO> list = itemRequisitionService.getItemRequisitionList(planDOList.get(i).getId()); itemRequisitionDetailMapper.selectList(
planItemListMap.put(planDOList.get(i).getId(), list); Wrappers.<ItemRequisitionDetailDO>lambdaQuery()
.eq(ItemRequisitionDetailDO::getItemRequisitionId, itemRequisitionDO.getId()));
for (ItemRequisitionDetailRespVO respVO : list) { // 投料明细
String key = getMapKey(planDOList.get(i).getId(), respVO.getProductId()); List<FeedingRecordDetailDO> feedingRecordDetailDOS =
planItemMap.put(key, respVO); feedingRecordDetailMapper.selectListByRecordId(id);
}
} // 转成 Map<ProductId, FeedingRecordDetailDO>
//当只有一个计划在开工时,投料直接分配给该计划 Map<Long, FeedingRecordDetailDO> detailMap = feedingRecordDetailDOS.stream()
if(planDOList.size()==1){ .collect(Collectors.toMap(
feedingRecordService.dealWithOnPlan( planDOList.get(0), detailDOList, planItemMap, user,recordDO); FeedingRecordDetailDO::getProductId,
} v -> v,
else{ (a, b) -> a
Map<String, FeedingRecordPlanDO> recordPlanDOMap = feedingRecordService.updateStatus(recordDO, detailDOList, status, user.getId(), planDOList, ));
planItemListMap, planItemMap);
//更新计划对应的领料单投料时间 for (ItemRequisitionDetailDO itemDetail : itemRequisitionDetailDOS) {
Map<Long, Long> map = new HashMap<>();
if (recordPlanDOMap!=null && !recordPlanDOMap.isEmpty()) { FeedingRecordPlanDO planDO = new FeedingRecordPlanDO();
for (String key : recordPlanDOMap.keySet()) { planDO.setPlanId(planId);
FeedingRecordPlanDO item = recordPlanDOMap.get(key); planDO.setItemId(itemDetail.getProductId());
if (!map.containsKey(item.getPlanId())) { planDO.setUserId(user.getId());
ItemRequisitionDO itemRequisitionDO = itemRequisitionService.getItemRequisitionByPlanId(item.getPlanId()); FeedingRecordDetailDO detail = detailMap.get(itemDetail.getProductId());
if (itemRequisitionDO != null && itemRequisitionDO.getDeliveryDate() == null &&!map.containsKey(item.getPlanId())) { if (detail != null) {
itemRequisitionDO.setDeliveryDate(LocalDate.now()); planDO.setWeight(detail.getWeight());
itemRequisitionMapper.updateById(itemRequisitionDO);
map.put(item.getPlanId(), item.getPlanId());
}
}
} }
feedingRecordPlanDOS.add(planDO);
} }
} }
} else {
// 批量插入
if (!feedingRecordPlanDOS.isEmpty()) {
feedingRecordPlanMapper.insertBatch(feedingRecordPlanDOS);
} }
// if (recordDO.getWeight().compareTo(recordDO.getFeedingWeight()) == 0) { // if (recordDO.getWeight().compareTo(recordDO.getFeedingWeight()) == 0) {
// recordDO.setRecordStatus(FeedingStatusEnum.已完成.getValue()); // recordDO.setRecordStatus(FeedingStatusEnum.已完成.getValue());
// } else { // } else {
@ -238,9 +304,10 @@ public class FeedingRecordController {
// feedingRecordDetailMapper.insertBatch(list); // feedingRecordDetailMapper.insertBatch(list);
// } // }
recordDO.setRecordStatus(status); recordDO.setRecordStatus(status);
recordDO.setActualFeedingTime(LocalDateTime.now());
feedingRecordMapper.updateById(recordDO); feedingRecordMapper.updateById(recordDO);
return success(true); return success(true);
} else return CommonResult.error(500, "无法获取操作用户!请检查!"); // } else return CommonResult.error(500, "无法获取操作用户!请检查!");
} }

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -42,6 +43,10 @@ public class FeedingRecordRespVO {
// @DictFormat("mes_feeding_pipeline") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 // @DictFormat("mes_feeding_pipeline") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Long feedingPipeline; private Long feedingPipeline;
@Schema(description = "生产计划编码", example = "随便")
@ExcelProperty("生产计划编码")
private String planCode;
@Schema(description = "制浆线名称") @Schema(description = "制浆线名称")
@ExcelProperty(value = "制浆线名称", converter = DictConvert.class) @ExcelProperty(value = "制浆线名称", converter = DictConvert.class)
private String feedingPipelineName; private String feedingPipelineName;
@ -59,6 +64,10 @@ public class FeedingRecordRespVO {
@ExcelProperty("投料时间") @ExcelProperty("投料时间")
private LocalDateTime feedingTime; private LocalDateTime feedingTime;
@Schema(description = "实际投料时间")
@ExcelProperty("实际投料时间")
private LocalDateTime actualFeedingTime;
@Schema(description = "记录人", example = "13784") @Schema(description = "记录人", example = "13784")
private Long userId; private Long userId;
@Schema(description = "记录人", example = "13784") @Schema(description = "记录人", example = "13784")
@ -80,4 +89,7 @@ public class FeedingRecordRespVO {
@Schema(description = "记录人", example = "13784") @Schema(description = "记录人", example = "13784")
private String creator; private String creator;
} }

@ -39,6 +39,9 @@ public class FeedingRecordSaveReqVO {
@Schema(description = "投料时间") @Schema(description = "投料时间")
private LocalDateTime feedingTime; private LocalDateTime feedingTime;
@Schema(description = "实际投料时间")
private LocalDateTime actualFeedingTime;
@Schema(description = "记录人", example = "13784") @Schema(description = "记录人", example = "13784")
private Long userId; private Long userId;
@ -51,4 +54,5 @@ public class FeedingRecordSaveReqVO {
@Schema(description = "投料记录明细列表") @Schema(description = "投料记录明细列表")
private List<FeedingRecordDetailDO> feedingRecordDetails; private List<FeedingRecordDetailDO> feedingRecordDetails;
} }

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.*;
@ -84,4 +85,12 @@ public class FeedingRecordDO extends BaseDO {
*/ */
private String recordStatus; private String recordStatus;
@TableField(exist = false)
private String planCode;
/**
*
*/
private LocalDateTime actualFeedingTime;
} }

@ -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.FeedingRecordDetailMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper; 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.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.dal.redis.no.MesNoRedisDAO;
import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService;
import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService; 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.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -38,6 +40,8 @@ import java.math.MathContext;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.*; 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.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@ -74,6 +78,10 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
@Resource @Resource
private ItemRequisitionMapper itemRequisitionMapper; private ItemRequisitionMapper itemRequisitionMapper;
@Resource
@Lazy
private PlanMapper planMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createFeedingRecord(FeedingRecordSaveReqVO createReqVO) { public Long createFeedingRecord(FeedingRecordSaveReqVO createReqVO) {
@ -165,6 +173,8 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
@Override @Override
public PageResult<FeedingRecordRespVO> getFeedingRecordPage(FeedingRecordPageReqVO pageReqVO) { public PageResult<FeedingRecordRespVO> getFeedingRecordPage(FeedingRecordPageReqVO pageReqVO) {
PageResult<FeedingRecordDO> pageResult = feedingRecordMapper.selectPage(pageReqVO); PageResult<FeedingRecordDO> pageResult = feedingRecordMapper.selectPage(pageReqVO);
return new PageResult<>(buildList(pageResult.getList()),pageResult.getTotal()); return new PageResult<>(buildList(pageResult.getList()),pageResult.getTotal());
} }
@Override @Override
@ -172,6 +182,37 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return Collections.emptyList(); return Collections.emptyList();
} }
// 1. 收集所有 planId
List<Long> planIds = list.stream()
.map(FeedingRecordDO::getPlanId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (!planIds.isEmpty()) {
// 2. 批量查询 PlanDO
List<PlanDO> plans = planMapper.selectBatchIds(planIds);
// 3. 转成 Map<id, planDO>
Map<Long, PlanDO> 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<Long, ErpProductDO> map = productService.getProductMap( Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, FeedingRecordDO::getItemId)); convertSet(list, FeedingRecordDO::getItemId));
// 1.4 管理员信息 // 1.4 管理员信息

Loading…
Cancel
Save