1、混单创建排单提示小板已排单问题修复,创建混单order_plan真实使用大板商品赋值规则修改;2、优化真实大板查询修复;3、订单详情-配件/组件详情列表不显示修复;

This commit is contained in:
gaoqr
2025-07-02 17:05:34 +08:00
parent 13ba0f767a
commit d8d55652ee
7 changed files with 83 additions and 64 deletions
@@ -7,6 +7,7 @@ import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanPlateStatisticsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO;
@@ -123,6 +124,14 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
List<PlanDO> selectIsTopDownPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId);
/**
* 查询排单下的材质、颜色、品牌、厚度分组
* @param planId
* @param organId
* @return
*/
List<OrderGoodsResp> selectPlanGoodsList(@Param("planId") Long planId, @Param("organId") Long organId);
/**
* 统计涉及移除小板的排单下还存在的排单数量
*
@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum;
import com.cf.imes.framework.common.enums.OrderStatusEnum;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.common.enums.PlanTypeEnum;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.Assert.AssertUtils;
@@ -51,6 +52,7 @@ import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderPlateModel;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO;
import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
@@ -58,6 +60,7 @@ import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper;
import com.cf.imes.module.executor.enums.ErrorCodeConstants;
@@ -145,6 +148,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
@Resource
private PlanItemMapper planItemMapper;
@Resource
private PlateGoodMapper plateGoodMapper;
private static final String FIELD_ORDER_ID = "orderId";
private static final String FIELD_PLATE_ID = "plateId";
private static final String FIELD_PLAN_ID = "planId";
@@ -398,6 +404,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
List<OptimizeRemainPlate> optimizeRemainPlates = BeanUtils.toBean(remainPlateDOS, OptimizeRemainPlate.class);
// 查询混单实际请求大板信息
PlanActualGoodsModelDO planActualGoodsModelDO = null;
if (planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())) {
List<PlateGoodDO> plateGoodDOS = plateGoodMapper.selectGoodsByGoodsId(List.of(planDO.getGoodsId()), getUserOrganId());
if (CollUtil.isNotEmpty(plateGoodDOS)) {
planActualGoodsModelDO = BeanUtils.toBean(plateGoodDOS.get(0), PlanActualGoodsModelDO.class);
planActualGoodsModelDO.setPlanId(planId);
}
}
// 查询生产单对应的配件信息
List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
@@ -428,7 +443,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
.goodsList(goodsDOS)
.plateList(plateDetailRespVOS)
.plateModels(orderModelDOS)
.planActualGoodsModelDO(BeanUtil.copyProperties(goodsDOS.get(0), PlanActualGoodsModelDO.class))
.planActualGoodsModelDO(planActualGoodsModelDO)
.optimizeRemainPlates(optimizeRemainPlates)
.orderPartsRespVOS(printOrderPartsRespVOS)
.orderPartsRemarks(orderPartsRemarks)
@@ -56,7 +56,6 @@ import com.cf.imes.module.executor.util.elasticsearch.EsUtils;
import com.cf.imes.module.system.api.systemconfig.SystemConfigApi;
import com.cf.imes.module.system.api.systemconfig.dto.SystemConfigRespDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -69,7 +68,6 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
import java.util.stream.Stream;
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;
@@ -145,6 +143,8 @@ public class PlanServiceImpl implements PlanService {
private static final String FIELD_ORDER_DATE = "o.order_date";
private static final String FIELD_OP_ID = "op.id";
private static final String FIELD_OP_DELETED = "op.deleted";
private static final String ES_FIELD_NEWVALUE = "new_value";
private static final String ORDER_PLAN_PROCESS_SCHEME_STATUS_UPDATE_ERROR_MSG = "排单加工方案状态更新异常:";
@Override
@Transactional(rollbackFor = Exception.class)
@@ -340,19 +340,16 @@ public class PlanServiceImpl implements PlanService {
.set(PlateDO::getPlanId, 0L)
.set(PlateDO::getIsOptimized, false));
// 排单对应的商品id
String goodsId = planDO.getGoodsId();
String orderNos = Optional.ofNullable(planDO.getOrderNos()).orElse("[]");
// 排单下的订单号列表
Set<Long> planOrderIds = JSON.parseArray(orderNos).toJavaList(Long.class).stream().collect(Collectors.toSet());
orderIds.addAll(planOrderIds);
if (CollUtil.isNotEmpty(planOrderIds) && StringUtils.isNotEmpty(goodsId)) {
if (CollUtil.isNotEmpty(planOrderIds)) {
// 查询排单下所有订单材质order_goods
List<GoodsDO> goodsDO = goodsMapper.selectList(new LambdaQueryWrapper<GoodsDO>()
.in(GoodsDO::getOrderId, planOrderIds)
.eq(GoodsDO::getGoodsId, goodsId)
.eq(GoodsDO::getOrganId, getUserOrganId())
.eq(GoodsDO::getDeleted, false));
@@ -1334,7 +1331,7 @@ public class PlanServiceImpl implements PlanService {
))
.script(s -> s.inline(i -> i
.source("ctx._source.isNewInsertPlate = params.new_value")
.params("new_value", JsonData.of(Boolean.TRUE))
.params(ES_FIELD_NEWVALUE, JsonData.of(Boolean.TRUE))
));
UpdateByQueryRequest request = builder.build();
@@ -1461,7 +1458,7 @@ public class PlanServiceImpl implements PlanService {
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness()+ "|" + item.getGoodsId();
String key = item.getMaterial() + "|" + item.getThickness();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1478,7 +1475,7 @@ public class PlanServiceImpl implements PlanService {
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getThickness().toString()+ "|" + item.getGoodsId();
String key = item.getThickness().toString();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1541,7 +1538,7 @@ public class PlanServiceImpl implements PlanService {
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getGoodsId();
String key = item.getMaterial() + "|" + item.getThickness();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1562,7 +1559,7 @@ public class PlanServiceImpl implements PlanService {
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getThickness().toString()+ "|" + item.getGoodsId();
String key = item.getThickness().toString();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1585,7 +1582,7 @@ public class PlanServiceImpl implements PlanService {
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand() + "|" + item.getGoodsId();
String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1672,7 +1669,7 @@ public class PlanServiceImpl implements PlanService {
))
.script(s -> s.inline(i -> i
.source("ctx._source.isOptimized = params.new_value")
.params("new_value", JsonData.of(false))
.params(ES_FIELD_NEWVALUE, JsonData.of(false))
));
UpdateByQueryRequest request = builder.build();
@@ -1681,7 +1678,7 @@ public class PlanServiceImpl implements PlanService {
elasticsearchClient.updateByQuery(request);
}catch (Exception e){
log.error("排单加工方案状态更新异常:" + e.getMessage(), e);
log.error(ORDER_PLAN_PROCESS_SCHEME_STATUS_UPDATE_ERROR_MSG + e.getMessage(), e);
throw new ServiceException(DATA_DATA_ERROR);
}
@@ -1707,7 +1704,7 @@ public class PlanServiceImpl implements PlanService {
))
.script(s -> s.inline(i -> i
.source("ctx._source.planId = params.new_value")
.params("new_value", JsonData.of(planId))
.params(ES_FIELD_NEWVALUE, JsonData.of(planId))
));
UpdateByQueryRequest request = builder.build();
@@ -1716,7 +1713,7 @@ public class PlanServiceImpl implements PlanService {
elasticsearchClient.updateByQuery(request);
}catch (Exception e){
log.error("排单加工方案状态更新异常:"+e.getMessage());
log.error(ORDER_PLAN_PROCESS_SCHEME_STATUS_UPDATE_ERROR_MSG + e.getMessage(), e);
throw new ServiceException(DATA_DATA_ERROR);
}
@@ -1754,7 +1751,7 @@ public class PlanServiceImpl implements PlanService {
))
.script(s -> s.inline(i -> i
.source("ctx._source.planId = params.new_value")
.params("new_value", JsonData.of(0))
.params(ES_FIELD_NEWVALUE, JsonData.of(0))
));
UpdateByQueryRequest request = builder.build();
@@ -1763,7 +1760,7 @@ public class PlanServiceImpl implements PlanService {
elasticsearchClient.updateByQuery(request);
}catch (Exception e){
log.error("排单加工方案状态更新异常:"+e.getMessage());
log.error(ORDER_PLAN_PROCESS_SCHEME_STATUS_UPDATE_ERROR_MSG + e.getMessage(), e);
throw new ServiceException(DATA_DATA_ERROR);
}
@@ -1919,10 +1916,6 @@ public class PlanServiceImpl implements PlanService {
Long planId = (Long) identifierGenerator.nextId(null);
// String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand() + "|" + item.getGoodsId();
// 截取key中的goodsId
String goodsId = key.substring(key.lastIndexOf("|") + 1);
// 创建排单
planDOS.add(PlanDO.builder()
.id(planId)
@@ -1934,7 +1927,6 @@ public class PlanServiceImpl implements PlanService {
.status(PlanStatusEnum.NOCUTTING.getStatus())
.operator(loginUser.getNickname())
.planTime(LocalDateTime.now())
.goodsId(goodsId)
.build());
// 更新板件排单id & 统计更新order_goods的数量和面积
@@ -1961,7 +1953,7 @@ public class PlanServiceImpl implements PlanService {
for (List<Long> plateIdList : batchPlanPlateIdList) {
int updatePlateNum = plateMapper.update(new LambdaUpdateWrapper<PlateDO>()
.in(PlateDO::getId, plateIdList)
.eq(PlateDO::getPlanId, 0L)
.eq(PlateDO::getPlanId, 0)
.set(PlateDO::getPlanId, planId));
if (updatePlateNum != plateIdList.size()) {
throw new ServiceException(CREAT_PLAN_PLATE_DATA_ERROR);
@@ -23,6 +23,7 @@ import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
@@ -347,22 +348,17 @@ public class PlateServiceImpl implements PlateService {
AssertUtils.notEmpty(planDO, PLAN_NOT_EXISTS);
List<PlateGoodDO> planGoods = plateGoodMapper.selectList(new LambdaQueryWrapper<PlateGoodDO>()
.eq(PlateGoodDO::getGoodsId, planDO.getGoodsId())
.eq(PlateGoodDO::getOrganId, organId)
.eq(PlateGoodDO::getDeleted, false)
.orderByAsc(PlateGoodDO::getCreateTime));
List<OrderGoodsResp> goodsRespVOS = planMapper.selectPlanGoodsList(planId, organId);
AssertUtils.notEmpty(planGoods, PLAN_NOT_EXISTS);
AssertUtils.notEmpty(goodsRespVOS,PLAN_NOT_EXISTS);
PlateGoodDO planGood = planGoods.get(0);
String material = planGood.getMaterial();
List<String> material = goodsRespVOS.stream().map(OrderGoodsResp::getMaterial).distinct().toList();
String color = planGood.getColor();
List<String> color = goodsRespVOS.stream().map(OrderGoodsResp::getColor).distinct().toList();
String brand = planGood.getBrand();
List<String> brand = goodsRespVOS.stream().map(OrderGoodsResp::getBrand).distinct().toList();
Double thickness = planGood.getThickness();
List<BigDecimal> thickness = goodsRespVOS.stream().map(OrderGoodsResp::getThickness).distinct().toList();
// 混单
@@ -773,13 +769,11 @@ public class PlateServiceImpl implements PlateService {
}
private void mixedInsertQuery(NoPlanPlatePageReqVO pageReqVO,
PlanDO planDO,
String material,
Double thickness,
QueryWrapperX<OrderDO> queryWrapperX){
List<String> material,
List<BigDecimal> thickness,
QueryWrapperX<OrderDO> queryWrapperX) {
@@ -791,10 +785,10 @@ public class PlateServiceImpl implements PlateService {
if(planDO.getFilter().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){
queryWrapperX
.eqIfPresent(FIELD_OG_MATERIAL,material)
.inIfPresent(FIELD_OG_MATERIAL,material)
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS,thickness);
.inIfPresent(FIELD_OP_THICKNESS,thickness);
}
// 相同厚度
@@ -804,7 +798,7 @@ public class PlateServiceImpl implements PlateService {
.likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS,thickness);
.inIfPresent(FIELD_OP_THICKNESS,thickness);
}
@@ -812,16 +806,13 @@ public class PlateServiceImpl implements PlateService {
}
private void noMixedInsertQuery(NoPlanPlatePageReqVO pageReqVO,
PlanDO planDO,
String material,
String brand,
String color,
Double thickness,
QueryWrapperX<OrderDO> queryWrapperX){
List<String> material,
List<String> brand,
List<String> color,
List<BigDecimal> thickness,
QueryWrapperX<OrderDO> queryWrapperX) {
// 是否开启混单
if(Boolean.TRUE.equals(pageReqVO.getIsMixed())){
@@ -833,10 +824,10 @@ public class PlateServiceImpl implements PlateService {
// 相同材质和厚度 混单
if(pageReqVO.getMixedType().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){
queryWrapperX
.eqIfPresent(FIELD_OG_MATERIAL, material)
.inIfPresent(FIELD_OG_MATERIAL, material)
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS, thickness);
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
// 相同厚度 混单
@@ -845,15 +836,15 @@ public class PlateServiceImpl implements PlateService {
.likeIfPresent(FIELD_OG_MATERIAL, pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS, thickness);
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
}else {
queryWrapperX
.eqIfPresent(FIELD_OG_MATERIAL, material)
.eqIfPresent(FIELD_OG_BRAND, brand)
.eqIfPresent(FIELD_OG_COLOR, color)
.eqIfPresent(FIELD_OP_THICKNESS, thickness);
.inIfPresent(FIELD_OG_MATERIAL, material)
.inIfPresent(FIELD_OG_BRAND, brand)
.inIfPresent(FIELD_OG_COLOR, color)
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
@@ -37,11 +37,11 @@
og.remark,
orp.id as remainId
from order_plan op
join order_goods og on op.organ_id = og.organ_id and op.goods_id = og.goods_id
from order_plate op
join order_goods og on op.organ_id = og.organ_id and op.goods_id = og.id
left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id
where op.organ_id = #{organId} and op.id = #{planId}
where op.organ_id = #{organId} and op.plan_id = #{planId}
</select>
@@ -41,7 +41,7 @@
FROM order_item i
RIGHT JOIN `order_parts` p ON i.organ_id = p.organ_id AND i.order_id = p.order_id AND i.parts_id = p.id
RIGHT JOIN `order_body` ob ON i.organ_id = ob.organ_id AND i.order_id = ob.order_id AND i.body_id = ob.id
WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND ob.deleted = #{deleted} AND i.group_id = 0
WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND ob.deleted = #{deleted} AND (i.group_id is null or i.group_id = 0)
<if test="roomId != null and roomId.size() > 0">
AND i.room_id IN
<foreach item="roomIdItem" collection="roomId" open="(" separator="," close=")">
@@ -98,7 +98,7 @@
FROM `order_item` i
RIGHT JOIN `order_parts` p ON i.organ_id = p.organ_id AND i.order_id = p.order_id AND i.parts_id = p.id
RIGHT JOIN `order_body` ob ON i.organ_id = ob.organ_id AND i.order_id = ob.order_id AND i.body_id = ob.id
WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND ob.deleted = #{deleted} AND i.group_id is null AND p.category in
WHERE i.organ_id = #{organId} AND i.order_id = #{orderId} AND ob.deleted = #{deleted} AND (i.group_id is null or i.group_id = 0) AND p.category in
<foreach item="type" collection="types" open="(" separator="," close=")">
#{type}
</foreach>
@@ -260,6 +260,18 @@
</select>
<select id="selectPlanGoodsList"
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp">
select distinct og.thickness as thickness,
og.material as material,
og.color as color,
og.brand as brand
from order_plate op
left join order_goods og on op.organ_id = og.organ_id and opi.goods_id = og.id
where op.organ_id = #{organId}
and op.plan_id = #{planId};
</select>
<select id="countDeletePlanPlate" resultType="com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanPlateStatisticsRespVO">
select op.plan_id as planId,
count(op.id) as count