排单添加小板过滤,添加小板,删除小板Bug修改

This commit is contained in:
liuzhaotian
2025-03-07 11:32:26 +08:00
parent e401afc242
commit c6fec72adf
10 changed files with 362 additions and 154 deletions
@@ -29,6 +29,9 @@ public class PlanRespVO {
@ExcelProperty("排单状态:0 新单,1 板材已申请,2 开料中,3 已开料") @ExcelProperty("排单状态:0 新单,1 板材已申请,2 开料中,3 已开料")
private Integer status; private Integer status;
@Schema(description = "是否置顶")
private Boolean isTop;
@Schema(description = "是否已投产") @Schema(description = "是否已投产")
private Boolean isScheduled; private Boolean isScheduled;
@@ -32,6 +32,9 @@ public class PlateInfoVO {
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED)
private String material; private String material;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED)
private String brand;
@Schema(description = "排单ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "排单ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long planId; private Long planId;
@@ -26,6 +26,10 @@ public class NoPlanPlatePageReqVO extends PageParam {
private String orderId; private String orderId;
@Schema(description = "排单ID")
private Long planId;
@Schema(description = "板编号") @Schema(description = "板编号")
private String plateNo; private String plateNo;
@@ -52,6 +56,10 @@ public class NoPlanPlatePageReqVO extends PageParam {
private Integer thickness; private Integer thickness;
@Schema(description = "品牌-在排单界面添加板材时为必传的")
private String brand;
@Schema(description = "板名称") @Schema(description = "板名称")
private String plateName; private String plateName;
@@ -56,7 +56,7 @@ public class PlanDO extends BaseDO {
/** /**
* 板材过滤条件 * 板材过滤条件
*/ */
private String filter; private Integer filter;
/** /**
@@ -3,9 +3,11 @@ package com.cf.imes.module.executor.dal.mysql.plan;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; 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.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.OrderPlanStatisticsAreaRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize;
@@ -13,6 +15,8 @@ import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@@ -152,6 +156,14 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.eq(PlanDO::getOrganId,organId) .eq(PlanDO::getOrganId,organId)
.eq(PlanDO::getDeleted,false) .eq(PlanDO::getDeleted,false)
.eq(PlanDO::getIsTop,true) .eq(PlanDO::getIsTop,true)
.in(PlanDO::getStatus, Arrays.asList(PlanStatusEnum.NOCUTTING.getStatus(),PlanStatusEnum.OPENING.getStatus()))
.orderByAsc(PlanDO::getUpdateTime)); .orderByAsc(PlanDO::getUpdateTime));
} }
List<PlanDO> selectIsTopUpPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId);
List<PlanDO> selectIsTopDownPlan(@Param("updateTime") LocalDateTime updateTime,@Param("organId") Long organId);
List<OrderGoodsResp> selectPlanGoodsList(@Param("planId") Long planId, @Param("organId") Long organId);
} }
@@ -1650,6 +1650,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
if(OrderPlateCutStatusEnum.OPENING.getStatus().equals(cutedType) && !planDO.getStatus().equals(OrderPlateCutStatusEnum.OPENED.getStatus())){ if(OrderPlateCutStatusEnum.OPENING.getStatus().equals(cutedType) && !planDO.getStatus().equals(OrderPlateCutStatusEnum.OPENED.getStatus())){
planDO.setStatus(PlanStatusEnum.OPENING.getStatus()); planDO.setStatus(PlanStatusEnum.OPENING.getStatus());
planDO.setProduceTime(null);
List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds); List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds);
AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR); AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR);
@@ -115,8 +115,6 @@ public class PlanServiceImpl implements PlanService {
private static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model"; private static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model";
private static final String ORDER_PLATE_MODEL = "imes_order_optimize";
private static final String PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL = "imes_plan_process_scheme_optimize_model"; private static final String PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL = "imes_plan_process_scheme_optimize_model";
private static final String PLAN_ACTUAL_GOODS_MODEL = "imes_plan_actual_goods_model"; private static final String PLAN_ACTUAL_GOODS_MODEL = "imes_plan_actual_goods_model";
@@ -158,8 +156,6 @@ public class PlanServiceImpl implements PlanService {
List<PlanDO> planDOS = new ArrayList<>(); List<PlanDO> planDOS = new ArrayList<>();
List<Long> ids = new ArrayList<>();
List<Long> orderIds = new ArrayList<>(); List<Long> orderIds = new ArrayList<>();
List<Long> plateIds = new ArrayList<>(); List<Long> plateIds = new ArrayList<>();
@@ -173,58 +169,27 @@ public class PlanServiceImpl implements PlanService {
if (savePlanPlateList.getMixConfig() != null && Boolean.TRUE.equals(savePlanPlateList.getMixConfig().getIsMixed())) { if (savePlanPlateList.getMixConfig() != null && Boolean.TRUE.equals(savePlanPlateList.getMixConfig().getIsMixed())) {
// 混单时走的逻辑
Integer mixedType = Optional.ofNullable(savePlanPlateList.getMixConfig().getMixedType()).orElse(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType()); Integer mixedType = Optional.ofNullable(savePlanPlateList.getMixConfig().getMixedType()).orElse(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType());
// 混单时走的逻辑
List<SavePlanPlateList.PlateItemList> plateItemList = Optional.ofNullable(savePlanPlateList.getPlateItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR)); List<SavePlanPlateList.PlateItemList> plateItemList = Optional.ofNullable(savePlanPlateList.getPlateItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
List<SavePlanPlateList.GoodsItemList> goodsItemList = Optional.ofNullable(savePlanPlateList.getGoodsItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR)); List<SavePlanPlateList.GoodsItemList> goodsItemList = Optional.ofNullable(savePlanPlateList.getGoodsItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
List<PlanActualGoodsList> planActualGoodsLists = Optional.ofNullable(createReqVO.getPlanActualGoodsListList()).orElse(new ArrayList<>()); List<PlanActualGoodsList> planActualGoodsLists = Optional.ofNullable(createReqVO.getPlanActualGoodsListList()).orElse(new ArrayList<>());
Map<String, List<Long>> grouped = new HashMap<>();
if(CollUtil.isNotEmpty(planActualGoodsLists)) { // 混单时判断是否进行板材对应并创建排单
mixConfigPlateCorresponding(planActualGoodsLists,planActualGoodsModelDOS,planItemDOS,plateItemList,goodsItemList,planDOS,processId,loginUser,mixedType);
getCreatePlanMultipleGoodsList(planActualGoodsLists,planItemDOS,plateItemList,planActualGoodsModelDOS,planDOS,processId,loginUser);
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){
// 筛选出材质和厚度相同的大板
grouped = groupByMaterialAndThicknessEqualToOne(goodsItemList);
}else {
grouped = groupByThicknessEqualToOne(goodsItemList);
}
if(CollUtil.isNotEmpty(grouped)) {
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser);
}
}else {
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){
// 筛选出材质和厚度相同的大板
grouped = groupByMaterialAndThickness(goodsItemList);
}else {
// 筛选出厚度相同的大板
grouped = groupByThickness(goodsItemList);
}
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser);
}
// 获取所有的大板ID
ids.addAll(goodsItemList.stream().map(SavePlanPlateList.GoodsItemList::getId).distinct().toList());
// 获取所有的小板ID // 获取所有的小板ID
plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList()); plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList());
// 获取所有的生产单ID // 获取所有的生产单ID
orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList()); orderIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList());
} else { } else {
// 非混单 // 非混单
@@ -234,10 +199,9 @@ public class PlanServiceImpl implements PlanService {
// 查找材质和厚度和颜色相同的大板 // 查找材质和厚度和颜色相同的大板
Map<String, List<Long>> grouped = groupByMaterialAndThicknessAndColorAndBrand(goodsItemList); Map<String, List<Long>> grouped = groupByMaterialAndThicknessAndColorAndBrand(goodsItemList);
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser); createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType());
// 获取所有的大板ID
ids.addAll(goodsItemList.stream().map(SavePlanPlateList.GoodsItemList::getId).distinct().toList());
// 获取所有的小板ID // 获取所有的小板ID
plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList()); plateIds.addAll(plateItemList.stream().map(SavePlanPlateList.PlateItemList::getPlateId).toList());
// 获取所有的生产单ID // 获取所有的生产单ID
@@ -456,46 +420,13 @@ public class PlanServiceImpl implements PlanService {
IPage<PlanDO> planDOPageResult = new PageDTO<>(); IPage<PlanDO> planDOPageResult = new PageDTO<>();
// 是否进行翻页
if(pageReqVO.getIsUp() != null) { if(pageReqVO.getIsUp() != null) {
PlanDO planDO = planMapper.selectById(pageReqVO.getId()); planPageTurning(pageReqVO,planDOPageResult);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
if(planDO.getIsTop()){
}else {
List<PlanDO> plan = pageReqVO.getIsUp() ?
planMapper.selectPlanIds(planDO.getSort(), getUserOrganId()) :
planMapper.selectPlanIdsFalse(planDO.getSort(), getUserOrganId());
if (plan.isEmpty()) {
List<PlanDO> planDOS = planMapper.selectIsTopPlanList(getUserOrganId());
if(CollUtil.isEmpty(planDOS)) {
throw exception(NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE, pageReqVO.getIsUp() ? "" : "最后");
}
plan.add(planDOS.get(0));
}
planDOPageResult.setRecords(plan);
planDOPageResult.setTotal(1L);
}
}else { }else {
QueryWrapperX<PlanDO> queryWrapperX = new QueryWrapperX<>(); QueryWrapperX<PlanDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX queryWrapperX
.eq("op.organ_id",getUserOrganId()) .eq("op.organ_id",getUserOrganId())
@@ -1135,6 +1066,53 @@ public class PlanServiceImpl implements PlanService {
// 排单翻页
private void planPageTurning(PlanPageReqVO pageReqVO,IPage<PlanDO> planDOPageResult) {
PlanDO planDO = planMapper.selectById(pageReqVO.getId());
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
List<PlanDO> plan;
// 置顶时进行翻页
if(Boolean.TRUE.equals(planDO.getIsTop())){
plan = Boolean.TRUE.equals(pageReqVO.getIsUp()) ?
planMapper.selectIsTopUpPlan(planDO.getUpdateTime(), getUserOrganId()) :
planMapper.selectIsTopDownPlan(planDO.getUpdateTime(), getUserOrganId());
}
// 非置顶进行翻页
else {
plan = Boolean.TRUE.equals(pageReqVO.getIsUp()) ?
planMapper.selectPlanIds(planDO.getSort(), getUserOrganId()) :
planMapper.selectPlanIdsFalse(planDO.getSort(), getUserOrganId());
if (plan.isEmpty() && Boolean.TRUE.equals(pageReqVO.getIsUp())) {
List<PlanDO> planDOS = planMapper.selectIsTopPlanList(getUserOrganId());
AssertUtils.notEmpty(planDOS,NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE,Boolean.TRUE.equals(pageReqVO.getIsUp()) ? "" : "最后");
plan.add(planDOS.get(0));
}
}
AssertUtils.notEmpty(plan,NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE,Boolean.TRUE.equals(pageReqVO.getIsUp()) ? "" : "最后");
planDOPageResult.setRecords(plan);
planDOPageResult.setTotal(1L);
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -1168,7 +1146,7 @@ public class PlanServiceImpl implements PlanService {
AssertUtils.notEmpty(deletePlateIds,DELETE_PLAN_PLATE_DATA_ERROR); AssertUtils.notEmpty(deletePlateIds,DELETE_PLAN_PLATE_DATA_ERROR);
List<Long> deleteOrderIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getOrderId).toList(); List<Long> deleteOrderIds = deleteOrderPlateIds.stream().map(OrderPlateIds::getOrderId).distinct().toList();
AssertUtils.notEmpty(deleteOrderIds,DELETE_PLAN_PLATE_DATA_ERROR); AssertUtils.notEmpty(deleteOrderIds,DELETE_PLAN_PLATE_DATA_ERROR);
@@ -1252,7 +1230,7 @@ public class PlanServiceImpl implements PlanService {
// 查询排单对应的小板ID的数量 // 查询排单对应的小板ID的数量
List<PlanItemDO> planItemDOS = planItemMapper.selectPlanPlateList(deletePlanIds, deleteOrderIds, getUserOrganId()); List<PlanItemDO> planItemDOS = planItemMapper.selectPlanPlateList(deletePlanIds, null, getUserOrganId());
List<Long> planIds = planItemDOS.stream().map(PlanItemDO::getPlanId).distinct().toList(); List<Long> planIds = planItemDOS.stream().map(PlanItemDO::getPlanId).distinct().toList();
@@ -1278,17 +1256,14 @@ public class PlanServiceImpl implements PlanService {
List<PlanDO> planDOList = planDOS.stream().filter(f -> planIds.contains(f.getId())).toList(); List<PlanDO> planDOList = planDOS.stream().filter(f -> planIds.contains(f.getId())).toList();
List<Long> planOrderIds = planItemDOS.stream().map(PlanItemDO::getOrderId).distinct().toList();
if(planOrderIds.size() != deleteOrderIds.size()){ planDOList.forEach(f->{
String string = planItemDOS.stream().filter(p -> f.getId().equals(p.getPlanId())).map(PlanItemDO::getOrderId).distinct().toList().toString();
f.setOrderNos(string);
});
planDOList.forEach(f->{ planMapper.updateBatch(planDOList);
f.setOrderNos(planItemDOS.stream().filter(p->f.getId().equals(p.getPlanId())).map(PlanItemDO::getOrderId).distinct().toString());
});
planMapper.updateBatch(planDOList);
}
} }
@@ -1361,6 +1336,8 @@ public class PlanServiceImpl implements PlanService {
planItemMapper.insertBatch(planItemDOS); planItemMapper.insertBatch(planItemDOS);
planMapper.updateBatch(planDOS);
} }
@@ -1518,6 +1495,61 @@ public class PlanServiceImpl implements PlanService {
// 混单时判断是否进行板材对应并创建排单
private void mixConfigPlateCorresponding(List<PlanActualGoodsList> planActualGoodsLists,
List<PlanActualGoodsModelDO> planActualGoodsModelDOS,
List<PlanItemDO> planItemDOS,
List<SavePlanPlateList.PlateItemList> plateItemList,
List<SavePlanPlateList.GoodsItemList> goodsItemList,
List<PlanDO> planDOS,
Long processId,
LoginUser loginUser,
Integer mixedType){
Map<String, List<Long>> grouped;
if(CollUtil.isNotEmpty(planActualGoodsLists)) {
getCreatePlanMultipleGoodsList(planActualGoodsLists,planItemDOS,plateItemList,planActualGoodsModelDOS,planDOS,processId,loginUser);
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){
// 筛选出材质和厚度相同的大板
grouped = groupByMaterialAndThicknessEqualToOne(goodsItemList);
}else {
grouped = groupByThicknessEqualToOne(goodsItemList);
}
if(CollUtil.isNotEmpty(grouped)) {
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType());
}
}else {
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){
// 筛选出材质和厚度相同的大板
grouped = groupByMaterialAndThickness(goodsItemList);
}else {
// 筛选出厚度相同的大板
grouped = groupByThickness(goodsItemList);
}
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser,PlanTypeEnum.ORDERPLAN.getType());
}
planDOS.forEach(f->f.setFilter(f.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType()) ? mixedType : 0));
}
private void updateProcessSchemeStatus(List<Long> planIds) { private void updateProcessSchemeStatus(List<Long> planIds) {
@@ -1618,12 +1650,12 @@ public class PlanServiceImpl implements PlanService {
private void getCreatePlanMultipleGoodsList(List<PlanActualGoodsList> planActualGoodsLists, private void getCreatePlanMultipleGoodsList(List<PlanActualGoodsList> planActualGoodsLists,
List<PlanItemDO> planItemDOS, List<PlanItemDO> planItemDOS,
List<SavePlanPlateList.PlateItemList> plateItemList, List<SavePlanPlateList.PlateItemList> plateItemList,
List<PlanActualGoodsModelDO> planActualGoodsModelDOS , List<PlanActualGoodsModelDO> planActualGoodsModelDOS ,
List<PlanDO> planDOS, List<PlanDO> planDOS,
Long processId, Long processId,
LoginUser loginUser) { LoginUser loginUser) {
planActualGoodsLists.forEach(f -> { planActualGoodsLists.forEach(f -> {
@@ -1674,11 +1706,12 @@ public class PlanServiceImpl implements PlanService {
private void createPlanAndPlateDataList(Map<String, List<Long>> grouped, private void createPlanAndPlateDataList(Map<String, List<Long>> grouped,
List<PlanItemDO> planItemDOS, List<PlanItemDO> planItemDOS,
List<SavePlanPlateList.PlateItemList> plateItemList, List<SavePlanPlateList.PlateItemList> plateItemList,
List<PlanDO> planDOS, List<PlanDO> planDOS,
Long processId, Long processId,
LoginUser loginUser){ LoginUser loginUser,
Integer planType){
AtomicLong sort = new AtomicLong(System.currentTimeMillis()); AtomicLong sort = new AtomicLong(System.currentTimeMillis());
@@ -1698,7 +1731,7 @@ public class PlanServiceImpl implements PlanService {
planDOS.add(PlanDO.builder() planDOS.add(PlanDO.builder()
.id(planId) .id(planId)
.sort(sort.get()) .sort(sort.get())
.type(PlanTypeEnum.MIXEDORDERPLAN.getType()) .type(planType)
.processId(processId) .processId(processId)
.orderNos(orderIdList.toString()) .orderNos(orderIdList.toString())
.produceTime(null) .produceTime(null)
@@ -10,8 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.MixConfigTypeEnum;
import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum;
import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum;
import com.cf.imes.framework.common.enums.PlanTypeEnum;
import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.PageResult;
@@ -25,6 +27,7 @@ import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO; import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
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.plan.vo.PlateResList;
import com.cf.imes.module.executor.controller.admin.plate.vo.*; import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
@@ -46,6 +49,7 @@ 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.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderItemType; import com.cf.imes.module.executor.enums.OrderItemType;
import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.executor.service.order.OrderInputProcessor;
import com.cf.imes.module.executor.service.plan.PlanService; import com.cf.imes.module.executor.service.plan.PlanService;
import com.cf.imes.module.executor.util.elasticsearch.EsUtils; import com.cf.imes.module.executor.util.elasticsearch.EsUtils;
import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.cf.imes.module.system.enums.ErrorCodeConstants;
@@ -65,6 +69,7 @@ import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_EXISTS;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*;
/** /**
* 生产单板件 Service 实现类 * 生产单板件 Service 实现类
@@ -113,6 +118,9 @@ public class PlateServiceImpl implements PlateService {
@Resource @Resource
private ESDocumentService esDocumentService; private ESDocumentService esDocumentService;
@Resource
private OrderInputProcessor orderInputProcessor;
@Resource @Resource
private EsUtils esUtils; private EsUtils esUtils;
@@ -124,6 +132,10 @@ public class PlateServiceImpl implements PlateService {
private static final String ORDER_PLATE_MODEL = "imes_order_plate_model"; private static final String ORDER_PLATE_MODEL = "imes_order_plate_model";
private static final String FIELD_PLATE_ID = "plateId"; private static final String FIELD_PLATE_ID = "plateId";
private static final String FIELD_OG_MATERIAL = "og.material";
private static final String FIELD_OG_BRAND = "og.brand";
private static final String FIELD_OG_COLOR = "og.color";
private static final String FIELD_OP_THICKNESS = "op.thickness";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -306,7 +318,6 @@ public class PlateServiceImpl implements PlateService {
statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus()); statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus());
statusList.add(OrderStatusEnum.SORTED.getStatus()); statusList.add(OrderStatusEnum.SORTED.getStatus());
Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize();
QueryWrapperX<OrderDO> queryWrapperX = new QueryWrapperX<>(); QueryWrapperX<OrderDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX queryWrapperX
@@ -314,20 +325,84 @@ public class PlateServiceImpl implements PlateService {
.eq("o.deleted",false) .eq("o.deleted",false)
.in("o.status",statusList) .in("o.status",statusList)
.isNull("opi.plan_id") .isNull("opi.plan_id")
.isNotNull("op.id") .isNotNull("op.id");
if(pageReqVO.getPlanId() != null){
Long planId = pageReqVO.getPlanId();
List<OrderGoodsResp> goodsRespVOS = planMapper.selectPlanGoodsList(planId, getUserOrganId());
AssertUtils.notEmpty(goodsRespVOS,PLAN_NOT_EXISTS);
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS);
List<String> material = goodsRespVOS.stream().map(OrderGoodsResp::getMaterial).distinct().toList();
List<String> color = goodsRespVOS.stream().map(OrderGoodsResp::getColor).distinct().toList();
List<String> brand = goodsRespVOS.stream().map(OrderGoodsResp::getBrand).distinct().toList();
List<BigDecimal> thickness = goodsRespVOS.stream().map(OrderGoodsResp::getThickness).distinct().toList();
// 混单
if(planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())){
// 相同材质和厚度
if(planDO.getFilter().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){
queryWrapperX
.inIfPresent(FIELD_OG_MATERIAL,material)
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS,thickness);
}
// 相同厚度
else {
queryWrapperX
.likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS,thickness);
}
}
// 非混单
else {
queryWrapperX
.inIfPresent(FIELD_OG_MATERIAL,material)
.inIfPresent(FIELD_OG_BRAND,brand)
.inIfPresent(FIELD_OG_COLOR,color)
.inIfPresent(FIELD_OP_THICKNESS,thickness);
}
}
// 无排单ID时
else {
queryWrapperX
.likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS,pageReqVO.getThickness());
}
queryWrapperX
.inIfPresent("op.goods_id",pageReqVO.getGoodsIdList()) .inIfPresent("op.goods_id",pageReqVO.getGoodsIdList())
.likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null) .likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null)
.likeIfPresent("op.id",pageReqVO.getPlateId()) .likeIfPresent("op.id",pageReqVO.getPlateId())
.likeIfPresent("op.name",pageReqVO.getPlateName()) .likeIfPresent("op.name",pageReqVO.getPlateName())
.likeIfPresent("op.plate_no",pageReqVO.getPlateNo()) .likeIfPresent("op.plate_no",pageReqVO.getPlateNo())
.likeIfPresent("op.custom_plate_no",pageReqVO.getCustomPlateNo()) .likeIfPresent("op.custom_plate_no",pageReqVO.getCustomPlateNo())
.likeIfPresent("og.material",pageReqVO.getMaterial())
.likeIfPresent("og.color",pageReqVO.getColor())
.eqIfPresent("op.thickness",pageReqVO.getThickness())
.betweenIfPresent("op.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()}) .betweenIfPresent("op.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()})
.betweenIfPresent("op.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()}) .betweenIfPresent("op.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()})
.betweenIfPresent("op.thickness", new BigDecimal[]{pageReqVO.getThicknessMinRang(), pageReqVO.getThicknessMaxRang()}) .betweenIfPresent(FIELD_OP_THICKNESS, new BigDecimal[]{pageReqVO.getThicknessMinRang(), pageReqVO.getThicknessMaxRang()})
.eqIfPresent("op.texture",pageReqVO.getTexture()) .eqIfPresent("op.texture",pageReqVO.getTexture())
.eqIfPresent("op.is_special_shaped",pageReqVO.getIsSpecialShaped()) .eqIfPresent("op.is_special_shaped",pageReqVO.getIsSpecialShaped())
.eqIfPresent("op.is_sculpt",pageReqVO.getIsSculpt()) .eqIfPresent("op.is_sculpt",pageReqVO.getIsSculpt())
@@ -336,6 +411,9 @@ public class PlateServiceImpl implements PlateService {
.orderByDesc("o.id"); .orderByDesc("o.id");
Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize();
List<PlateResList> plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX,pageNo,pageReqVO.getPageSize()); List<PlateResList> plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX,pageNo,pageReqVO.getPageSize());
if(CollUtil.isEmpty(plateResLists)){ if(CollUtil.isEmpty(plateResLists)){
@@ -456,6 +534,8 @@ public class PlateServiceImpl implements PlateService {
List<OrderBodyNumVO> orderBodyNumVOS = new ArrayList<>(); List<OrderBodyNumVO> orderBodyNumVOS = new ArrayList<>();
List<OrderModelDO> orderPlateModelDOS = new ArrayList<>();
List<String> goodsIds = new ArrayList<>(reqVO.stream().map(OptimizationSavePlateReqVO::getGoodsId).distinct().toList()); List<String> goodsIds = new ArrayList<>(reqVO.stream().map(OptimizationSavePlateReqVO::getGoodsId).distinct().toList());
List<Long> orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList(); List<Long> orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList();
@@ -510,60 +590,71 @@ public class PlateServiceImpl implements PlateService {
.plateNum(f.getMultiple()) .plateNum(f.getMultiple())
.build()); .build());
for (int i = 0; i < f.getMultiple(); i++) {
// 生成板编号 // 生成板编号
long obtainingTime = SnowflakeIdWorker3rd.obtainingTime(); long obtainingTime = SnowflakeIdWorker3rd.obtainingTime();
String plateNo = (obtainingTime) + Long.toString(idWorker.nextId()).substring(2); String plateNo = (obtainingTime) + Long.toString(idWorker.nextId()).substring(2);
plateNoList.add(plateNo); plateNoList.add(plateNo);
String remake1 = f.getRemake1() == null ? "" : f.getRemake1() + ";"; String remake1 = f.getRemake1() == null ? "" : f.getRemake1() + ";";
String remake2 = f.getRemake2() == null ? "" : f.getRemake2(); String remake2 = f.getRemake2() == null ? "" : f.getRemake2();
// 小板ID // 小板ID
Long plateId = (Long) identifierGenerator.nextId(null); Long plateId = (Long) identifierGenerator.nextId(null);
plateDOS.add(PlateDO.builder()
.id(plateId)
.orderId(orderId)
.name(f.getName())
.plateNo(plateNo)
.type(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())
.isOptimized(true)
.thickness(goodsDO.getThickness())
.goodsId(goodsDO.getId())
.holeArrange(f.getPlaceHole())
.remark(remake1 + remake2)
.area(f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros())
.width(f.getWidth())
.height(f.getHeight())
.texture(f.getTexture())
.sealLeft(f.getSealLeft())
.sealRight(f.getSealRight())
.sealUp(f.getSealUp())
.sealDown(f.getSealDown())
.build());
// 生产单明细表新增数据 plateDOS.add(PlateDO.builder()
orderItemDOS.add(OrderItemDO.builder() .id(plateId)
.orderId(f.getOrderId()) .orderId(orderId)
.type(OrderItemType.BOARD.getCode()) .name(f.getName())
.roomId(f.getRoomId()) .plateNo(plateNo)
.bodyId(f.getBodyId()) .type(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())
.plateId(plateId) .isOptimized(true)
.build()); .thickness(goodsDO.getThickness())
.goodsId(goodsDO.getId())
.holeFace(f.getPlaceHole())
.remark(remake1 + remake2)
.area(f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros())
.width(f.getWidth())
.height(f.getHeight())
.texture(f.getTexture())
.sealLeft(f.getSealLeft())
.sealRight(f.getSealRight())
.sealUp(f.getSealUp())
.sealDown(f.getSealDown())
.build());
planItemDOS.add(PlanItemDO.builder()
.planId(f.getPlanId())
.goodsId(goodsDO.getId())
.orderId(f.getOrderId())
.plateId(plateId)
.build());
} // 生产单造型数据
orderPlateModelDOS.add(OrderModelDO.builder()
.plateId(plateId)
.orderId(orderId)
.goodsId(goodsDO.getGoodsId())
.plateGoodsId(goodsDO.getId())
.texture(f.getTexture())
.boardType(OrderPlateTypeEnum.SELFINCREASINGBOARD.getDescription())
.build());
// 生产单明细表新增数据
orderItemDOS.add(OrderItemDO.builder()
.orderId(f.getOrderId())
.type(OrderItemType.BOARD.getCode())
.roomId(f.getRoomId())
.bodyId(f.getBodyId())
.plateId(plateId)
.build());
planItemDOS.add(PlanItemDO.builder()
.planId(f.getPlanId())
.goodsId(goodsDO.getId())
.orderId(f.getOrderId())
.plateId(plateId)
.build());
insertPlateRespVOS.add(InsertPlateRespVO.builder() insertPlateRespVOS.add(InsertPlateRespVO.builder()
.blockKey(f.getBlockKey()) .blockKey(f.getBlockKey())
@@ -600,6 +691,8 @@ public class PlateServiceImpl implements PlateService {
orderItemMapper.insertBatch(orderItemDOS); orderItemMapper.insertBatch(orderItemDOS);
orderInputProcessor.batchSaveModel(orderPlateModelDOS);
return insertPlateRespVOS; return insertPlateRespVOS;
} }
@@ -102,9 +102,10 @@
FROM order_plan FROM order_plan
WHERE organ_id = #{organId} WHERE organ_id = #{organId}
AND deleted = false and deleted = false
and is_top = false and is_top = false
and sort &lt; #{sort} and status in (0,1)
and sort &lt; #{sort}
ORDER BY sort desc ORDER BY sort desc
limit 1; limit 1;
@@ -120,6 +121,7 @@
WHERE organ_id = #{organId} WHERE organ_id = #{organId}
AND deleted = false AND deleted = false
and is_top = false and is_top = false
and status in (0,1)
and sort &gt; #{sort} and sort &gt; #{sort}
ORDER BY sort ORDER BY sort
limit 1; limit 1;
@@ -225,4 +227,56 @@
</select> </select>
<select id="selectIsTopUpPlan" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select *
from order_plan
where organ_id = #{organId}
and deleted = false
and is_top = true
and status in (0,1)
and update_time &gt; #{updateTime}
order by update_time
limit 1;
</select>
<select id="selectIsTopDownPlan" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select *
from order_plan
where organ_id = #{organId}
and deleted = false
and status in (0,1)
and update_time &lt; #{updateTime}
ORDER BY is_top DESC,
CASE WHEN is_top = true THEN update_time END DESC,
CASE WHEN is_top = false THEN sort END
limit 1;
</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_plan_item opi
left join order_goods og on opi.goods_id = og.id and og.organ_id = #{organId}
where opi.organ_id = #{organId}
and opi.plan_id = #{planId};
</select>
</mapper> </mapper>
@@ -49,6 +49,7 @@
<result property="height" column="height"/> <result property="height" column="height"/>
<result property="thickness" column="thickness"/> <result property="thickness" column="thickness"/>
<result property="color" column="color"/> <result property="color" column="color"/>
<result property="brand" column="brand"/>
<collection property="platePages" ofType="com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage" resultMap="PlatePageMap"/> <collection property="platePages" ofType="com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage" resultMap="PlatePageMap"/>
@@ -71,7 +72,7 @@
og.material as material, og.material as material,
og.thickness as thickness , og.thickness as thickness ,
og.color as color, og.color as color,
og.brand as brand,
oi.plate_id as plateId, oi.plate_id as plateId,
op.area as plateArea op.area as plateArea