优化生产修改开料状态逻辑,参数修改,添加小板数量查询修改

This commit is contained in:
liuzhaotian
2025-01-20 11:58:04 +08:00
parent bb5843e320
commit 59083285de
8 changed files with 146 additions and 339 deletions
@@ -17,7 +17,6 @@ import co.elastic.clients.json.JsonData;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.GoodsFilterConditionsEnum;
import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum;
import com.cf.imes.framework.common.enums.OrderStatusEnum;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
@@ -71,7 +70,7 @@ import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.concurrent.atomic.AtomicLong;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.DATA_DATA_ERROR;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_DATA_ERROR;
@@ -149,6 +148,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
private static final String FIELD_SORT = " order by createTime desc ";
private static final String FIELD_IS_OPTIMIZED = " op.is_optimized";
private static final String FIELD_PLAN_CONFIG_ID = "planConfigId";
private static final String FIELD_UPDATETIME = "updateTime";
private static final String ES_ORDER_MODEL_DATA_ERROR = "生产单板材造型信息ES文档查询数据异常: ";
@@ -239,7 +239,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// 更新开料相关的数据
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("cutedBoardInfo",cutedBoardInfo);
objectObjectHashMap.put("updateTime",simpleDateFormat.format(date));
objectObjectHashMap.put(FIELD_UPDATETIME,simpleDateFormat.format(date));
try {
@@ -341,7 +341,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// 更新开料相关的数据
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("cutedBoardInfo",cutedBoardInfo);
objectObjectHashMap.put("updateTime",simpleDateFormat.format(date));
objectObjectHashMap.put(FIELD_UPDATETIME,simpleDateFormat.format(date));
try {
@@ -680,6 +680,10 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
throw exception(THIS_PLAN_OPTIMIZE_DATA_ERROR);
}
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
Boolean isLock = Optional.ofNullable(optimizeBoardModelDO.getIsLock()).orElse(false);
@@ -1204,47 +1208,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
}
private void goodsFilter(List<String> filter, List<GoodsReqVO> goodsReqVOS) {
int goodsNum = goodsReqVOS.size();
Map<String, Function<GoodsReqVO, ?>> attributeMap = new HashMap<>();
attributeMap.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), GoodsReqVO::getThickness);
attributeMap.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), GoodsReqVO::getMaterial);
attributeMap.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), GoodsReqVO::getColor);
attributeMap.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), GoodsReqVO::getTexture);
attributeMap.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), GoodsReqVO::getBrand);
attributeMap.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), GoodsReqVO::getWidth);
attributeMap.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), GoodsReqVO::getWidth);
for (String s : filter) {
Function<GoodsReqVO, ?> attributeFunc = attributeMap.get(s);
if (attributeFunc == null) {
throw new ServiceException(PLAN_MIXED_DATA_ERROR);
}
// 获取当前属性的第一个值
Object attributeValue = goodsReqVOS.stream()
.map(attributeFunc)
.findFirst()
.orElse(null);
// 根据属性值过滤列表
long count = goodsReqVOS.stream()
.filter(f -> attributeValue.equals(attributeFunc.apply(f)))
.count();
if (goodsNum != count) {
throw exception(PLAN_MIXED_ORDER_ERROR,GoodsFilterConditionsEnum.getValueByKey(s));
}
}
}
private String conversion(String filed) {
// 去除字段中的 【 】
@@ -1404,114 +1367,141 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
private Long updatePlanOptimizeData(List<RemainBoardInfo> remainBoardInfos,
OptimizeBoardModelDO optimizeBoardModelDO,
List<Long> orderIds,
List<String> goodsIds,
List<Integer> goodsNo,
Integer cutedType){
Date date = new Date();
long goodsNum = 0L;
List<String> planNo = new ArrayList<>();
remainBoardInfos.forEach(f->{
if(goodsIds.contains(f.getGoodsId())){
f.getPlaceBoardList().forEach(p->{
if(goodsNo.contains(p.getBoardId())) {
p.setCutedType(cutedType);
planNo.addAll(p.getBlocks().stream().map(RemainBoardInfo.Blocks::getBlockId).toList());
}
});
}
});
// 更新开料相关的数据
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
Integer cutedType) {
if(OrderPlateCutStatusEnum.NOCUTTING.getStatus().equals(cutedType)){
Date currentDate = new Date();
AtomicLong goodsCount = new AtomicLong(0L);
List<String> planNos = new ArrayList<>();
// 开料的大板数量
long cutedBoardNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardNumber()).orElse(0L);
// 更新板材状态并统计数量
updateRemainBoardInfo(remainBoardInfos, goodsIds, goodsNo, cutedType, goodsCount, planNos);
// 开料的小板数量
long cutedBlockNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBlockNumber()).orElse(0L);
// 更新优化数据
long goodsNum = updateOptimizeData(optimizeBoardModelDO, goodsCount.get(), planNos.size(), cutedType);
if(cutedBoardNumber != 0L && cutedBlockNumber != 0L) {
cutedBoardNumber -= goodsNo.size();
cutedBlockNumber -= planNo.size();
goodsNum = cutedBoardNumber;
objectObjectHashMap.put("cutedBoardNumber", cutedBoardNumber);
objectObjectHashMap.put("cutedBlockNumber", cutedBlockNumber);
}
}
if(OrderPlateCutStatusEnum.OPENED.getStatus().equals(cutedType)){
// 开料的大板数量
long cutedBoardNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardNumber()).orElse(0L);
// 开料的小板数量
long cutedBlockNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBlockNumber()).orElse(0L);
cutedBoardNumber += goodsNo.size();
cutedBlockNumber += planNo.size();
goodsNum = cutedBoardNumber;
objectObjectHashMap.put("cutedBoardNumber", cutedBoardNumber);
objectObjectHashMap.put("cutedBlockNumber", cutedBlockNumber);
}
objectObjectHashMap.put("remainBoardInfo", toJsonString(remainBoardInfos));
objectObjectHashMap.put("updateTime",simpleDateFormat.format(date));
try {
esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap);
} catch (IOException | ElasticsearchException e) {
log.error(e.getMessage());
throw new ServiceException(ES_DATA_ERROR);
}
List<PlateDO> plateDOS = plateMapper.selectPlateByPlateNo(orderIds, planNo, getUserOrganId());
AssertUtils.notEmpty(plateDOS,THIS_PLAN_PLATE_DATA_ERROR);
plateDOS.forEach(f->{
f.setIsCutted(cutedType);
});
plateMapper.updateBatch(plateDOS);
// 同步数据到 ES
syncWithElasticsearch(remainBoardInfos, optimizeBoardModelDO, currentDate);
// 更新数据库中的板材信息
updatePlateData(orderIds, planNos, cutedType);
return goodsNum;
}
private void updateRemainBoardInfo(List<RemainBoardInfo> remainBoardInfos,
List<String> goodsIds,
List<Integer> goodsNo,
Integer cutedType,
AtomicLong goodsCount,
List<String> planNos) {
remainBoardInfos.stream()
.filter(remainBoard -> goodsIds.contains(remainBoard.getGoodsId()))
.flatMap(remainBoard -> remainBoard.getPlaceBoardList().stream())
.filter(board -> goodsNo.contains(board.getBoardId()) && !board.getCutedType().equals(cutedType) &&
(cutedType.equals(OrderPlateCutStatusEnum.OPENING.getStatus()) ?
!board.getCutedType().equals(OrderPlateCutStatusEnum.OPENED.getStatus()) : true))
.forEach(board -> {
goodsCount.incrementAndGet();
board.setCutedType(cutedType);
planNos.addAll(board.getBlocks().stream()
.map(RemainBoardInfo.Blocks::getBlockId)
.toList());
});
}
private long updateOptimizeData(OptimizeBoardModelDO optimizeBoardModelDO,
long goodsCount,
int blockCount,
Integer cutedType) {
long cutedBoardNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBoardNumber()).orElse(0L);
long cutedBlockNumber = Optional.ofNullable(optimizeBoardModelDO.getCutedBlockNumber()).orElse(0L);
if (OrderPlateCutStatusEnum.NOCUTTING.getStatus().equals(cutedType)) {
cutedBoardNumber -= goodsCount;
cutedBlockNumber -= blockCount;
} else if (OrderPlateCutStatusEnum.OPENED.getStatus().equals(cutedType)) {
cutedBoardNumber += goodsCount;
cutedBlockNumber += blockCount;
}
optimizeBoardModelDO.setCutedBoardNumber(cutedBoardNumber);
optimizeBoardModelDO.setCutedBlockNumber(cutedBlockNumber);
return cutedBoardNumber;
}
private void syncWithElasticsearch(List<RemainBoardInfo> remainBoardInfos,
OptimizeBoardModelDO optimizeBoardModelDO,
Date date) {
Map<String, Object> updateData = new HashMap<>();
updateData.put("cutedBoardNumber", optimizeBoardModelDO.getCutedBoardNumber());
updateData.put("cutedBlockNumber", optimizeBoardModelDO.getCutedBlockNumber());
updateData.put("remainBoardInfo", toJsonString(remainBoardInfos));
updateData.put(FIELD_UPDATETIME, simpleDateFormat.format(date));
try {
esDocumentService.updateById(ORDER_OPTIMIZE_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, updateData);
} catch (IOException | ElasticsearchException e) {
log.error("Failed to sync with Elasticsearch: {}", e.getMessage());
throw new ServiceException(ES_DATA_ERROR);
}
}
private void updatePlateData(List<Long> orderIds, List<String> planNo, Integer cutedType) {
List<PlateDO> plateDOS = plateMapper.selectPlateByPlateNo(orderIds, planNo, getUserOrganId());
AssertUtils.notEmpty(plateDOS, THIS_PLAN_PLATE_DATA_ERROR);
if(OrderPlateCutStatusEnum.OPENING.getStatus().equals(cutedType)){
plateDOS.forEach(plate -> {
if( !plate.getIsCutted().equals(cutedType) && !plate.getIsCutted().equals(OrderPlateCutStatusEnum.OPENED.getStatus())){
plate.setIsCutted(cutedType);
}
});
}else {
plateDOS.forEach(plate -> {
if(!plate.getIsCutted().equals(cutedType)){
plate.setIsCutted(cutedType);
}
});
}
plateMapper.updateBatch(plateDOS);
}
@Transactional(rollbackFor = Exception.class)
public void updateOrderAndPlanByCutStatus(PlanDO planDO,Long goodsNum,Integer cutedType,List<Long> orderIds,Integer boardCount){
// 未开料
if(OrderPlateCutStatusEnum.NOCUTTING.getStatus().equals(cutedType)){
planDO.setStatus(PlanStatusEnum.OPENING.getStatus());
@@ -1543,7 +1533,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
if(OrderPlateCutStatusEnum.OPENING.getStatus().equals(cutedType)){
// 开料中
if(OrderPlateCutStatusEnum.OPENING.getStatus().equals(cutedType) && !planDO.getStatus().equals(OrderPlateCutStatusEnum.OPENED.getStatus())){
planDO.setStatus(PlanStatusEnum.OPENING.getStatus());
@@ -1559,6 +1550,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
// 已开料
if(OrderPlateCutStatusEnum.OPENED.getStatus().equals(cutedType)){
List<PlateDO> plateDOList = plateMapper.selectNoCutPlateByPlateId(orderIds, getUserOrganId());
@@ -1591,9 +1583,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
}
@@ -9,7 +9,6 @@ import co.elastic.clients.elasticsearch.core.search.Hit;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.GoodsFilterConditionsEnum;
import com.cf.imes.framework.common.enums.OrderPlateTypeEnum;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.common.enums.PlanTypeEnum;
@@ -60,8 +59,6 @@ import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_DATA_ERROR;
@@ -287,9 +284,6 @@ public class PlateServiceImpl implements PlateService {
@Override
public PageResult<PlateResList> getOrderPlatePage(NoPlanPlatePageReqVO pageReqVO) {
// 使用这种方法分页查询速度太慢,所以要自己实现分页
// PageDTO<PlateResList> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
List<Integer> statusList = new ArrayList<>();
statusList.add(OrderStatusEnum.NEW_ORDER.getStatus());
statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus());
@@ -303,6 +297,7 @@ public class PlateServiceImpl implements PlateService {
.eq("o.deleted",false)
.in("o.status",statusList)
.isNull("opi.plan_id")
.isNotNull("op.id")
.inIfPresent("op.goods_id",pageReqVO.getGoodsIdList())
.likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null)
@@ -323,7 +318,6 @@ public class PlateServiceImpl implements PlateService {
.likeIfPresent("op.remark",pageReqVO.getRemark())
.orderByDesc("o.id");
List<Long> plateCount = orderMapper.selectNoPlanOrderPlateCount(queryWrapperX);
List<PlateResList> plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX,pageNo,pageReqVO.getPageSize());
@@ -332,17 +326,15 @@ public class PlateServiceImpl implements PlateService {
return new PageResult<>();
}
// List<Long> plateIds = plateResLists.stream().map(PlateResList::getPlateId).toList();
//
// List<OrderModelDO> orderModelDOS = esUtils.getEsDocument(FIELD_PLATE_ID, plateIds, plateIds.size(), ORDER_PLATE_MODEL, OrderModelDO.class);
//
//
// PlateModelDetailRespVO.builder()
// .plateResLists(new PageResult<>(plateResLists, (long) plateCount.size()))
// .plateModels(orderModelDOS)
// .build();
return new PageResult<>(plateResLists, (long) plateCount.size());
queryWrapperX
.groupBy("o.id");
List<Long> plateCount = orderMapper.selectNoPlanOrderPlateCount(queryWrapperX);
long sum = plateCount.stream().mapToLong(Long::longValue).sum();
return new PageResult<>(plateResLists, sum);
}
@@ -557,62 +549,4 @@ public class PlateServiceImpl implements PlateService {
}
private static void goodsFilter(List<String> filters, List<GoodsDO> goodsDOS,GoodsPlateFilterPageReqVO pageReqVO) {
int goodsNum = goodsDOS.size();
// 查询条件
Map<String, Function<GoodsDO, ?>> attributeGetters = new HashMap<>();
attributeGetters.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), GoodsDO::getThickness);
attributeGetters.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), GoodsDO::getMaterial);
attributeGetters.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), GoodsDO::getColor);
attributeGetters.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), GoodsDO::getTexture);
attributeGetters.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), GoodsDO::getBrand);
attributeGetters.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), GoodsDO::getWidth);
attributeGetters.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), GoodsDO::getHeight);
// 赋值
Map<String, Consumer<Object>> attributeSetters = new HashMap<>();
attributeSetters.put(GoodsFilterConditionsEnum.THICKNESS.getFilterField(), value -> pageReqVO.setThickness((BigDecimal) value));
attributeSetters.put(GoodsFilterConditionsEnum.MATERIAL.getFilterField(), value -> pageReqVO.setMaterial((String) value));
attributeSetters.put(GoodsFilterConditionsEnum.COLOR.getFilterField(), value -> pageReqVO.setColor((String) value));
// attributeSetters.put(GoodsFilterConditionsEnum.TEXTURE.getFilterField(), value -> pageReqVO.setTexture((Boolean) value));
// attributeSetters.put(GoodsFilterConditionsEnum.BRAND.getFilterField(), value -> pageReqVO.setBrand((String) value));
// attributeSetters.put(GoodsFilterConditionsEnum.WIDTH.getFilterField(), value -> pageReqVO.setWidth((BigDecimal) value));
// attributeSetters.put(GoodsFilterConditionsEnum.HEIGHT.getFilterField(), value -> pageReqVO.setHeight((BigDecimal) value));
for (String filter : filters) {
Function<GoodsDO, ?> getter = attributeGetters.get(filter);
Consumer<Object> setter = attributeSetters.get(filter);
if (getter == null || setter == null) {
throw exception(PLAN_MIXED_DATA_ERROR);
}
// 获取当前属性的第一个值
Object attributeValue = goodsDOS.stream()
.map(getter)
.findFirst()
.orElse(null);
// 根据属性值过滤列表
long count = goodsDOS.stream()
.filter(good -> attributeValue.equals(getter.apply(good)))
.count();
if (goodsNum != count) {
throw exception(PLAN_MIXED_ORDER_ERROR,GoodsFilterConditionsEnum.getValueByKey(filter));
}
// 设置属性值
setter.accept(attributeValue);
}
}
}
@@ -412,12 +412,12 @@
select
op.id
count(op.id)
from orders o
left join order_plate op on o.organ_id = op.organ_id and o.id = op.order_id
left join order_plan_item opi on op.organ_id = opi.organ_id and op.order_id = opi.order_id and op.id = opi.plate_id
left join order_goods og on op.organ_id = og.organ_id and op.order_id = og.order_id and op.goods_id = og.id
left join order_plan_item opi on op.organ_id = opi.organ_id and op.order_id = opi.order_id and op.id = opi.plate_id
${ew.customSqlSegment}