This commit is contained in:
lym
2025-02-10 16:51:02 +08:00
24 changed files with 546 additions and 245 deletions
@@ -59,6 +59,11 @@ import static cn.hutool.core.date.DatePattern.NORM_DATETIME_MS_FORMATTER;
@Component
public class AccessLogFilter implements GlobalFilter, Ordered {
/**
* 记录的requestBody最大值
*/
public static final int REQUEST_BODY_MAX_SIZE = 1024 * 1024 * 10;
@Resource
private CodecConfigurer codecConfigurer;
@@ -220,9 +225,7 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
// 设置 response body 到网关日志
byte[] content = readContent(dataBuffers);
String responseResult = new String(content, StandardCharsets.UTF_8);
gatewayLog.setResponseBody(responseResult);
byte[] content = readContent(dataBuffers, gatewayLog);
// 响应
return bufferFactory.wrap(content);
@@ -272,14 +275,21 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
// ========== 参考 ModifyResponseBodyGatewayFilterFactory 中的方法 ==========
private byte[] readContent(List<? extends DataBuffer> dataBuffers) {
private byte[] readContent(List<? extends DataBuffer> dataBuffers, AccessLog gatewayLog) {
// 合并多个流集合,解决返回体分段传输
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffers);
byte[] content = new byte[join.readableByteCount()];
int readableByteCount = join.readableByteCount();
byte[] content = new byte[readableByteCount];
join.read(content);
// 释放掉内存
DataBufferUtils.release(join);
// 超过10Mb的requestBody不做记录
if (REQUEST_BODY_MAX_SIZE >= readableByteCount) {
String responseResult = new String(content, StandardCharsets.UTF_8);
gatewayLog.setResponseBody(responseResult);
}
return content;
}
@@ -13,8 +13,6 @@ public class ErrorCodeConstants {
public static final ErrorCode PLAN_NOT_ALLOW_DELETE = new ErrorCode(1_001_107_001, "排单号:{},已开料不予许删除");
public static final ErrorCode LIST_CHANGES_ARE_PROHIBITED = new ErrorCode(1_001_107_003, "当前排单有板材已开料,禁止更改");
public static final ErrorCode PLATE_ERROR = new ErrorCode(1_001_107_005, "当前新增的板材非同一类型的板材,禁止更改");
public static final ErrorCode PLAN_PLATE_IS_ALL_CUT = new ErrorCode(1_001_107_006, "排单号:{} 的板材已全部开料,禁止删除!");
public static final ErrorCode PLAN_NOT_DATA_EXISTS = new ErrorCode(1_001_107_007, "排单号:{} 不存在,无法进行操作,请检查排单数据");
@@ -141,7 +141,7 @@ public class OptimizePlanController {
@Parameter(name = "planId", description = "排单ID", required = true)
@PreAuthorize("@ss.hasPermission('placeorder:optimize')")
public CommonResult<PlanProcessSchemeList> getProcessSchemeConfig(@Schema(description = "方案组ID") @NotNull(message = "方案组的ID不能为空") Long processId,
@Schema(description = "排单id") @RequestParam(required = false) Long planId) {
@Schema(description = "排单id") @RequestParam Long planId) {
return success(optimizePlanService.getProcessSchemeConfig(processId,planId));
@@ -22,5 +22,8 @@ public class SavePlanPlateResultReqVO {
@NotNull(message = "方案组的配置项ID不能为空")
private Long planConfigId;
@Schema(description = "方案组的ID", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotNull(message = "方案组的ID不能为空")
private Long processId;
}
@@ -12,7 +12,7 @@ import java.util.List;
@Data
public class PlanSaveReqVO {
@Schema(description = "ID")
@Schema(description = "ID-新增和移除小板时不传")
// @NotNull(message = "排单数据异常,请重新操作",groups = UpdateGroup.class)
@Max(value = 0x7fffffffffffffffL,message = "排单号异常,无法更新排单数据")
private Long id;
@@ -58,12 +58,13 @@ public class PlateController {
@DeleteMapping("/delete")
@Operation(summary = "删除生产单板件")
@Parameters({
@Parameter(name = "id", description = "板材ID", required = true),
@Parameter(name = "plateIds", description = "板材ID", required = true),
@Parameter(name = "planId", description = "排单ID", required = true)
})
@PreAuthorize("@ss.hasAnyPermissions('executor:plate:delete','placeorder:optimize')")
public CommonResult<Boolean> deletePlate(@RequestParam("id") @NotNull Long id, @RequestParam("planId") @NotNull Long planId) {
plateService.deletePlate(id,planId);
public CommonResult<Boolean> deletePlate(@RequestParam("plateIds") @NotNull List<Long> plateIds,
@RequestParam("planId") @NotNull Long planId) {
plateService.deletePlate(plateIds,planId);
return success(true);
}
@@ -142,7 +143,7 @@ public class PlateController {
@PostMapping("/insertPlate")
@Operation(summary = "优化生产创建板材")
@PreAuthorize("@ss.hasAnyPermissions('executor:plate:create','placeorder:optimize')")
public CommonResult<List<String>> createNewPlate(@Valid @RequestBody OptimizationSavePlateReqVO reqVO) {
public CommonResult<List<InsertPlateRespVO>> createNewPlate(@Valid @RequestBody List<OptimizationSavePlateReqVO> reqVO) {
return success(plateService.createNewPlate(reqVO));
}
@@ -0,0 +1,27 @@
package com.cf.imes.module.executor.controller.admin.plate.vo;
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 InsertPlateRespVO {
@Schema(description = "唯一标识")
private String blockKey;
@Schema(description = "新增的小板编号")
private List<String> plateNo;
}
@@ -36,6 +36,9 @@ public class OptimizationSavePlateReqVO {
private String bodyName;
@Schema(description = "唯一标识")
private String blockKey;
@Schema(description = "房间号")
@NotNull(message = "当前板材没有选择房间,请选择")
@Max(value = 0x7fffffffffffffffL,message = "房间数据错误,请重新进行新增")
@@ -0,0 +1,22 @@
package com.cf.imes.module.executor.controller.admin.plate.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderBodyNumVO {
@Schema(description = "柜体ID")
private Long bodyId;
@Schema(description = "板材数量")
private Integer plateNum;
}
@@ -150,19 +150,6 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
List<GoodsReqVO> selectGoodsAndRemainPlate(@Param("orderIds") List<Long> orderIds,@Param("goodsIdList") List<String> goodsIdList,@Param("organId") Long organId);
default List<GoodsDO> selectPlanGoodsListByPlanIdList(List<Long> orderIds,List<Long> planIds, Long organId) {
return selectList(new LambdaQueryWrapperX<GoodsDO>()
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.inIfPresent(GoodsDO::getOrderId,orderIds)
.in(GoodsDO::getPlanId,planIds)
.select(GoodsDO::getGoodsId,GoodsDO::getId,GoodsDO::getOrderId));
}
List<PlateResList> selectPlateListByPlanId(@Param("planIds") List<Long> planIds, @Param("organId") Long organId);
@@ -202,4 +189,17 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
List<OrderGoodsPlateIds> selectPlateGoodIds(@Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
default List<GoodsDO> selectOrderGoodsList(List<Long> orderIds, List<String> goodsIds, Long organId) {
return selectList(new LambdaQueryWrapperX<GoodsDO>()
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.inIfPresent(GoodsDO::getOrderId,orderIds)
.inIfPresent(GoodsDO::getGoodsId,goodsIds));
}
List<Long> selectInsertGoodsIds(@Param("orderIds") List<Long> orderIds,@Param("goodsIds") List<Long> goodsIds,@Param("organId") Long organId);
}
@@ -79,11 +79,11 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
}
default int deleteByPlateId(Long plateId,Long orderId, Long organId) {
default int deleteByPlateId(List<Long> plateId,List<Long> orderId, Long organId) {
return delete(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, organId)
.eq(OrderItemDO::getOrderId, orderId)
.eq(OrderItemDO::getPlateId, plateId));
.in(OrderItemDO::getOrderId, orderId)
.in(OrderItemDO::getPlateId, plateId));
}
@@ -99,12 +99,12 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
}
default OrderItemDO selectPlateList(Long plateId,Long orderId, Long organId) {
return selectOne(new LambdaQueryWrapperX<OrderItemDO>()
default List<OrderItemDO> selectPlateList(List<Long> plateId,List<Long> orderId, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId,organId)
.eqIfPresent(OrderItemDO::getOrderId,orderId)
.eqIfPresent(OrderItemDO::getPlateId, plateId)
.select(OrderItemDO::getBodyId));
.inIfPresent(OrderItemDO::getOrderId,orderId)
.inIfPresent(OrderItemDO::getPlateId, plateId)
.select(OrderItemDO::getBodyId,OrderItemDO::getPlateId));
}
@@ -74,4 +74,5 @@ public interface PlanItemMapper extends BaseMapperX<PlanItemDO> {
.select(PlanItemDO::getPlanId));
}
List<Long> selectOrderPlateList(@Param("orderIds") List<Long> orderIds,@Param("organId") Long organId);
}
@@ -74,11 +74,11 @@ public interface PlateGoodMapper extends BaseMapperX<PlateGoodDO> {
default PlateGoodDO selectGoodsByGoodsId(String goodsId, Long organId) {
return selectOne(new LambdaQueryWrapper<PlateGoodDO>()
default List<PlateGoodDO> selectGoodsByGoodsId(List<String> goodsId, Long organId) {
return selectList(new LambdaQueryWrapper<PlateGoodDO>()
.eq(PlateGoodDO::getOrganId,organId)
.eq(PlateGoodDO::getDeleted,false)
.eq(PlateGoodDO::getGoodsId, goodsId));
.in(PlateGoodDO::getGoodsId, goodsId));
}
}
@@ -197,7 +197,7 @@ public interface PlateMapper extends BaseMapperX<PlateDO> {
.inIfPresent(PlateDO::getOrderId,orderIds)
.inIfPresent(PlateDO::getGoodsId,goodsIdList)
.eq(PlateDO::getType, OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())
.select(PlateDO::getId));
.select(PlateDO::getId,PlateDO::getGoodsId));
}
@@ -4,13 +4,14 @@ import com.cf.imes.module.infra.api.file.FileApi;
import com.cf.imes.module.system.api.application.ApplicationApi;
import com.cf.imes.module.system.api.customplateno.CustomPlateNoSeqApi;
import com.cf.imes.module.system.api.dataSource.DataSourceApi;
import com.cf.imes.module.system.api.dict.DictDataApi;
import com.cf.imes.module.system.api.machine.MachineApi;
import com.cf.imes.module.system.api.organ.OrganApi;
import com.cf.imes.module.system.api.permission.PermissionApi;
import com.cf.imes.module.system.api.process.ProcessApi;
import com.cf.imes.module.system.api.process.ProcessGroupApi;
import com.cf.imes.module.system.api.systemconfig.SystemConfigApi;
import com.cf.imes.module.system.api.user.AdminUserApi;
import com.cf.imes.module.system.api.dict.DictDataApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@@ -20,6 +21,6 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, AdminUserApi.class,
FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class, ApplicationApi.class,
ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class})
ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class, PermissionApi.class})
public class RpcConfiguration {
}
@@ -26,6 +26,8 @@ import com.cf.imes.framework.common.util.Assert.AssertUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.es.core.service.ESDocumentService;
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.orderParts.vo.OrderPartsRemark;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource;
@@ -48,15 +50,13 @@ import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.dal.mysql.processStep.ProcessStepMapper;
import com.cf.imes.module.executor.dal.mysql.processStepItem.ProcessStepItemMapper;
import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper;
import com.cf.imes.module.executor.enums.ErrorCodeConstants;
import com.cf.imes.module.executor.util.elasticsearch.EsUtils;
import com.cf.imes.module.system.api.dataSource.DataSourceApi;
import com.cf.imes.module.system.api.machine.MachineApi;
import com.cf.imes.module.system.api.permission.PermissionApi;
import com.cf.imes.module.system.api.systemconfig.SystemConfigApi;
import com.cf.imes.module.system.api.systemconfig.dto.ProcessSchemeDTO;
import com.fasterxml.jackson.databind.JsonNode;
@@ -117,6 +117,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
@Resource
private SystemConfigApi systemConfigApi;
@Resource
private PermissionApi permissionApi;
@Resource
private EsUtils esUtils;
@@ -127,15 +130,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
@Resource
private OrderPartsMapper orderPartsMapper;
@Resource
private ProcessStepMapper processStepMapper;
@Resource
private ProcessStepItemMapper processStepItemMapper;
@Resource
private PlateGoodMapper plateGoodMapper;
@Resource
private OrderGroupMapper orderGroupMapper;
@@ -601,7 +595,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds);
AssertUtils.notEmpty(orderDOS,ORDER_PLAN_ERROR);
//
// 造型数据的尺寸长度
Integer orderModelSize = plateDetailRespVOS.size();
@@ -665,34 +659,43 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
OptimizeBoardModelDO boardModelDO = req.getOptimizeBoardModelDOS().get(0);
Long processId = req.getProcessId();
List<ActualGoodsList> actualGoodsLists = Optional.ofNullable(boardModelDO.getActualGoodsList()).orElse(new ArrayList<>());
AssertUtils.notEmpty(actualGoodsLists,PLAN_NO_ACTUAL_PLATE);
Long planId = boardModelDO.getPlanId();
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(), planId, ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
// 删除原来的优化信息
List<Boolean> isLocks = new ArrayList<>();
// 查询原优化信息然后进行判断
if(CollUtil.isNotEmpty(optimizeBoardModelDOS)){
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
throw exception(THIS_PLAN_OPTIMIZE_DATA_ERROR);
}
isLocks.addAll(optimizeBoardModelDOS.stream().map(OptimizeBoardModelDO::getIsLock).distinct().toList());
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
Boolean isLock = Optional.ofNullable(optimizeBoardModelDO.getIsLock()).orElse(false);
if(Boolean.TRUE.equals(isLock) && planDO.getIsScheduled().equals(true)){
throw exception(THIS_PLAN_IS_LOCK);
}
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
assert loginUser != null;
esUtils.deleteEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(),planId,ORDER_OPTIMIZE_PLATE_MODEL);
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);
}
}
@@ -701,12 +704,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
AssertUtils.notEmpty(plateDOS,THIS_PLAN_PLATE_DATA_ERROR);
if(processId != null && !planDO.getProcessId().equals(processId)) {
validatePlanStatus(planDO,isLocks);
planMapper.updateById(planDO.setProcessId(processId));
}
plateDOS.forEach(f->{
f.setIsOptimized(true);
});
plateMapper.updateBatch(plateDOS);
esUtils.deleteEsDocument(FIELD_PLAN_CONFIG_ID,FIELD_PLAN_ID,req.getPlanConfigId(),planId,ORDER_OPTIMIZE_PLATE_MODEL);
// 保存优化后的大板数据
esUtils.saveEsDocument(ORDER_OPTIMIZE_PLATE_MODEL,req.getOptimizeBoardModelDOS());
@@ -733,13 +747,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
AssertUtils.notEmpty(planDO,PLAN_NOT_EXISTS);
// 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID
if(!planDO.getProcessId().equals(processId)){
planMapper.updateById(planDO.setProcessId(processId));
}
esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
List<PlateDO> plateDOS = planItemMapper.selectOrderPlanPlateListByPlanId(planId,getUserOrganId());
@@ -755,11 +762,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// 不能加非空判断,因为方案组里可能没有优化信息
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));
modelDOList.add(SaveProcessSchemeModelDO.builder()
.planConfigId(f.getPlanConfigId())
.planName(f.getPlanConfigName())
@@ -772,6 +782,19 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
// 如果方案组ID不相等,就删除旧的方案组信息,再保存新的加工方案组ID
if(!planDO.getProcessId().equals(processId)){
validatePlanStatus(planDO,isLocks);
planMapper.updateById(planDO.setProcessId(processId));
}
esUtils.deleteEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
esUtils.saveEsDocument(PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,modelDOList);
@@ -788,54 +811,53 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
planProcessSchemeList.setProcessSchemeList(schemeDTOList);
if(planId != null) {
validatePlanExists(planId);
validatePlanExists(planId);
// 查询排单对应的方案组信息
List<SaveProcessSchemeModelDO> saveProcessSchemeReqVOS = Optional.ofNullable(esUtils.getEsDocument(FIELD_PLAN_ID,planId,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL,SaveProcessSchemeModelDO.class)).orElse(new ArrayList<>());
// 查询排单对应的方案组信息
List<SaveProcessSchemeModelDO> saveProcessSchemeReqVOS = Optional.ofNullable(esUtils.getEsDocument(FIELD_PLAN_ID, planId, PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL, SaveProcessSchemeModelDO.class)).orElse(new ArrayList<>());
// 查询排单对应的优化信息
List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId,schemeDTOList.size(), ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
// 查询排单对应的优化信息
List<OptimizeBoardModelDO> optimizeBoardModelDOS = esUtils.getEsDocument(FIELD_PLAN_ID, planId, schemeDTOList.size(), ORDER_OPTIMIZE_PLATE_MODEL, OptimizeBoardModelDO.class);
if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) {
if (CollUtil.isNotEmpty(optimizeBoardModelDOS)) {
if(CollUtil.isNotEmpty(saveProcessSchemeReqVOS)) {
if (CollUtil.isNotEmpty(saveProcessSchemeReqVOS)) {
saveProcessSchemeReqVOS.forEach(f -> {
saveProcessSchemeReqVOS.forEach(f -> {
List<OptimizeBoardModelDO> modelDOList = optimizeBoardModelDOS.stream().filter(o -> o.getPlanConfigId().equals(f.getPlanConfigId())).toList();
if(CollUtil.isNotEmpty(modelDOList)) {
List<OptimizeBoardModelDO> modelDOList = optimizeBoardModelDOS.stream().filter(o -> o.getPlanConfigId().equals(f.getPlanConfigId())).toList();
if (CollUtil.isNotEmpty(modelDOList)) {
String jsonString = toJsonString(modelDOList.get(0));
String jsonString = toJsonString(modelDOList.get(0));
f.setPlanOptimize(jsonString);
}
});
}else {
optimizeBoardModelDOS.forEach(f -> {
f.setPlanOptimize(jsonString);
}
});
} else {
optimizeBoardModelDOS.forEach(f -> {
saveProcessSchemeReqVOS.add(SaveProcessSchemeModelDO.builder()
.planConfigId(f.getPlanConfigId())
.planName(f.getPlanConfigName())
.planId(f.getPlanId())
.plateNum(f.getPlaceBlockNumber())
.goodsNum(f.getBoardCount())
.planOptimize(toJsonString(f))
.build());
saveProcessSchemeReqVOS.add(SaveProcessSchemeModelDO.builder()
.planConfigId(f.getPlanConfigId())
.planName(f.getPlanConfigName())
.planId(f.getPlanId())
.plateNum(f.getPlaceBlockNumber())
.goodsNum(f.getBoardCount())
.planOptimize(toJsonString(f))
.build());
});
}
});
}
planProcessSchemeList.setSaveProcessSchemeReqVOS(saveProcessSchemeReqVOS);
}
planProcessSchemeList.setSaveProcessSchemeReqVOS(saveProcessSchemeReqVOS);
return planProcessSchemeList;
}
@@ -1451,6 +1473,10 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
OptimizeBoardModelDO optimizeBoardModelDO,
Date date) {
remainBoardInfos.forEach(f->{
f.setPlaceBoardJSON(toJsonString(f.getPlaceBoardList()));
});
Map<String, Object> updateData = new HashMap<>();
updateData.put("cutedBoardNumber", optimizeBoardModelDO.getCutedBoardNumber());
updateData.put("cutedBlockNumber", optimizeBoardModelDO.getCutedBlockNumber());
@@ -1469,6 +1495,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
private void updatePlateData(List<Long> orderIds, List<String> planNo, Integer cutedType) {
if(CollUtil.isEmpty(planNo)){
return;
}
List<PlateDO> plateDOS = plateMapper.selectPlateByPlateNo(orderIds, planNo, getUserOrganId());
AssertUtils.notEmpty(plateDOS, THIS_PLAN_PLATE_DATA_ERROR);
@@ -1586,4 +1617,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
private void validatePlanStatus(PlanDO planDO,List<Boolean> isLocks){
if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
throw exception(THIS_PLAN_PLATE_IS_CUT);
}
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
assert loginUser != null;
Boolean data = permissionApi.hasAnyPermissions(loginUser.getId(), "placeorder:list").getCheckedData();
if(Boolean.TRUE.equals(planDO.getIsScheduled()) && isLocks.contains(true) && Boolean.FALSE.equals(data)){
throw exception(THIS_PLAN_PROCESS_SCHEME_IS_LOCK);
}
}
}
@@ -319,7 +319,7 @@ public class PlanServiceImpl implements PlanService {
if(updateReqVO.getProcessId() != null){
if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
throw exception(LIST_CHANGES_ARE_PROHIBITED);
throw exception(THIS_PLAN_PLATE_IS_CUT);
}
planDO.setProcessId(updateReqVO.getProcessId());
@@ -328,6 +328,8 @@ public class PlanServiceImpl implements PlanService {
}else {
planDO.setIsScheduled(updateReqVO.getIsScheduled());
planMapper.updateById(planDO);
}
@@ -412,8 +414,12 @@ public class PlanServiceImpl implements PlanService {
if (!plateDOS.isEmpty()) {
List<Long> plateIdList = plateDOS.stream().map(PlateDO::getId).toList();
List<Long> goodsIds = plateDOS.stream().map(PlateDO::getGoodsId).toList();
plateMapper.deleteBatchIds(plateIdList);
goodsMapper.deleteBatchIds(goodsIds);
orderItemMapper.delete(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, getUserOrganId())
.inIfPresent(OrderItemDO::getOrderId, orderIds)
@@ -431,28 +437,22 @@ public class PlanServiceImpl implements PlanService {
esUtils.deleteEsDocument(FIELD_PLANID,planIds,PLAN_PROCESS_SCHEME_OPTIMIZE_MODEL);
// 查询删除排单对应的生产单是否还有进行了其他排单
List<Long> orderIdList = planItemMapper.selectOrderPlateList(orderIds, getUserOrganId());
// 查询删除的小板对应的生产单信息,如果生产单的小板全部改成了未优化,修改状态
List<PlateDO> plateIsOptimizedList = plateMapper.selectPlateIsOptimized(orderIds, getUserOrganId());
List<Long> diff = Stream.concat(
orderIdList.stream().filter(str -> !orderIds.contains(str)),
orderIds.stream().filter(str -> !orderIdList.contains(str)))
.toList();
if(CollUtil.isNotEmpty(plateIsOptimizedList)){
List<Long> orderIdList = plateIsOptimizedList.stream().map(PlateDO::getOrderId).distinct().toList();
if (CollUtil.isNotEmpty(diff)) {
List<Long> diff = Stream.concat(
orderIdList.stream().filter(str -> !orderIds.contains(str)),
orderIds.stream().filter(str -> !orderIdList.contains(str)))
.toList();
List<OrderDO> orderList = orderMapper.selectBatchIds(diff);
if(CollUtil.isNotEmpty(diff)){
List<OrderDO> orderList = orderMapper.selectBatchIds(diff);
orderList.forEach(f->f.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()));
orderMapper.updateBatch(orderList);
}
orderList.forEach(f -> f.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()));
orderMapper.updateBatch(orderList);
}
@@ -1212,11 +1212,12 @@ public class PlanServiceImpl implements PlanService {
// 查询删除的小板对应的生产单信息,如果生产单的小板全部改成了未优化,修改状态
List<PlateDO> plateIsOptimizedList = plateMapper.selectPlateIsOptimized(deleteOrderIds, getUserOrganId());
// List<PlateDO> plateIsOptimizedList = plateMapper.selectPlateIsOptimized(deleteOrderIds, getUserOrganId());
// if(CollUtil.isNotEmpty(plateIsOptimizedList)){
// List<Long> orderIds = plateIsOptimizedList.stream().map(PlateDO::getOrderId).distinct().toList();
if(CollUtil.isNotEmpty(plateIsOptimizedList)){
List<Long> orderIds = plateIsOptimizedList.stream().map(PlateDO::getOrderId).distinct().toList();
List<Long> orderIds = planItemMapper.selectOrderPlateList(deleteOrderIds, getUserOrganId());
List<Long> diff = Stream.concat(
orderIds.stream().filter(str -> !deleteOrderIds.contains(str)),
@@ -1232,7 +1233,7 @@ public class PlanServiceImpl implements PlanService {
orderMapper.updateBatch(orderList);
}
}
// }
}
@@ -36,9 +36,9 @@ public interface PlateService {
/**
* 删除生产单板件
*
* @param id 编号
* @param plateIds 编号
*/
void deletePlate(Long id,Long planId);
void deletePlate(List<Long> plateIds,Long planId);
/**
* 获得生产单板件
@@ -99,6 +99,6 @@ public interface PlateService {
List<BodyPlateDetailVO> getPlateModelByPlateId(List<Long> bodyIds);
List<String> createNewPlate(OptimizationSavePlateReqVO reqVO);
List<InsertPlateRespVO> createNewPlate(List<OptimizationSavePlateReqVO> reqVO);
}
@@ -7,8 +7,10 @@ import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
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;
@@ -18,21 +20,21 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.Assert.AssertUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.es.core.service.ESDocumentService;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
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.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PlatePlaceInfo;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
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;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper;
@@ -40,6 +42,7 @@ import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import com.cf.imes.module.executor.dal.mysql.planItem.PlanItemMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderItemType;
@@ -48,7 +51,6 @@ 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.fileConversion.admin.SnowflakeIdWorker3rd;
import com.cf.imes.module.system.enums.ErrorCodeConstants;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -58,14 +60,12 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_DATA_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.util.json.JsonUtils.parseObject;
import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString;
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.*;
@@ -100,6 +100,10 @@ public class PlateServiceImpl implements PlateService {
@Resource
private OrderMapper orderMapper;
@Resource
private PlanItemMapper planItemMapper;
@Resource
private SnowflakeIdWorker3rd idWorker;
@@ -115,12 +119,17 @@ public class PlateServiceImpl implements PlateService {
@Resource
private EsUtils esUtils;
@Resource
private IdentifierGenerator identifierGenerator;
private static final String ORDER_REMAIN_PLATE_MODEL = "imes_order_optimize_plate_model";
private static final String ORDER_PLATE_MODEL = "imes_order_plate_model";
private static final String FIELD_PLATE_ID = "plateId";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Long createPlate(PlateSaveReqVO createReqVO) {
// 插入
@@ -141,73 +150,78 @@ public class PlateServiceImpl implements PlateService {
@Override
@Transactional(rollbackFor = Exception.class)
public void deletePlate(Long id,Long planId) {
public void deletePlate(List<Long> plateIds,Long planId) {
if(CollUtil.isEmpty(plateIds)){
return;
}
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
PlateDO plateDO = plateMapper.selectById(id);
List<PlateDO> plateDOS = plateMapper.selectBatchIds(plateIds);
AssertUtils.notEmpty(plateDO,REMAIN_PLATE_NOT_EXISTS);
AssertUtils.notEmpty(plateDOS,REMAIN_PLATE_NOT_EXISTS);
if(!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())){
throw exception(PLATE_IS_SOURCE);
}
for (PlateDO plateDO : plateDOS) {
if(!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())){
throw exception(PLATE_IS_SOURCE,plateDO.getPlateNo());
}
if(Boolean.TRUE.equals(plateDO.getIsOptimized())) {
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL);
if (!optimizeBoardModelDOS.isEmpty()) {
// todo 目前只解决了非混单的情况(目前混单的问题应该已经解决,数据正确性问题待验证)
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
try {
Long placeBlockNumber = optimizeBoardModelDO.getPlaceBlockNumber() - 1;
List<PlatePlaceInfo> asJsonObject = parseObject(optimizeBoardModelDO.getBlockPlaceInfo(), new TypeReference<>() {});
String blockPlaceInfo = toJsonString(
asJsonObject.stream()
.filter(f -> !f.getBo().equals(plateDO.getPlateNo()))
.toList());
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("blockPlaceInfo",blockPlaceInfo);
objectObjectHashMap.put("placeBlockNumber",placeBlockNumber);
esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap);
} catch (Exception e) {
log.error(e.getMessage());
throw new ServiceException(ES_DATA_ERROR);
}
if(!plateDO.getIsCutted().equals(OrderPlateCutStatusEnum.NOCUTTING.getStatus())){
throw exception(THIS_PLATE_IS_OPTIMIZE,plateDO.getPlateNo());
}
}
Long bodyId = orderItemMapper.selectPlateList(id, plateDO.getOrderId(), plateDO.getOrganId()).getBodyId();
OrderBodyDO orderBodyDO = orderBodyMapper.selectById(bodyId);
List<Long> plateIdList = plateDOS.stream().map(PlateDO::getId).toList();
orderBodyDO.setPlateNum(orderBodyDO.getPlateNum() - 1);
orderBodyMapper.updateById(orderBodyDO);
List<Long> orderIds = plateDOS.stream().map(PlateDO::getOrderId).distinct().toList();
List<Long> goodsIds = plateDOS.stream().map(PlateDO::getGoodsId).distinct().toList();
List<OrderItemDO> orderItemDOS = orderItemMapper.selectPlateList(plateIdList, orderIds, getUserOrganId());
List<Long> bodyIds = orderItemDOS.stream().map(OrderItemDO::getBodyId).distinct().toList();
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds);
orderBodyDOS.forEach(f->{
int plateNum = orderItemDOS.stream().filter(o -> f.getId().equals(o.getBodyId())).toList().size();
f.setPlateNum(f.getPlateNum() - plateNum);
});
orderBodyMapper.updateBatch(orderBodyDOS);
// 删除小板ID
plateMapper.deleteBatchIds(plateIdList);
// 删除小板明细信息
orderItemMapper.deleteByPlateId(plateIdList, orderIds, getUserOrganId());
// 删除添加自增板时新增的大板ID
List<Long> plateId = goodsMapper.selectInsertGoodsIds(orderIds, goodsIds, getUserOrganId());
if(CollUtil.isNotEmpty(plateId)){
goodsMapper.deleteBatchIds(plateId);
}
// 删除排单和板材明细的小板信息
planItemMapper.delete(new LambdaQueryWrapperX<PlanItemDO>()
.eq(PlanItemDO::getOrganId, getUserOrganId())
.in(PlanItemDO::getOrderId,orderIds)
.in(PlanItemDO::getPlateId,plateIdList)
.eq(PlanItemDO::getPlanId, planId));
orderItemMapper.deleteByPlateId(id, plateDO.getOrderId(), plateDO.getOrganId());
// 删除
plateMapper.deleteById(id);
}
private void validatePlateExists(Long id) {
@@ -433,75 +447,191 @@ public class PlateServiceImpl implements PlateService {
@Override
@Transactional(rollbackFor = Exception.class)
public List<String> createNewPlate(OptimizationSavePlateReqVO reqVO) {
GoodsDO goodsDO = goodsMapper.selectGoodsId(reqVO.getOrderId(), reqVO.getGoodsId(), getUserOrganId());
AssertUtils.notEmpty(goodsDO,ORDER_PLAN_ERROR);
public List<InsertPlateRespVO> createNewPlate(List<OptimizationSavePlateReqVO> reqVO) {
List<PlateDO> plateDOS = new ArrayList<>();
for (int i = 0; i < reqVO.getMultiple(); i++) {
List<OrderItemDO> orderItemDOS = new ArrayList<>();
// 生成板编号
long plateNo = idWorker.nextId();
long obtainingTime = SnowflakeIdWorker3rd.obtainingTime();
List<PlanItemDO> planItemDOS = new ArrayList<>();
PlateDO plateDO = BeanUtils.toBean(reqVO, PlateDO.class);
List<InsertPlateRespVO> insertPlateRespVOS = new ArrayList<>();
List<OrderBodyNumVO> orderBodyNumVOS = new ArrayList<>();
String remake1 = reqVO.getRemake1() == null ? "" : reqVO.getRemake1() + ";" ;
List<String> goodsIds = new ArrayList<>(reqVO.stream().map(OptimizationSavePlateReqVO::getGoodsId).distinct().toList());
String remake2 = reqVO.getRemake2() == null ? "" : reqVO.getRemake2();
List<Long> orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList();
plateDO.setRemark(remake1+remake2);
plateDO.setHoleArrange(reqVO.getPlaceHole());
plateDO.setGoodsId(goodsDO.getId());
plateDO.setThickness(goodsDO.getThickness());
plateDO.setIsOptimized(false);
plateDO.setPlateNo((obtainingTime) + Long.toString(plateNo).substring(2));
plateDO.setType(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType());
List<GoodsDO> goodsDOList = goodsMapper.selectOrderGoodsList(orderIds, goodsIds, getUserOrganId());
plateDO.setArea(reqVO.getWidth().multiply(reqVO.getHeight()).movePointLeft(6).stripTrailingZeros());
goodsIds.removeAll(goodsDOList.stream().map(GoodsDO::getGoodsId).distinct().toList());
plateDOS.add(plateDO);
if(CollUtil.isNotEmpty(goodsIds)){
List<GoodsDO> goodsDOS = new ArrayList<>();
List<PlateGoodDO> plateGoodDOS = plateGoodMapper.selectGoodsByGoodsId(goodsIds, getUserOrganId());
for (PlateGoodDO plateGoodDO : plateGoodDOS) {
GoodsDO goodsDO = GoodsDO.builder()
.id(null)
.orderId(reqVO.stream().filter(f -> f.getGoodsId().equals(plateGoodDO.getGoodsId())).map(OptimizationSavePlateReqVO::getOrderId).toList().get(0))
.rawGoodsId("0")
.goodsId(plateGoodDO.getGoodsId())
.goodsName(plateGoodDO.getGoodsName())
.material(plateGoodDO.getMaterial())
.texture(plateGoodDO.getTexture())
.color(plateGoodDO.getColor())
.width(BigDecimal.valueOf(plateGoodDO.getWidth()))
.height(BigDecimal.valueOf(plateGoodDO.getHeight()))
.thickness(BigDecimal.valueOf(plateGoodDO.getThickness()))
.remark(plateGoodDO.getRemark())
.brand(plateGoodDO.getBrand())
.build();
goodsDOS.add(goodsDO);
}
goodsMapper.insertBatch(goodsDOS);
goodsDOList.addAll(goodsDOS);
}
reqVO.forEach(f->{
List<String> plateNoList = new ArrayList<>();
Long orderId = f.getOrderId();
GoodsDO goodsDO = goodsDOList.stream().filter(g -> g.getGoodsId().equals(f.getGoodsId())).toList().get(0);
orderBodyNumVOS.add(OrderBodyNumVO.builder()
.bodyId(f.getBodyId())
.plateNum(f.getMultiple())
.build());
for (int i = 0; i < f.getMultiple(); i++) {
// 生成板编号
long obtainingTime = SnowflakeIdWorker3rd.obtainingTime();
String plateNo = (obtainingTime) + Long.toString(idWorker.nextId()).substring(2);
plateNoList.add(plateNo);
String remake1 = f.getRemake1() == null ? "" : f.getRemake1() + ";";
String remake2 = f.getRemake2() == null ? "" : f.getRemake2();
// 小板ID
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());
// 生产单明细表新增数据
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()
.blockKey(f.getBlockKey())
.plateNo(plateNoList)
.build());
});
plateMapper.insertBatch(plateDOS);
List<OrderBodyNumVO> numVOS = mergeOrderBody(orderBodyNumVOS);
// 生产单柜体表新增数据
OrderBodyDO orderBodyDO = orderBodyMapper.selectById(reqVO.getBodyId());
List<Long> bodyIds = numVOS.stream().map(OrderBodyNumVO::getBodyId).toList();
AssertUtils.notEmpty(orderBodyDO,PLAN_BODY_DATA_ERROR);
orderBodyDO.setPlateNum(reqVO.getMultiple()+orderBodyDO.getPlateNum());
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds);
orderBodyMapper.updateById(orderBodyDO);
orderBodyDOS.forEach(f->{
List<OrderItemDO> orderItemDOS = new ArrayList<>();
Integer plateNum = numVOS.stream()
.filter(n -> n.getBodyId().equals(f.getId()))
.map(OrderBodyNumVO::getPlateNum)
.findFirst().orElse(0);
plateDOS.forEach(plateDO -> {
// 生产单明细表新增数据
OrderItemDO orderItemDO = OrderItemDO.builder()
.orderId(reqVO.getOrderId())
.type(OrderItemType.BOARD.getCode())
.roomId(reqVO.getRoomId())
.bodyId(reqVO.getBodyId())
.plateId(plateDO.getId())
.build();
orderItemDOS.add(orderItemDO);
}
);
f.setPlateNum(f.getPlateNum() + plateNum);
});
orderBodyMapper.updateBatch(orderBodyDOS);
planItemMapper.insertBatch(planItemDOS);
orderItemMapper.insertBatch(orderItemDOS);
return plateDOS.stream().map(PlateDO::getPlateNo).toList();
return insertPlateRespVOS;
}
public static List<OrderBodyNumVO> mergeOrderBody(List<OrderBodyNumVO> dataList) {
if (dataList == null || dataList.isEmpty()) {
return Collections.emptyList();
}
// 使用 HashMap 来聚合数据,key 为 filed1value 为 TestData 对象
Map<Long, Integer> mergedMap = new HashMap<>();
for (OrderBodyNumVO data : dataList) {
// 合并逻辑:将 filed2 的值累加
mergedMap.merge(data.getBodyId(), data.getPlateNum(), Integer::sum);
}
// 将结果转换回 List<TestData>
return mergedMap.entrySet().stream()
.map(entry -> new OrderBodyNumVO(entry.getKey(), entry.getValue()))
.toList();
}
private List<OrderModelDO> buildRespByPlateIds(Collection<Long> plateIds, String index) {
List<FieldValue> fieldValues = plateIds.stream().map(FieldValue::of).toList();
@@ -523,23 +653,4 @@ public class PlateServiceImpl implements PlateService {
}
private List<OptimizeBoardModelDO> buildBoardByPlanId(Long planId, String index) {
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
builder.query(q -> q.term(b -> b.field("planId").value(planId)));
try {
SearchResponse<OptimizeBoardModelDO> search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class);
List<Hit<OptimizeBoardModelDO>> hits = search.hits().hits();
if (CollUtil.isNotEmpty(hits)) {
return hits.stream().map(Hit::source).toList();
}
return new ArrayList<>();
} catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(INTERNAL_SERVER_ERROR);
}
}
}
@@ -28,7 +28,20 @@
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO">
select distinct
og.*,
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
from order_goods og
@@ -516,4 +529,32 @@
</select>
<select id="selectInsertGoodsIds" resultType="java.lang.Long">
select distinct
og.id
from order_goods og
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
where og.organ_id = #{organId}
and og.order_id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
#{orderIds}
</foreach>
and og.id in
<foreach collection="goodsIds" item="goodsIds" open="(" close=")" separator=",">
#{goodsIds}
</foreach>
and og.raw_goods_id = '0'
and op.id is null;
</select>
</mapper>
@@ -399,4 +399,22 @@
</select>
<select id="selectOrderPlateList" resultType="java.lang.Long">
select distinct
order_id
from order_plan_item
where organ_id = #{organId}
and order_id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
#{orderIds}
</foreach>
</select>
</mapper>
@@ -135,7 +135,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// url解码xml
String content = createReqVO.getContent();
if (StringUtils.isNotEmpty(content)) {
createReqVO.setContent(URLUtil.decode(content));
String decode = URLUtil.decode(content);
createReqVO.setContent(decode);
// 解析xml
new ReportParser().parse(new ByteArrayInputStream(decode.getBytes()), createReqVO.getName());
}
// 新增模板
ReportTemplateDO template = BeanUtils.toBean(createReqVO, ReportTemplateDO.class);
@@ -184,6 +187,12 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
copyTemplateDO.setUpdater(null);
copyTemplateDO.setUpdateTime(null);
copyTemplateDO.setCreateTime(null);
// 解析xml
String content = copyTemplateDO.getContent();
if (StringUtils.isNotEmpty(content)) {
// 解析xml
new ReportParser().parse(new ByteArrayInputStream(content.getBytes()), createReqVO.getName());
}
// 生成id
copyTemplateDO.setId((Long) snowFlakeGenerator.nextId(null));
// 新增模版
@@ -204,7 +213,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// url解码xml
String content = updateReqVO.getContent();
if (StringUtils.isNotEmpty(content)) {
updateReqVO.setContent(URLUtil.decode(content));
String decode = URLUtil.decode(content);
updateReqVO.setContent(decode);
// 解析xml
new ReportParser().parse(new ByteArrayInputStream(decode.getBytes()), updateReqVO.getName());
}
// 更新模板
ReportTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ReportTemplateDO.class);
@@ -259,7 +259,7 @@ public class ErrorCodeConstants {
public static final ErrorCode RAW_GOODS_NOT_EXISTS = new ErrorCode(1_002_033_006, "设计板材不存在");
public static final ErrorCode RAW_GOODS_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_033_007, "生产板材导入数据不可以为空");
public static final ErrorCode PLATE_GOODS_ID_NOT_SAME = new ErrorCode(1_002_033_009, "板材商品编号存在,请重新命名商品编号");
public static final ErrorCode PLATE_IS_SOURCE = new ErrorCode(1_002_033_010, "当前板材为源小板,无法删除");
public static final ErrorCode PLATE_IS_SOURCE = new ErrorCode(1_002_033_010, "小板:{} 为源小板,无法删除");
public static final ErrorCode PLAN_GOODS_IS_FILTER_DATA_ERROR = new ErrorCode(1_002_033_011, "当前排单为非混单,无法添加颜色的筛选条件");
public static final ErrorCode PLAN_STATUS_ERROR = new ErrorCode(1_002_033_012, "当前排单未投产,无法进行开料");
@@ -325,11 +325,14 @@ public class ErrorCodeConstants {
public static final ErrorCode THIS_PLAN_PLATE_DATA_ERROR = new ErrorCode(1_002_041_039, "当前排单对应的板材数据为空,请重新进行排单或检查生产单对应的板材信息");
public static final ErrorCode PLAN_PROCESS_CONFIG_IS_NULL = new ErrorCode(1_002_041_040, "排单:{} 对应的方案组为空,请进行配置");
public static final ErrorCode PLAN_PROCESS_CONFIG_ALL_IS_NULL = new ErrorCode(1_002_041_041, "当前所选排单对应的方案组配置均为空,请重新进行方案组配置");
public static final ErrorCode THIS_PLAN_IS_LOCK = new ErrorCode(1_002_041_042, "当前排单已被锁定,无法进行优化,请解锁后再进行优化");
public static final ErrorCode THIS_PLAN_OPTIMIZE_IS_LOCK = new ErrorCode(1_002_041_042, "当前排单已被锁定,无法进行优化,请解锁后再进行优化");
public static final ErrorCode THIS_PLAN_PROCESS_SCHEME_IS_LOCK = new ErrorCode(1_002_041_043, "当前排单已被锁定,无法修改方案组,请解锁后再进行修改");
public static final ErrorCode THIS_PLAN_OPTIMIZE_DATA_ERROR = new ErrorCode(1_002_041_044, "当前排单已全部开料,无法进行再次优化");
public static final ErrorCode THIS_PLAN_PLATE_IS_CUT = new ErrorCode(1_002_041_045, "当前排单已有板材开料,无法修改");
public static final ErrorCode THIS_PLAN_PLATE_OPTIMIZE_IS_ALL = new ErrorCode(1_002_041_046, "当前排单已全部开料,无法进行选择");
public static final ErrorCode THIS_PLATE_IS_OPTIMIZE = new ErrorCode(1_002_041_046, "小板:{},已开料,无法删除,请重新选择小板再删除");