新增-每个排单都保存对应的方案组信息,增加修改排单方案组配置接口,创建组织复制系统配置信息,增加打印标签查询小板信息接口

This commit is contained in:
liuzhaotian
2025-04-17 16:18:26 +08:00
parent f93631333d
commit d2d891a289
15 changed files with 694 additions and 147 deletions
@@ -196,6 +196,31 @@ public class OptimizePlanController {
}
@GetMapping("/newPlanPlate")
@Operation(summary = "获取排单是否有新加板材")
@Parameter(name = "planId", description = "排单ID", required = true)
public CommonResult<Boolean> getNewPlanPlate(@Valid @RequestParam("planId") Long planId) {
return success(optimizePlanService.getNewPlanPlate(planId));
}
@PutMapping("/updateConfig")
@Operation(summary = "修改排单对应的加工方案组的配置信息")
public CommonResult<Boolean> updateProcessSchemeConfig(@RequestBody PlanSchemeConfigReqVO reqVO) {
optimizePlanService.updateProcessSchemeConfig(reqVO);
return success(Boolean.TRUE);
}
@GetMapping("/getGoodsDataFilter")
@Operation(summary = "未排单高级筛选-板材分组")
@PreAuthorize("@ss.hasPermission('manage:pack:query')")
@@ -196,4 +196,17 @@ public class PlanController {
}
@GetMapping("getPlanPlate")
@Operation(summary = "根据排单ID获取打印标签需要的小板信息")
@PreAuthorize("@ss.hasAnyPermissions('placeorder:print-label','producePlan:print-label')")
public CommonResult<PageResult<PlateResList>> getPlanPlateList(@Valid PlanPageReqVO pageReqVO) {
return success(planService.getPlanPlateList(pageReqVO));
}
}
@@ -0,0 +1,52 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class PlanSchemeConfigReqVO {
@Schema(description = "排单ID")
private Long planId;
@Schema(description = "方案组ID")
private Long processId;
@Schema(description = "加工方案组的配置项ID")
private Long planConfigId;
@Schema(description = "方案组配置项名称")
private String planName;
@Schema(description = "加工分线配置ID")
private String processLineConfig;
@Schema(description = "加工分线名称")
private String processLineName;
@Schema(description = "数据优化配置ID")
private String optimizationConfig;
@Schema(description = "数据优化配置名称")
private String optimizationConfigName;
@Schema(description = "解析器配置ID")
private String analyzer;
@Schema(description = "解析器名称")
private String analyzerName;
}
@@ -0,0 +1,63 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
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;
/**
* @author 排单对应的加工方案组的配置信息
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ProcessSchemeModelDO extends ESDocument {
@Schema(description = "排单ID")
private Long planId;
@Schema(description = "方案组ID")
private Long processId;
@Schema(description = "加工方案组的配置项ID")
private Long planConfigId;
@Schema(description = "方案组配置项名称")
private String planName;
@Schema(description = "加工分线配置ID")
private String processLineConfig;
@Schema(description = "加工分线名称")
private String processLineName;
@Schema(description = "数据优化配置ID")
private String optimizationConfig;
@Schema(description = "数据优化配置名称")
private String optimizationConfigName;
@Schema(description = "解析器配置ID")
private String analyzer;
@Schema(description = "解析器名称")
private String analyzerName;
}
@@ -48,6 +48,10 @@ public class OptimizeBoardModelDO extends ESDocument {
private Boolean isLock;
@Schema(description = "是否有新加入的小板")
private Boolean isNewInsertPlate;
@Schema(description = "实际的开料的大板的ID")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<String> goodsId;
@@ -22,6 +22,8 @@ public interface OptimizePlanService {
String PLAN_ACTUAL_GOODS_MODEL = "imes_plan_actual_goods_model";
String PLAN_PROCESS_SCHEME_CONFIG = "imes_plan_process_scheme_config_model";
List<PlateOptimize> getPlateListByPlanId(Long planId);
@@ -61,5 +63,9 @@ public interface OptimizePlanService {
PageResult<OrderRespVOCopy> getOrderPlateDataFilter(FilterDataPageReqVO pageReqVO);
Boolean getNewPlanPlate(Long planId);
void updateProcessSchemeConfig(PlanSchemeConfigReqVO reqVO);
PageResult<OrderGoodsResp> getGoodsPlateDataFilter(FilterDataPageReqVO pageReqVO);
}
@@ -712,6 +712,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
planDO.setProcessId(req.getProcessId());
planMapper.updateById(planDO);
// 保存排单对应的方案组的配置信息
getPlanProcessSchemeConfig(planDO.getProcessId(),planId);
esUtils.deleteEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL);
}else {
@@ -742,6 +745,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
plateMapper.updateBatch(plateDOS);
}
boardModelDO.setIsNewInsertPlate(Boolean.FALSE);
// 保存优化后的大板数据
@@ -757,39 +761,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
esUtils.deleteEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL);
}
// List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(), planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
// 查询原优化信息然后进行判断
// if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){
//
// if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
// throw exception(THIS_PLAN_OPTIMIZE_DATA_ERROR);
// }
//
//
// OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
//
// Boolean isLock = Optional.ofNullable(optimizeBoardModelDO.getIsLock()).orElse(false);
//
// LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
// assert loginUser != null;
//
// Boolean data = permissionApi.hasAnyPermissions(loginUser.getId(), "placeorder:list").getCheckedData();
//
// if(Boolean.TRUE.equals(isLock) && planDO.getIsScheduled().equals(true) && Boolean.FALSE.equals(data)){
// throw exception(THIS_PLAN_OPTIMIZE_IS_LOCK);
// }
//
// }
}
@Override
public void saveProcessSchemeResults(SaveProcessSchemeReqVO saveProcessSchemeReqVO) {
@@ -815,9 +792,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
if(CollUtil.isNotEmpty(plateDOS)) {
plateDOS.forEach(f -> {
f.setIsOptimized(true);
});
plateDOS.forEach(f -> f.setIsOptimized(true));
plateMapper.updateBatch(plateDOS);
}
@@ -830,10 +805,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
throw exception(THIS_PLAN_PLATE_IS_CUT);
}
// 保存排单对应的加工方案组的配置信息
getPlanProcessSchemeConfig(processId,planId);
planMapper.updateById(planDO.setProcessId(processId));
// 修改方案组,删除全部的方案组的优化信息
esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
@@ -847,40 +823,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
List<ProcessSchemeModelDO> processSchemeModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_PROCESS_SCHEME_CONFIG, ProcessSchemeModelDO.class);
// 保存排单对应的加工方案组的配置信息
if(CollUtil.isEmpty(processSchemeModelDOS)){
getPlanProcessSchemeConfig(processId,planId);
}
esUtils.deleteEsDocument(FIELD_PLAN_ID,FIELD_PLAN_CONFIG_ID,planId,planConfigIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,schemeModelDOS);
}
// // 不能加非空判断,因为方案组里可能没有优化信息
// List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
//
//// List<Boolean> isLocks = new ArrayList<>();
//
// if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){
//
// optimizeBoardModelDOS.forEach(f->{
//
//// isLocks.add(Optional.ofNullable(f.getIsLock()).orElse(false));
//
// schemeModelDOS.add(SaveProcessSchemeModelDO.builder()
// .planConfigId(f.getPlanConfigId())
// .planName(f.getPlanConfigName())
// .plateNum(f.getPlaceBlockNumber())
// .goodsNum(f.getBoardCount())
// .isOptimized(true)
// .build());
//
// });
//
// }
@@ -891,11 +850,36 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
PlanProcessSchemeList planProcessSchemeList = new PlanProcessSchemeList();
List<ProcessSchemeDTO> schemeDTOList = systemConfigApi.getProcessById(processId).getCheckedData();
PlanDO planDO = validatePlanExists(planId);
// List<ProcessSchemeDTO> schemeDTOList = systemConfigApi.getProcessById(processId).getCheckedData();
List<ProcessSchemeDTO> schemeDTOList;
// 获取排单对应的方案组的配置信息
List<ProcessSchemeModelDO> schemeModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_PROCESS_SCHEME_CONFIG, ProcessSchemeModelDO.class);
if(CollUtil.isNotEmpty(schemeModelDOS)){
if(!planDO.getProcessId().equals(processId)){
schemeDTOList = systemConfigApi.getProcessById(processId).getCheckedData();
}else {
List<ProcessSchemeDTO> schemeDTOS = BeanUtils.toBean(schemeModelDOS, ProcessSchemeDTO.class);
schemeDTOList = systemConfigApi.getPlanProcessSchemeConfig(schemeDTOS).getCheckedData();
}
}else {
schemeDTOList = systemConfigApi.getProcessById(processId).getCheckedData();
}
planProcessSchemeList.setProcessSchemeList(schemeDTOList);
validatePlanExists(planId);
// 查询排单对应的方案组信息
List<SaveProcessSchemeModelDO> saveProcessSchemeReqVOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL, SaveProcessSchemeModelDO.class);
@@ -1159,6 +1143,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
@Override
public Boolean getNewPlanPlate(Long planId) {
List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){
List<OptimizeBoardModelDO> modelDOS = optimizeBoardModelDOS.stream().filter(f -> f.getIsNewInsertPlate().equals(Boolean.TRUE)).toList();
return modelDOS.isEmpty() ? Boolean.FALSE : Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
public PageResult<OrderGoodsResp> getGoodsPlateDataFilter(FilterDataPageReqVO pageReqVO) {
@@ -1768,6 +1769,27 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// 查询排单对应的加工方案组的配置信息并保存
private void getPlanProcessSchemeConfig(Long processId,Long planId){
List<ProcessSchemeDTO> schemeDTOS = systemConfigApi.getProcessSchemeConfig(processId).getCheckedData();
List<ProcessSchemeModelDO> modelDOS = BeanUtils.toBean(schemeDTOS, ProcessSchemeModelDO.class);
modelDOS.forEach(f->{
f.setProcessId(processId);
f.setPlanId(planId);
});
// 删除旧的排单对应的加工方案组的配置信息
esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_CONFIG);
// 保存新的排单对应的加工方案组的配置信息
esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_CONFIG,modelDOS);
}
private void validatePlanStatus(PlanDO planDO,List<Boolean> isLocks){
@@ -72,4 +72,7 @@ public interface PlanService {
List<OrderRoomBodyList> getOrderRoomBody(List<Long> orderIds);
List<PlanActualGoodsResp> getPlanGoodsList(SavePlanPlateList savePlanPlateList);
PageResult<PlateResList> getPlanPlateList(PlanPageReqVO pageReqVO);
}
@@ -24,6 +24,7 @@ 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;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.ProcessSchemeModelDO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.RemainBoardInfo;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.controller.admin.plate.vo.OrderPlateIds;
@@ -119,6 +120,8 @@ public class PlanServiceImpl implements PlanService {
private static final String PLAN_ACTUAL_GOODS_MODEL = "imes_plan_actual_goods_model";
private static final String PLAN_PROCESS_SCHEME_CONFIG = "imes_plan_process_scheme_config_model";
@Resource
private ElasticsearchClient elasticsearchClient;
@@ -225,6 +228,25 @@ public class PlanServiceImpl implements PlanService {
orderMapper.updateBatch(orderDOS);
}
// 排单对应的加工方案组的配置信息
List<ProcessSchemeModelDO> processSchemeModelDOS;
try {
processSchemeModelDOS = parseArray(systemConfigRespDTO.getSetting(), ProcessSchemeModelDO.class);
}catch (Exception e){
log.error(e.getMessage());
throw exception(SYSTEM_PROCESS_SCHEME_CONFIG_FIELD_ERROR);
}
planDOS.forEach(f-> processSchemeModelDOS.forEach(p->{
p.setPlanId(f.getId());
p.setProcessId(processId);
}));
esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_CONFIG,processSchemeModelDOS);
planMapper.insertBatch(planDOS);
planItemMapper.insertBatch(planItemDOS, planItemDOS.size());
@@ -357,18 +379,8 @@ public class PlanServiceImpl implements PlanService {
.inIfPresent(OrderItemDO::getOrderId, orderIds)
.in(OrderItemDO::getPlateId, plateIdList));
}
// 排单对应的优化数据删除
esUtils.deleteEsDocument(FIELD_PLANID,planIds,ORDER_REMAIN_PLATE_MODEL);
// 删除排单对应的加工方案的优化数据
esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
// 查询删除排单对应的生产单是否还有进行了其他排单
List<Long> orderIdList = planItemMapper.selectOrderPlateList(orderIds, getUserOrganId());
@@ -387,6 +399,19 @@ public class PlanServiceImpl implements PlanService {
orderMapper.updateBatch(orderList);
}
// 排单对应的优化数据删除
esUtils.deleteEsDocument(FIELD_PLANID,planIds,ORDER_REMAIN_PLATE_MODEL);
// 删除排单对应的加工方案的优化数据
esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
// 删除排单对应的加工方案组的配置信息
esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_CONFIG);
}
@@ -995,6 +1020,81 @@ public class PlanServiceImpl implements PlanService {
}
@Override
public PageResult<PlateResList> getPlanPlateList(PlanPageReqVO pageReqVO) {
Long planId = Long.valueOf(pageReqVO.getId());
QueryWrapperX<PlanItemDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX.eq("opi.organ_id",getUserOrganId())
.eq(FIELD_PLAN_ID,planId);
Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize();
List<PlateResList> plateResLists = planItemMapper.selectPlateListByPlateIds(queryWrapperX,pageNo,pageReqVO.getPageSize());
if (CollUtil.isEmpty(plateResLists)) {
return new PageResult<>();
}
Long sum = planItemMapper.selectPlateCountByPlateIds(queryWrapperX);
List<OptimizeBoardModelDO> boardModelDOS = esUtils.getEsDocument(FIELD_PLANID, planId, ORDER_REMAIN_PLATE_MODEL, OptimizeBoardModelDO.class);
if(CollUtil.isNotEmpty(boardModelDOS)) {
List<RemainBoardInfo> remainBoardInfos = new ArrayList<>();
boardModelDOS.forEach(f -> {
if (f.getRemainBoardInfo() != null) {
try {
remainBoardInfos.addAll(new ArrayList<>(parseArray(f.getRemainBoardInfo(), RemainBoardInfo.class)));
} catch (Exception e) {
log.error(e.getMessage());
throw exception(PLAN_PLATE_OPTIMIZE_DATA_ERROR);
}
}
});
List<RemainBoardInfo.PlaceBoardList> placeBoardList = new ArrayList<>();
remainBoardInfos.forEach(f-> placeBoardList.addAll(f.getPlaceBoardList()));
if(CollUtil.isNotEmpty(placeBoardList)){
List<RemainBoardInfo.Blocks> blocksList = new ArrayList<>();
placeBoardList.forEach(f->blocksList.addAll(f.getBlocks()));
if(CollUtil.isNotEmpty(blocksList)){
plateResLists.forEach(f->{
f.setBoardId(blocksList.stream().filter(b->b.getBlockId().equals(f.getPlateNo())).findFirst().orElse(new RemainBoardInfo.Blocks()).getBoardId());
f.setPlaceId(blocksList.stream().filter(b->b.getBlockId().equals(f.getPlateNo())).findFirst().orElse(new RemainBoardInfo.Blocks()).getPlaceId());
});
}
}
}
return new PageResult<>(plateResLists, sum);
}
private PlanDO validatePlan(Long id) {
PlanDO planDO = planMapper.selectById(id);
@@ -1346,6 +1446,36 @@ public class PlanServiceImpl implements PlanService {
});
// 有新添加的小板,修改优化信息的字段信息
try {
List<FieldValue> fieldValues = insertPlanIds.stream().map(FieldValue::of).toList();
UpdateByQueryRequest.Builder builder = new UpdateByQueryRequest.Builder();
builder.index(ORDER_REMAIN_PLATE_MODEL)
.query(qb -> qb.bool(bq -> bq.filter(f->{
f.terms(t->t.field(FIELD_PLANID).terms(e->e.value(fieldValues)));
return f;
})
))
.script(s -> s.inline(i -> i
.source("ctx._source.isNewInsertPlate = params.new_value")
.params("new_value", JsonData.of(Boolean.TRUE))
));
UpdateByQueryRequest request = builder.build();
elasticsearchClient.updateByQuery(request);
}catch (Exception e){
log.error(e.getMessage());
throw new ServiceException(ES_DATA_ERROR);
}
// 修改排单加工方案的优化状态
updateProcessSchemeStatus(insertPlanIds);
@@ -1605,25 +1735,6 @@ public class PlanServiceImpl implements PlanService {
// // 构建查询和脚本
// builder.index(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL)
// .query(qb -> qb.bool(bq -> bq
// .must(mq -> mq.terms(tq -> tq.field("FIELD_PLANID").terms(t -> t.value(fieldValues))))
// .must(mq -> mq.match(mtq -> mtq.field("machineType").query(MachineTypeEnum.CUTTING.getType())))
// ))
// .script(s -> s.inline(i -> i
// .source("""
// ctx._source.isOptimized = params.isOptimized;
// ctx._source.lastUpdated = params.lastUpdated;
// ctx._source.updatedBy = params.updatedBy;
// """)
// .params("isOptimized", JsonData.of(false))
// .params("lastUpdated", JsonData.of("2025-01-02T12:00:00Z"))
// .params("updatedBy", JsonData.of("AutomatedSystem"))
// ));
public static void mergeOrderGoodsLists(List<OrderGoodsResp> list1, List<OrderGoodsResp> list2) {
// Build a map for quick lookup of items in list1 by their unique properties