未排单创建排单新需求接口逻辑更改,相关接口逻辑更改,排单排序接口修改

This commit is contained in:
liuzhaotian
2025-02-21 15:23:27 +08:00
parent 17971a98dd
commit 405be1af0d
41 changed files with 897 additions and 294 deletions
@@ -140,7 +140,7 @@ public class OrderPlanApiImpl implements OrderPlanApi{
List<Long> planIds = planItemDOS.stream().map(PlanItemDO::getPlanId).distinct().toList();
List<Long> planDOS = planMapper.selectPLanList(planIds,getUserOrganId());
List<Long> planDOS = planMapper.selectPlanList(planIds,getUserOrganId());
if(CollUtil.isEmpty(planDOS)){
return CommonResult.success(true);
@@ -111,8 +111,11 @@ public class PlanController {
@PostMapping("/setSort")
@Operation(summary = "设置排单优先级")
@PreAuthorize("@ss.hasPermission('placeorder:priority')")
public CommonResult<Boolean> setSort(@Valid @NotEmpty(message = "参数不能空") @RequestBody List<SortVO> sortVos) {
return success(planService.setSort(sortVos));
public CommonResult<Boolean> setSort(@Valid @NotEmpty(message = "参数不能空") @Size(max = 2,message = "做多两条数据") @RequestBody List<SortVO> sortVos) {
planService.setSort(sortVos);
return success(Boolean.TRUE);
}
@@ -1,19 +0,0 @@
package com.cf.imes.module.executor.controller.admin.plan.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class GoodsNum {
@Schema(description = "生产单ID")
private Long orderId;
@Schema(description = "商品数量")
private Long goodsNum;
}
@@ -7,6 +7,7 @@ import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrder
import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetailRespVO;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.goods.PlanActualGoodsModelDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
@@ -64,11 +65,13 @@ public class OrderSource {
private List<OrderPartsRemark> orderPartsRemarks;
@Schema(description = "生产单包裹信息")
private List<PrintOrderPackReqVO> orderPackReqVOS;
@Schema(description = "混单时选择的实际的大板信息")
private PlanActualGoodsModelDO planActualGoodsModelDO;
}
@@ -0,0 +1,18 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class MixConfig {
@Schema(description = "是否开启混单,true 开启 false 关闭")
private Boolean isMixed;
@Schema(description = "混单方式 1 相同材质和厚度 2 相同厚度")
private Integer mixedType;
}
@@ -0,0 +1,27 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.module.executor.dal.dataobject.goods.PlanActualGoodsModelDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PlanActualGoodsList {
@Schema(description = "大板的分类ID")
private List<Long> ids;
@Schema(description = "混单时选择的实际的大板信息")
private PlanActualGoodsModelDO planActualGoodsModelDO;
}
@@ -0,0 +1,29 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PlanActualGoodsResp {
@Schema(description = "大板的分类ID")
private List<Long> ids;
@Schema(description = "页面显示的大板信息")
private List<GoodsRespVO> goodsRespVOS;
}
@@ -26,7 +26,8 @@ public class PlanSaveReqVO {
@Schema(description = "是否已投产")
private Boolean isScheduled;
@Schema(description = "需要进行排单的板材信息")
@Schema(description = "需要进行排单的板材信息-数据不改变")
private SavePlanPlateList savePlanPlateList;
@@ -42,4 +43,8 @@ public class PlanSaveReqVO {
private List<OrderPlateIds> deleteOrderPlateIds;
@Schema(description = "混单创建排单时选择的实际的大板信息")
private List<PlanActualGoodsList> planActualGoodsListList;
}
@@ -60,6 +60,8 @@ public class PlateResList {
private String material;
@Schema(description = "纹路")
private Integer texture;
@Schema(description = "品牌")
private String brand;
@Schema(description = "备注")
private String remark;
}
@@ -16,6 +16,9 @@ import java.util.List;
public class SavePlanPlateList {
@Schema(description = "混单的配置项",requiredMode = Schema.RequiredMode.REQUIRED)
private MixConfig mixConfig;
@Schema(description = "小板的信息列表",requiredMode = Schema.RequiredMode.REQUIRED)
@Valid
@@ -74,6 +77,9 @@ public class SavePlanPlateList {
private String color;
@Schema(description = "大板的品牌")
private String brand;
}
}
@@ -12,6 +12,8 @@ import javax.validation.constraints.NotNull;
@Data
@Valid
public class SortVO {
@Schema(description = "排单id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "排单id 不能空")
private Long planId;
@@ -20,8 +22,13 @@ public class SortVO {
@NotNull(message = "排序不能空")
private Long sort;
@Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED,example = "false")
// @NotNull(message = "是否置顶不能空")
private Boolean isTopUp;
@Schema(description = "是否第一条数据",example = "false")
private Boolean isOnePlan;
}
@@ -22,12 +22,12 @@ public class GoodsPlateFilterPageReqVO extends PageParam {
@Schema(description = "排单ID",requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "排单ID不能为空")
// @NotNull(message = "排单ID不能为空")
private Long planId;
@Schema(description = "厚度",requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "厚度不能为空")
// @NotNull(message = "厚度不能为空")
private BigDecimal thickness;
@@ -37,7 +37,7 @@ public class GoodsPlateFilterPageReqVO extends PageParam {
@Schema(description = "颜色",requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "颜色不能为空")
// @NotNull(message = "颜色不能为空")
private String color;
@@ -0,0 +1,56 @@
package com.cf.imes.module.executor.dal.dataobject.goods;
import com.cf.imes.framework.es.core.dal.ESDocument;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "混单选择的实际的大板信息")
public class PlanActualGoodsModelDO extends ESDocument {
@Schema(description = "排单ID")
private Long planId;
@Schema(description = "商品 ID")
private String goodsId;
@Schema(description = "商品名称")
private String goodsName;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板")
private String material;
@Schema(description = "颜色")
private String color;
@Schema(description = "品牌")
private String brand;
@Schema(description = "厚度")
private BigDecimal thickness;
// @Schema(description = "纹路")
// private Integer texture;
//
// @Schema(description = "宽度")
// private BigDecimal width;
//
// @Schema(description = "高度")
// private BigDecimal height;
//
// @Schema(description = "规格")
// private String spec;
}
@@ -43,6 +43,11 @@ public class PlanDO extends BaseDO {
*/
private Integer status;
/**
* 是否置顶,0 未置顶 1 已置顶
*/
private Boolean isTop;
/**
* 是否已投产:0未投产,1已投产
*/
@@ -8,6 +8,7 @@ import com.cf.imes.framework.common.pojo.PageResult;
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.goods.vo.GoodsPageReqVO;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateIds;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO;
@@ -200,6 +201,8 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
}
List<GoodsRespVO> selectNoOrderPlanGoods(@Param("ids") List<Long> ids, @Param("organId") Long organId);
List<Long> selectInsertGoodsIds(@Param("orderIds") List<Long> orderIds,@Param("goodsIds") List<Long> goodsIds,@Param("organId") Long organId);
// 通过orderId查找板材
@@ -1,25 +1,20 @@
package com.cf.imes.module.executor.dal.mysql.plan;
import com.cf.imes.framework.common.pojo.PageResult;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
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.MPJLambdaWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
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.PlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
/**
* 生产单开料排单 Mapper
*
@@ -28,48 +23,52 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge
@Mapper
public interface PlanMapper extends BaseMapperX<PlanDO> {
default PageResult<PlanDO> selectPage(PlanPageReqVO reqVO) {
if(StringUtils.isNotBlank(reqVO.getCustomer())) {
return selectJoinPage(reqVO, PlanDO.class, new MPJLambdaWrapperX<PlanDO>()
.eq(PlanDO::getDeleted,false)
.eq(PlanDO::getOrganId,getUserOrganId())
.eqIfPresent(PlanDO::getIsScheduled,reqVO.getIsScheduled())
.eqIfPresent(PlanDO::getId, reqVO.getId())
.eqIfPresent(PlanDO::getSort, reqVO.getSort())
.eqIfPresent(PlanDO::getType, reqVO.getType())
.inIfPresent(PlanDO::getStatus, reqVO.getStatus())
.eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId())
.betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime())
.likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos())
.eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
.betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(PlanDO::getOperator, reqVO.getOperator())
.betweenIfPresent(PlanDO::getProduceTime, reqVO.getProduceTime())
.leftJoin(PlanItemDO.class, PlanItemDO::getPlanId, PlanDO::getId)
.leftJoin(OrderDO.class, OrderDO::getId, PlanItemDO::getOrderId)
.like(OrderDO::getCustomer, reqVO.getCustomer())
.orderByDesc(PlanDO::getCreateTime)
.distinct()
);
}
return selectPage(reqVO, new LambdaQueryWrapperX<PlanDO>()
.eq(PlanDO::getDeleted,false)
.eq(PlanDO::getOrganId,getUserOrganId())
.eqIfPresent(PlanDO::getIsScheduled,reqVO.getIsScheduled())
.eqIfPresent(PlanDO::getId, reqVO.getId())
.eqIfPresent(PlanDO::getSort, reqVO.getSort())
.eqIfPresent(PlanDO::getType, reqVO.getType())
.inIfPresent(PlanDO::getStatus, reqVO.getStatus())
.eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId())
.betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime())
.likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos())
.eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
.betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(PlanDO::getOperator, reqVO.getOperator())
.betweenIfPresent(PlanDO::getProduceTime, reqVO.getProduceTime())
.orderByDesc(PlanDO::getCreateTime));
}
IPage<PlanDO> selectPlanPageList(@Param("page") IPage page,@Param(Constants.WRAPPER) Wrapper<PlanDO> wrapper);
// default PageResult<PlanDO> selectPage(PlanPageReqVO reqVO) {
// if(StringUtils.isNotBlank(reqVO.getCustomer())) {
// return selectJoinPage(reqVO, PlanDO.class, new MPJLambdaWrapperX<PlanDO>()
// .eq(PlanDO::getDeleted,false)
// .eq(PlanDO::getOrganId,getUserOrganId())
// .eqIfPresent(PlanDO::getIsScheduled,reqVO.getIsScheduled())
// .eqIfPresent(PlanDO::getId, reqVO.getId())
// .eqIfPresent(PlanDO::getSort, reqVO.getSort())
// .eqIfPresent(PlanDO::getType, reqVO.getType())
// .inIfPresent(PlanDO::getStatus, reqVO.getStatus())
// .eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId())
// .betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime())
// .likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos())
// .eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
// .betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
// .eqIfPresent(PlanDO::getOperator, reqVO.getOperator())
// .betweenIfPresent(PlanDO::getProduceTime, reqVO.getProduceTime())
// .leftJoin(PlanItemDO.class, PlanItemDO::getPlanId, PlanDO::getId)
// .leftJoin(OrderDO.class, OrderDO::getId, PlanItemDO::getOrderId)
// .like(OrderDO::getCustomer, reqVO.getCustomer())
// .orderByDesc(PlanDO::getCreateTime)
// .distinct()
// );
// }
//
// return selectPage(reqVO, new LambdaQueryWrapperX<PlanDO>()
// .eq(PlanDO::getDeleted,false)
// .eq(PlanDO::getOrganId,getUserOrganId())
// .eqIfPresent(PlanDO::getIsScheduled,reqVO.getIsScheduled())
// .eqIfPresent(PlanDO::getId, reqVO.getId())
// .eqIfPresent(PlanDO::getSort, reqVO.getSort())
// .eqIfPresent(PlanDO::getType, reqVO.getType())
// .inIfPresent(PlanDO::getStatus, reqVO.getStatus())
// .eqIfPresent(PlanDO::getMachineId, reqVO.getMachineId())
// .betweenIfPresent(PlanDO::getPlanTime, reqVO.getPlanTime())
// .likeIfPresent(PlanDO::getOrderNos, reqVO.getOrderNos())
// .eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
// .betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
// .eqIfPresent(PlanDO::getOperator, reqVO.getOperator())
// .betweenIfPresent(PlanDO::getProduceTime, reqVO.getProduceTime())
// .orderByDesc(PlanDO::getCreateTime));
// }
List<PlateOptimize> selectPlateListByPlanId(@Param("planId") Long planId, @Param("organId") Long organId);
@@ -103,11 +102,11 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
List<PlanDO> selectPlanIds(@Param("createTime") String createTime,@Param("sort") Long sort,@Param("organId") Long organId,@Param("planId") Long planId);
List<PlanDO> selectPlanIds(@Param("sort") Long sort,@Param("organId") Long organId);
List<PlanDO> selectPlanIdsFalse(@Param("createTime") String createTime,@Param("sort") Long sort,@Param("organId") Long organId,@Param("planId") Long planId);
List<PlanDO> selectPlanIdsFalse(@Param("sort") Long sort,@Param("organId") Long organId);
List<PlanDO> selectPlanStatus(@Param("planIds") List<Long> planIds,@Param("organId") Long organId);
@@ -116,7 +115,7 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
List<Long> selectPLanList(@Param("planIds") List<Long> planIds, @Param("organId") Long organId);
List<Long> selectPlanList(@Param("planIds") List<Long> planIds, @Param("organId") Long organId);
@@ -129,13 +128,7 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
}
default List<PlanDO> selectPlanSortList(List<Integer> status,Long organId) {
return selectList( new LambdaQueryWrapperX<PlanDO>()
.eq(PlanDO::getOrganId,organId)
.eq(PlanDO::getDeleted,false)
.in(PlanDO::getStatus,status)
.orderByAsc(PlanDO::getSort));
}
List<PlanDO> selectPlanSortList(@Param("status") List<Integer> status,@Param("organId") Long organId);
@@ -147,4 +140,18 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.select(PlanDO::getId));
}
PlanDO selectSortOnePlan(@Param("sort") Long sort, @Param("organId") Long organId);
PlanDO selectLostPlan(@Param("sort") Long sort, @Param("organId") Long organId);
default List<PlanDO> selectIsTopPlanList(Long organId) {
return selectList( new LambdaQueryWrapperX<PlanDO>()
.eq(PlanDO::getOrganId,organId)
.eq(PlanDO::getDeleted,false)
.eq(PlanDO::getIsTop,true)
.orderByAsc(PlanDO::getUpdateTime));
}
}
@@ -45,11 +45,11 @@ public interface PlanItemMapper extends BaseMapperX<PlanItemDO> {
IPage<PlateResList> selectPlateListByPlateIds(@Param("page") IPage<PlateResList> page, @Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper);
IPage<OrderGoodsResp> selectNoPlanGoodsByRoomAndBodyIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper);
IPage<OrderGoodsResp> selectNoPlanGoodsByRoomAndBodyIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper,@Param("organId") Long organId);
IPage<OrderGoodsResp> selectNoPlanGoodsList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper);
IPage<OrderGoodsResp> selectNoPlanGoodsList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper,@Param("organId") Long organId);
List<OrderGoodsResp> selectNoOrderGoodsIdList(@Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper);
List<OrderGoodsResp> selectNoOrderGoodsIdList(@Param(Constants.WRAPPER) Wrapper<PlanItemDO> wrapper,@Param("organId") Long organId);
List<OrderPlateIds> selectPlanIncrementPlate(@Param("noPlanIds") List<Long> noPlanIds,@Param("organId") Long organId);
@@ -20,6 +20,8 @@ public interface OptimizePlanService {
String PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL = "imes_plan_process_scheme_optimize_model";
String PLAN_ACTUAL_GOODS_MODEL = "imes_plan_actual_goods_model";
List<PlateOptimize> getPlateListByPlanId(Long planId);
@@ -37,6 +37,7 @@ import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.*;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.CutedBoardInfo;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.goods.PlanActualGoodsModelDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
@@ -567,7 +568,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
AssertUtils.notEmpty(goodsDOS,PLAN_GOODS_DATA_ERROR);
List<Long> orderIds = goodsDOS.stream().map(GoodsReqVO::getOrderId).distinct().toList();
String orderNos = Optional.ofNullable(planDO.getOrderNos()).orElse("[]");
List<Long> orderIds = JSON.parseArray(orderNos).toJavaList(Long.class).stream().distinct().toList();
// List<Long> orderIds = goodsDOS.stream().map(GoodsReqVO::getOrderId).distinct().toList();
List<Long> ids = goodsDOS.stream().map(GoodsReqVO::getId).toList();
@@ -614,6 +619,16 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
List<OptimizeRemainPlate> optimizeRemainPlates = BeanUtils.toBean(remainPlateDOS, OptimizeRemainPlate.class);
// 获取混单时选择的实际开料的大板信息
List<PlanActualGoodsModelDO> planActualGoodsModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_ACTUAL_GOODS_MODEL, PlanActualGoodsModelDO.class);
// PlanActualGoodsModelDO planActualGoodsModelDO = new PlanActualGoodsModelDO();
//
// if(CollUtil.isNotEmpty(planActualGoodsModelDOS)){
//
// planActualGoodsModelDO = planActualGoodsModelDOS.get(0);
// }
// 查询生产单对应的配件信息
List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
@@ -643,6 +658,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
.goodsList(goodsDOS)
.plateList(plateDetailRespVOS)
.plateModels(orderModelDOS)
.planActualGoodsModelDO(CollUtil.isNotEmpty(planActualGoodsModelDOS) ? planActualGoodsModelDOS.get(0) : null)
.optimizeRemainPlates(optimizeRemainPlates)
.orderPartsRespVOS(printOrderPartsRespVOS)
.orderPartsRemarks(orderPartsRemarks)
@@ -661,9 +677,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
Long processId = req.getProcessId();
List<ActualGoodsList> actualGoodsLists = Optional.ofNullable(boardModelDO.getActualGoodsList()).orElse(new ArrayList<>());
AssertUtils.notEmpty(actualGoodsLists,PLAN_NO_ACTUAL_PLATE);
// List<ActualGoodsList> actualGoodsLists = Optional.ofNullable(boardModelDO.getActualGoodsList()).orElse(new ArrayList<>());
//
// AssertUtils.notEmpty(actualGoodsLists,PLAN_NO_ACTUAL_PLATE);
Long planId = boardModelDO.getPlanId();
@@ -64,11 +64,12 @@ public interface PlanService {
PageResult<OrderRespVO> getOrderByPlanId(PlanOrderPageReqVO pageReqVO);
Boolean setSort(List<SortVO> sortVos);
void setSort(List<SortVO> sortVos);
List<PlateResList> getPlateList(List<Long> planIds);
List<OrderRoomBodyList> getOrderRoomBody(List<Long> orderIds);
List<PlanActualGoodsResp> getPlanGoodsList(SavePlanPlateList savePlanPlateList);
}
@@ -6,6 +6,7 @@ import co.elastic.clients.elasticsearch._types.FieldValue;
import co.elastic.clients.elasticsearch.core.UpdateByQueryRequest;
import co.elastic.clients.json.JsonData;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
@@ -19,6 +20,7 @@ import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo;
@@ -27,6 +29,7 @@ import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.goods.PlanActualGoodsModelDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
@@ -116,6 +119,8 @@ public class PlanServiceImpl implements PlanService {
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";
@Resource
private ElasticsearchClient elasticsearchClient;
@@ -151,9 +156,7 @@ public class PlanServiceImpl implements PlanService {
Long processId = systemConfigRespDTO.getId();
Boolean isMix = systemConfigApi.getMultiColorConfigStatus().getCheckedData();
ArrayList<PlanDO> planDOS = new ArrayList<>();
List<PlanDO> planDOS = new ArrayList<>();
List<Long> ids = new ArrayList<>();
@@ -163,54 +166,56 @@ public class PlanServiceImpl implements PlanService {
List<PlanItemDO> planItemDOS = new ArrayList<>();
List<PlanActualGoodsModelDO> planActualGoodsModelDOS = new ArrayList<>();
SavePlanPlateList savePlanPlateList = Optional.ofNullable(createReqVO.getSavePlanPlateList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
if (Boolean.TRUE.equals(isMix)) {
if (savePlanPlateList.getMixConfig() != null && Boolean.TRUE.equals(savePlanPlateList.getMixConfig().getIsMixed())) {
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.GoodsItemList> goodsItemList = Optional.ofNullable(savePlanPlateList.getGoodsItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
// 查找材质和厚度相同的大板
Map<String, List<Long>> grouped = groupByMaterialAndThickness(goodsItemList);
List<PlanActualGoodsList> planActualGoodsLists = Optional.ofNullable(createReqVO.getPlanActualGoodsListList()).orElse(new ArrayList<>());
// 进行数据处理:value 里为 大板的分类ID
grouped.forEach((key, value) -> {
Map<String, List<Long>> grouped = new HashMap<>();
// 查找和大板分类ID相同的小板的数据
List<SavePlanPlateList.PlateItemList> plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList();
if(CollUtil.isNotEmpty(planActualGoodsLists)) {
List<Long> orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList();
getCreatePlanMultipleGoodsList(planActualGoodsLists,planItemDOS,plateItemList,planActualGoodsModelDOS,planDOS,processId,loginUser);
AtomicLong sort = new AtomicLong(System.currentTimeMillis());
sort.addAndGet(1);
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.equals(mixedType)){
// 筛选出材质和厚度相同的大板
grouped = groupByMaterialAndThicknessEqualToOne(goodsItemList);
Long planId = (Long) identifierGenerator.nextId(null);
}else {
// 创建排单
planDOS.add(PlanDO.builder()
.id(planId)
.sort(sort.get())
.type(PlanTypeEnum.MIXEDORDERPLAN.getType())
.processId(processId)
.orderNos(orderIdList.toString())
.produceTime(null)
.status(PlanStatusEnum.NOCUTTING.getStatus())
.operator(loginUser.getNickname())
.planTime(LocalDateTime.now())
.build());
grouped = groupByThicknessEqualToOne(goodsItemList);
}
plateList.forEach(i ->
planItemDOS.add(PlanItemDO.builder()
.planId(planId)
.plateId(i.getPlateId())
.orderId(i.getOrderId())
.goodsId(i.getId())
.build()));
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());
@@ -227,45 +232,9 @@ public class PlanServiceImpl implements PlanService {
List<SavePlanPlateList.GoodsItemList> goodsItemList = Optional.ofNullable(savePlanPlateList.getGoodsItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
// 查找材质和厚度和颜色相同的大板
Map<String, List<Long>> grouped = groupByMaterialAndThicknessAndColor(goodsItemList);
// 进行数据处理:value 里为 大板的分类ID
grouped.forEach((key, value) -> {
// 查找和大板分类ID相同的小板的数据
List<SavePlanPlateList.PlateItemList> plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList();
List<Long> orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList();
AtomicLong sort = new AtomicLong(System.currentTimeMillis());
sort.addAndGet(1);
Long planId = (Long) identifierGenerator.nextId(null);
// 创建排单
planDOS.add(PlanDO.builder()
.id(planId)
.sort(sort.get())
.type(PlanTypeEnum.MIXEDORDERPLAN.getType())
.processId(processId)
.orderNos(orderIdList.toString())
.produceTime(null)
.status(PlanStatusEnum.NOCUTTING.getStatus())
.operator(loginUser.getNickname())
.planTime(LocalDateTime.now())
.build());
plateList.forEach(i -> {
planItemDOS.add(PlanItemDO.builder()
.planId(planId)
.plateId(i.getPlateId())
.orderId(i.getOrderId())
.goodsId(i.getId())
.build());
});
});
Map<String, List<Long>> grouped = groupByMaterialAndThicknessAndColorAndBrand(goodsItemList);
createPlanAndPlateDataList(grouped,planItemDOS,plateItemList,planDOS,processId,loginUser);
// 获取所有的大板ID
ids.addAll(goodsItemList.stream().map(SavePlanPlateList.GoodsItemList::getId).distinct().toList());
@@ -294,13 +263,13 @@ public class PlanServiceImpl implements PlanService {
planMapper.insertBatch(planDOS);
// plateMapper.updatePlateIsOptimized(orderIds, ids, plateIds, getUserOrganId());
planItemMapper.insertBatch(planItemDOS, planItemDOS.size());
if(CollUtil.isNotEmpty(planActualGoodsModelDOS)) {
esUtils.saveEsDocument(PLAN_ACTUAL_GOODS_MODEL, planActualGoodsModelDOS);
}
}
@@ -483,8 +452,9 @@ public class PlanServiceImpl implements PlanService {
@Override
public PageResult<PlanRespVO> getPlanPage(PlanPageReqVO pageReqVO) {
PageResult<PlanDO> planDOPageResult = new PageResult<>();
PageDTO<PlanDO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<PlanDO> planDOPageResult = new PageDTO<>();
if(pageReqVO.getIsUp() != null) {
@@ -492,32 +462,66 @@ public class PlanServiceImpl implements PlanService {
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
List<PlanDO> plan = pageReqVO.getIsUp() ?
planMapper.selectPlanIds(planDO.getCreateTime().toString(),planDO.getSort(), getUserOrganId(), planDO.getId()) :
planMapper.selectPlanIdsFalse(planDO.getCreateTime().toString(),planDO.getSort(), getUserOrganId(), planDO.getId());
if(planDO.getIsTop()){
if (plan.isEmpty()) {
throw exception(NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE, pageReqVO.getIsUp() ? "" : "最后");
}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);
}
planDOPageResult.setList(plan);
planDOPageResult.setTotal(1L);
}else {
planDOPageResult = planMapper.selectPage(pageReqVO);
if (CollUtil.isEmpty(planDOPageResult.getList())) {
QueryWrapperX<PlanDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("op.organ_id",getUserOrganId())
.eq(FIELD_OP_DELETED,false)
.eqIfPresent("op.is_scheduled",pageReqVO.getIsScheduled())
.eqIfPresent(FIELD_OP_ID, pageReqVO.getId())
.eqIfPresent("op.sort", pageReqVO.getSort())
.eqIfPresent("op.type", pageReqVO.getType())
.inIfPresent("op.status", pageReqVO.getStatus())
.betweenIfPresent("op.plan_time", pageReqVO.getPlanTime())
.likeIfPresent("op.order_nos", pageReqVO.getOrderNos())
.likeIfPresent(FIELD_CUSTOMER, pageReqVO.getCustomer());
planDOPageResult = planMapper.selectPlanPageList(page,queryWrapperX);
if (CollUtil.isEmpty(planDOPageResult.getRecords())) {
return new PageResult<>();
}
}
List<Long> processIds = planDOPageResult.getList().stream().map(PlanDO::getProcessId).distinct().toList();
List<Long> processIds = planDOPageResult.getRecords().stream().map(PlanDO::getProcessId).distinct().toList();
List<Long> planIds = planDOPageResult.getList().stream().map(PlanDO::getId).toList();
List<Long> planIds = planDOPageResult.getRecords().stream().map(PlanDO::getId).toList();
List<SystemConfigRespDTO> configDOS = systemConfigApi.getProcessByIds(processIds).getData();
@@ -548,11 +552,10 @@ public class PlanServiceImpl implements PlanService {
List<PlanOrderRespVO> planOrderRespVOS = orderMapper.selectPlanOrderList(planIds, getUserOrganId());
PageResult<PlanRespVO> planRespVOPageResult = BeanUtils.toBean(planDOPageResult, PlanRespVO.class);
List<PlanRespVO> planRespVOPageResult = BeanUtils.toBean(planDOPageResult.getRecords(), PlanRespVO.class);
planRespVOPageResult.getList().forEach(e -> {
planRespVOPageResult.forEach(e -> {
// 方案信息
e.setProcessName(getProcessName(e.getProcessId(), configDOS));
// 大板信息列表
@@ -572,7 +575,7 @@ public class PlanServiceImpl implements PlanService {
});
return planRespVOPageResult;
return new PageResult<>(planRespVOPageResult, planDOPageResult.getTotal());
}
@@ -762,7 +765,7 @@ public class PlanServiceImpl implements PlanService {
.likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress())
.betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime());
orderGoodsResps = planItemMapper.selectNoPlanGoodsByRoomAndBodyIds(page,queryWrapperX);
orderGoodsResps = planItemMapper.selectNoPlanGoodsByRoomAndBodyIds(page,queryWrapperX,getUserOrganId());
}else {
@@ -781,7 +784,7 @@ public class PlanServiceImpl implements PlanService {
.likeIfPresent(FIELD_ADDRESS, pageReqVO.getConsigneeAddress())
.betweenIfPresent(FIELD_ORDER_DATE, pageReqVO.getCreateTime());
orderGoodsResps = planItemMapper.selectNoPlanGoodsList(page,queryWrapperX);
orderGoodsResps = planItemMapper.selectNoPlanGoodsList(page,queryWrapperX,getUserOrganId());
}
@@ -812,7 +815,7 @@ public class PlanServiceImpl implements PlanService {
.inIfPresent("og.thickness",thickness)
.inIfPresent("og.brand",brand);
List<OrderGoodsResp> orderGoodsIdList = planItemMapper.selectNoOrderGoodsIdList(queryWrapperX);
List<OrderGoodsResp> orderGoodsIdList = planItemMapper.selectNoOrderGoodsIdList(queryWrapperX,getUserOrganId());
mergeOrderGoodsLists(records,orderGoodsIdList);
@@ -889,39 +892,74 @@ public class PlanServiceImpl implements PlanService {
@Override
public Boolean setSort(List<SortVO> sortVos) {
@Transactional(rollbackFor = Exception.class)
public void setSort(List<SortVO> sortVos) {
ArrayList<PlanDO> planDOS = new ArrayList<>();
List<Long> planIds = sortVos.stream().map(SortVO::getPlanId).toList();
Boolean isTopUp = sortVos.get(0).getIsTopUp();
for (Long planId : planIds) {
if(Boolean.TRUE.equals(isTopUp)){
PlanDO planDO = planMapper.selectById(planId);
List<Integer> status = Arrays.asList(PlanStatusEnum.NOCUTTING.getStatus(),PlanStatusEnum.OPENING.getStatus());
// 后续的查询需要加上 是否置顶 的判断条件
List<PlanDO> planDOList = planMapper.selectPlanSortList(status, getUserOrganId());
if(CollUtil.isNotEmpty(planDOList)) {
// 修改为 未置顶
// planDOList.forEach(f->f);
planDOS.addAll(planDOList);
if(planDO == null){
throw exception(PLAN_NOT_DATA_EXISTS,planId);
}
}
if(sortVos.size() == 1){
SortVO sortVO = sortVos.get(0);
if(sortVO.getIsOnePlan() != null){
PlanDO planDO = planMapper.selectById(sortVO.getPlanId());
Long sort = planDO.getSort();
PlanDO plan = Boolean.TRUE.equals(sortVO.getIsOnePlan()) ?
planMapper.selectSortOnePlan(sort, getUserOrganId()) :
planMapper.selectLostPlan(sort, getUserOrganId());
AssertUtils.notEmpty(plan,PLAN_SORT_DATA_ERROR);
planDO.setSort(plan.getSort());
plan.setSort(sort);
planMapper.updateById(planDO);
planMapper.updateById(plan);
return;
}
planMapper.update(new LambdaUpdateWrapper<PlanDO>()
.eq(PlanDO::getOrganId, getUserOrganId())
.eq(PlanDO::getDeleted,false)
.eq(PlanDO::getId,sortVO.getPlanId())
.set(PlanDO::getIsTop,sortVO.getIsTopUp()));
return;
}
ArrayList<PlanDO> planDOS = new ArrayList<>();
sortVos.forEach(e -> {
planDOS.add(PlanDO.builder()
.id(e.getPlanId())
.sort(e.getSort())
// .isTopUp(e.getIsTopUp())
.build());
});
planMapper.updateBatch(planDOS);
return Boolean.TRUE;
}
@@ -968,6 +1006,48 @@ public class PlanServiceImpl implements PlanService {
}
@Override
public List<PlanActualGoodsResp> getPlanGoodsList(SavePlanPlateList savePlanPlateList) {
if(savePlanPlateList.getMixConfig() == null){
return new ArrayList<>();
}
Integer mixedType = Optional.ofNullable(savePlanPlateList.getMixConfig().getMixedType()).orElse(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType());
List<SavePlanPlateList.GoodsItemList> goodsItemListList = Optional.ofNullable(savePlanPlateList.getGoodsItemList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR));
List<PlanActualGoodsResp> planActualGoodsResps = new ArrayList<>();
Map<String, List<Long>> grouped;
if(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType().equals(mixedType)){
grouped = groupByMaterialAndThicknessFilterLessThanOne(goodsItemListList);
}else {
grouped = groupByThicknessFilterLessThanOne(goodsItemListList);
}
grouped.forEach((key,value) ->{
List<GoodsRespVO> goodsRespVOS = goodsMapper.selectNoOrderPlanGoods(value, getUserOrganId());
planActualGoodsResps.add(
PlanActualGoodsResp.builder()
.ids(value)
.goodsRespVOS(goodsRespVOS)
.build()
);
});
return planActualGoodsResps;
}
private PlanDO validatePlan(Long id) {
@@ -1311,14 +1391,119 @@ public class PlanServiceImpl implements PlanService {
return groupedItems;
}
public static Map<String, List<Long>> groupByMaterialAndThicknessAndColor(List<SavePlanPlateList.GoodsItemList> items) {
public static Map<String, List<Long>> groupByThickness(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor();
String key = item.getThickness().toString();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
// 添加当前项的 id 到对应的分组
groupedItems.get(key).add(item.getId());
}
return groupedItems;
}
public static Map<String, List<Long>> groupByMaterialAndThicknessFilterLessThanOne(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
// 添加当前项的 id 到对应的分组
groupedItems.get(key).add(item.getId());
}
// 过滤掉只包含一个 id 的分组(可选,视需求)
groupedItems.entrySet().removeIf(entry -> entry.getValue().size() < 2);
return groupedItems;
}
public static Map<String, List<Long>> groupByThicknessFilterLessThanOne(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getThickness().toString();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
// 添加当前项的 id 到对应的分组
groupedItems.get(key).add(item.getId());
}
// 过滤掉只包含一个 id 的分组(可选,视需求)
groupedItems.entrySet().removeIf(entry -> entry.getValue().size() < 2);
return groupedItems;
}
public static Map<String, List<Long>> groupByMaterialAndThicknessEqualToOne(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
// 添加当前项的 id 到对应的分组
groupedItems.get(key).add(item.getId());
}
// 过滤掉只包含一个 id 的分组(可选,视需求)
groupedItems.entrySet().removeIf(entry -> entry.getValue().size() > 1);
return groupedItems;
}
public static Map<String, List<Long>> groupByThicknessEqualToOne(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getThickness().toString();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
// 添加当前项的 id 到对应的分组
groupedItems.get(key).add(item.getId());
}
// 过滤掉只包含一个 id 的分组(可选,视需求)
groupedItems.entrySet().removeIf(entry -> entry.getValue().size() > 1);
return groupedItems;
}
public static Map<String, List<Long>> groupByMaterialAndThicknessAndColorAndBrand(List<SavePlanPlateList.GoodsItemList> items) {
Map<String, List<Long>> groupedItems = new HashMap<>();
for (SavePlanPlateList.GoodsItemList item : items) {
// 将 material 和 thickness 组合成键
String key = item.getMaterial() + "|" + item.getThickness() + "|" + item.getColor()+ "|" + item.getBrand();
// 如果键不存在,初始化一个新的列表
groupedItems.putIfAbsent(key, new ArrayList<>());
@@ -1432,6 +1617,107 @@ public class PlanServiceImpl implements PlanService {
private void getCreatePlanMultipleGoodsList(List<PlanActualGoodsList> planActualGoodsLists,
List<PlanItemDO> planItemDOS,
List<SavePlanPlateList.PlateItemList> plateItemList,
List<PlanActualGoodsModelDO> planActualGoodsModelDOS ,
List<PlanDO> planDOS,
Long processId,
LoginUser loginUser) {
planActualGoodsLists.forEach(f -> {
// 查找和大板分类ID相同的小板的数据
List<SavePlanPlateList.PlateItemList> plateList = plateItemList.stream().filter(p -> f.getIds().contains(p.getId())).toList();
List<Long> orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList();
AtomicLong sort = new AtomicLong(System.currentTimeMillis());
sort.addAndGet(1);
Long planId = (Long) identifierGenerator.nextId(null);
// 创建排单
planDOS.add(PlanDO.builder()
.id(planId)
.sort(sort.get())
.type(PlanTypeEnum.MIXEDORDERPLAN.getType())
.processId(processId)
.orderNos(orderIdList.toString())
.produceTime(null)
.status(PlanStatusEnum.NOCUTTING.getStatus())
.operator(loginUser.getNickname())
.planTime(LocalDateTime.now())
.build());
plateList.forEach(i ->
planItemDOS.add(PlanItemDO.builder()
.planId(planId)
.plateId(i.getPlateId())
.orderId(i.getOrderId())
.goodsId(i.getId())
.build()));
if (f.getPlanActualGoodsModelDO() != null) {
planActualGoodsModelDOS.add(f.getPlanActualGoodsModelDO().setPlanId(planId));
}
});
}
private void createPlanAndPlateDataList(Map<String, List<Long>> grouped,
List<PlanItemDO> planItemDOS,
List<SavePlanPlateList.PlateItemList> plateItemList,
List<PlanDO> planDOS,
Long processId,
LoginUser loginUser){
AtomicLong sort = new AtomicLong(System.currentTimeMillis());
// 进行数据处理:value 里为 大板的分类ID
grouped.forEach((key, value) -> {
// 查找和大板分类ID相同的小板的数据
List<SavePlanPlateList.PlateItemList> plateList = plateItemList.stream().filter(p -> value.contains(p.getId())).toList();
List<Long> orderIdList = plateList.stream().map(SavePlanPlateList.PlateItemList::getOrderId).distinct().toList();
sort.addAndGet(1);
Long planId = (Long) identifierGenerator.nextId(null);
// 创建排单
planDOS.add(PlanDO.builder()
.id(planId)
.sort(sort.get())
.type(PlanTypeEnum.MIXEDORDERPLAN.getType())
.processId(processId)
.orderNos(orderIdList.toString())
.produceTime(null)
.status(PlanStatusEnum.NOCUTTING.getStatus())
.operator(loginUser.getNickname())
.planTime(LocalDateTime.now())
.build());
plateList.forEach(i ->
planItemDOS.add(PlanItemDO.builder()
.planId(planId)
.plateId(i.getPlateId())
.orderId(i.getOrderId())
.goodsId(i.getId())
.build()));
});
}
}
@@ -12,8 +12,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum;
import com.cf.imes.framework.common.enums.OrderPlateTypeEnum;
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.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.pojo.PageResult;
@@ -67,7 +65,6 @@ 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.util.ServiceExceptionUtil.exception;
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.*;
/**
* 生产单板件 Service 实现类
@@ -273,26 +270,26 @@ public class PlateServiceImpl implements PlateService {
@Override
public PageResult<PlateGoodDO> getGoodsPlate(GoodsPlateFilterPageReqVO pageReqVO) {
PlanDO planDO = planMapper.selectById(pageReqVO.getPlanId());
AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS);
if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
throw exception(THIS_PLAN_PLATE_OPTIMIZE_IS_ALL);
}
if (planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())) {
pageReqVO.setColor(null);
}
if(planDO.getType().equals(PlanTypeEnum.ORDERPLAN.getType()) && pageReqVO.getFilterColor() != null){
throw exception(PLAN_GOODS_IS_FILTER_DATA_ERROR);
}
// PlanDO planDO = planMapper.selectById(pageReqVO.getPlanId());
//
// AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS);
//
// if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
// throw exception(THIS_PLAN_PLATE_OPTIMIZE_IS_ALL);
// }
//
//
// if (planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())) {
//
// pageReqVO.setColor(null);
//
// }
//
//
// if(planDO.getType().equals(PlanTypeEnum.ORDERPLAN.getType()) && pageReqVO.getFilterColor() != null){
// throw exception(PLAN_GOODS_IS_FILTER_DATA_ERROR);
//
// }
return plateGoodMapper.selectGoodsPage(pageReqVO, getUserOrganId());
@@ -28,18 +28,11 @@
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO">
select distinct
og.order_id,
og.raw_goods_id,
og.goods_id,
og.goods_name,
og.material,
og.color,
og.texture,
og.width,
og.height,
og.thickness,
og.price,
og.spec,
og.brand,
og.remark,
orp.id as remainId
@@ -316,9 +309,9 @@
from order_body ob
left join order_item oi on ob.organ_id = oi.organ_id and ob.order_id = oi.order_id and ob.id = oi.body_id
left join order_plate op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.plate_id = op.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_item oi on ob.organ_id = oi.organ_id and ob.order_id = oi.order_id and ob.id = oi.body_id and oi.organ_id = #{organId}
left join order_plate op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.plate_id = op.id and op.organ_id = #{organId}
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 and opi.organ_id = #{organId}
where ob.organ_id = #{organId}
and ob.order_id in
@@ -554,6 +547,29 @@
</select>
<select id="selectNoOrderPlanGoods"
resultType="com.cf.imes.module.executor.controller.admin.goods.vo.GoodsRespVO">
select distinct
goods_name,
material,
color,
thickness,
brand
from order_goods
where organ_id = #{organId}
and deleted = false
and id in
<foreach collection="ids" item="ids" open="(" close=")" separator=",">
#{ids}
</foreach>
</select>
@@ -439,6 +439,7 @@
og.material as material,
og.color as color,
og.goods_id as goodsId,
og.brand as brand,
op.name as plateName,
op.height as height,
op.width as width,
@@ -10,6 +10,23 @@
-->
<select id="selectPlanPageList" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select distinct op.*
from order_plan op
left join order_plan_item opi on op.organ_id = opi.organ_id and op.id = opi.plan_id
left join orders o on opi.organ_id = o.organ_id and opi.order_id = o.id
${ew.customSqlSegment}
ORDER BY op.is_top DESC,
CASE WHEN op.is_top = true THEN op.update_time END DESC,
CASE WHEN op.is_top = false THEN op.sort END ;
</select>
<select id="selectPlateListByPlanId"
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize"
parameterType="java.lang.Long">
@@ -81,13 +98,14 @@
<select id="selectPlanIds" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select * from order_plan where
organ_id = #{organId}
and deleted = false
and create_time &gt;= #{createTime}
and id != #{planId}
SELECT *
FROM order_plan
ORDER BY create_time
WHERE organ_id = #{organId}
AND deleted = false
and is_top = false
and sort &lt; #{sort}
ORDER BY sort desc
limit 1;
@@ -96,17 +114,19 @@
<select id="selectPlanIdsFalse" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select * from order_plan where
organ_id = #{organId}
and deleted = false
and create_time &lt;= #{createTime}
and id != #{planId}
SELECT *
FROM order_plan
ORDER BY create_time desc
WHERE organ_id = #{organId}
AND deleted = false
and is_top = false
and sort &gt; #{sort}
ORDER BY sort
limit 1;
</select>
<select id="selectPlanStatus" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
@@ -123,7 +143,7 @@
</select>
<select id="selectPLanList" resultType="java.lang.Long">
<select id="selectPlanList" resultType="java.lang.Long">
select id
from order_plan
@@ -138,7 +158,6 @@
</select>
<update id="updatePlanStatus">
UPDATE order_plan
@@ -154,5 +173,56 @@
</update>
<select id="selectSortOnePlan" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
SELECT *
FROM order_plan
WHERE organ_id = #{organId}
AND deleted = false
and is_top = false
and sort &lt; #{sort}
ORDER BY sort desc
limit 1;
</select>
<select id="selectLostPlan" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
SELECT *
FROM order_plan
WHERE organ_id = #{organId}
AND deleted = false
and is_top = false
and sort &gt; #{sort}
ORDER BY sort
limit 1;
</select>
<select id="selectPlanSortList" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
SELECT *
FROM order_plan
WHERE organ_id = #{organId}
AND deleted = false
and status in
<foreach item="status" collection="status" open="(" separator="," close=")">
#{status}
</foreach>
ORDER BY is_top DESC,
CASE WHEN is_top = true THEN update_time END DESC,
CASE WHEN is_top = false THEN sort END ;
</select>
</mapper>
@@ -168,10 +168,10 @@
og.brand as brand
from orders o
left join order_goods og on o.organ_id = og.organ_id and o.id = og.order_id
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_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 o.organ_id = og.organ_id and o.id = og.order_id and og.organ_id = #{organId}
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId}
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id and oi.organ_id = #{organId}
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 and opi.organ_id = #{organId}
${ew.customSqlSegment}
@@ -193,9 +193,9 @@
og.brand as brand
from orders o
left join order_goods og on o.organ_id = og.organ_id and o.id = og.order_id
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_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 o.organ_id = og.organ_id and o.id = og.order_id and og.organ_id = #{organId}
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId}
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 and opi.organ_id = #{organId}
${ew.customSqlSegment}
@@ -221,10 +221,10 @@
og.order_id as orderId
from orders o
left join order_goods og on o.organ_id = og.organ_id and o.id = og.order_id
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_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 o.organ_id = og.organ_id and o.id = og.order_id and og.organ_id = #{organId}
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and op.organ_id = #{organId}
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id and oi.organ_id = #{organId}
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 and opi.organ_id = #{organId}
${ew.customSqlSegment}