diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java index 8ee8bdfbe..fc273ff55 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java @@ -211,6 +211,7 @@ public class ErrorCodeConstants { public static final ErrorCode VENEER_PLAN_PLATE_SOURCE_MISMATCH = new ErrorCode(1_003_009_049, "veneer.plan.plate.source.mismatch"); public static final ErrorCode VENEER_PLAN_PLATE_STATUS_CHANGED = new ErrorCode(1_003_009_050, "veneer.plan.plate.status.changed"); public static final ErrorCode VENEER_DECOMPOSE_RECORD_INSERT_FAILED = new ErrorCode(1_003_009_051, "veneer.decompose.record.insert.failed"); + public static final ErrorCode VENEER_DECOMPOSE_PLATE_SIZE_INVALID = new ErrorCode(1_003_009_052, "veneer.decompose.plate.size.invalid"); //=========== 部件管理 1-003-010-000 ============ public static final ErrorCode ORDER_COMPONENT_NOT_EXIST = new ErrorCode(1_003_010_000, "order.component.not.exist"); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java index 396543021..4fe2ec5b3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/OrderPlateVeneerDO.java @@ -59,12 +59,12 @@ public class OrderPlateVeneerDO extends BaseDO { private String plateName; /** - * 原板件长度,单位:mm。 + * 贴皮最终长度,已包含两侧外扩余量,单位:mm。 */ private BigDecimal plateLength; /** - * 原板件宽度,单位:mm。 + * 贴皮最终宽度,已包含两侧外扩余量,单位:mm。 */ private BigDecimal plateWidth; @@ -98,6 +98,11 @@ public class OrderPlateVeneerDO extends BaseDO { */ private BigDecimal outerMargin; + /** + * 贴皮面积,单位:平方米。 + */ + private BigDecimal veneerArea; + /** * 贴皮排单ID,0表示未排单。 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java index f8b7adfe1..068834a6c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java @@ -38,6 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -51,6 +52,7 @@ import static com.cf.imes.framework.common.pojo.PageParam.PAGE_SIZE_NONE; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_DECOMPOSE_PLATE_STATUS_CHANGED; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_DECOMPOSE_PLATE_SIZE_INVALID; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_DECOMPOSE_RECORD_INSERT_FAILED; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_DECOMPOSE_SCOPE_REQUIRED; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_DECOMPOSE_SIDE_REQUIRED; @@ -72,6 +74,22 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { */ private static final int DECOMPOSE_STAT_BATCH_SIZE = 100; + /** + * 外扩余量需要向板件长、宽的两侧分别增加。 + */ + private static final BigDecimal OUTER_MARGIN_DOUBLE = new BigDecimal("2"); + + /** + * 平方毫米转换为平方米的除数。 + */ + private static final BigDecimal SQUARE_MILLIMETER_PER_SQUARE_METER = + new BigDecimal("1000000"); + + /** + * 单张贴皮面积保留的小数位数。 + */ + private static final int VENEER_AREA_SCALE = 3; + @Resource private VeneerDecomposeMapper veneerDecomposeMapper; @@ -423,6 +441,25 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { */ private OrderPlateVeneerDO buildPlateVeneer(PlateDO plate, VeneerDO sourceVeneer, VeneerSideEnum veneerSide, BigDecimal outerMargin) { + BigDecimal actualOuterMargin = ObjectUtil.defaultIfNull(outerMargin, BigDecimal.TEN); + BigDecimal sourceLength = plate.getHeight(); + BigDecimal sourceWidth = plate.getWidth(); + if (sourceLength == null || sourceWidth == null + || sourceLength.signum() <= 0 || sourceWidth.signum() <= 0 + || actualOuterMargin.signum() < 0) { + throw new ServiceException(VENEER_DECOMPOSE_PLATE_SIZE_INVALID, plate.getPlateNo()); + } + + // 外扩余量作用于板件四周,长、宽分别增加两倍余量后作为贴皮最终尺寸。 + BigDecimal veneerLength = sourceLength.add( + actualOuterMargin.multiply(OUTER_MARGIN_DOUBLE)); + BigDecimal veneerWidth = sourceWidth.add( + actualOuterMargin.multiply(OUTER_MARGIN_DOUBLE)); + BigDecimal veneerArea = veneerLength.multiply(veneerWidth).divide( + SQUARE_MILLIMETER_PER_SQUARE_METER, + VENEER_AREA_SCALE, + RoundingMode.HALF_UP); + int plateSurface = resolvePlateSurface(plate.getHoleArrange(), veneerSide); return OrderPlateVeneerDO.builder() .organId(plate.getOrganId()) @@ -431,14 +468,15 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { .orderPlateId(plate.getId()) .plateNo(plate.getPlateNo()) .plateName(plate.getName()) - .plateLength(plate.getHeight()) - .plateWidth(plate.getWidth()) + .plateLength(veneerLength) + .plateWidth(veneerWidth) .plateThickness(plate.getThickness()) .holeArrange(plate.getHoleArrange()) .veneerSide(veneerSide.getSide()) .plateSurface(plateSurface) .veneerNo(plate.getPlateNo() + veneerSide.getSide()) - .outerMargin(outerMargin) + .outerMargin(actualOuterMargin) + .veneerArea(veneerArea) .planId(0L) .sourceVeneerId(sourceVeneer.getId()) .sourceVeneerNo(sourceVeneer.getVeneerNo()) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java index 61e220cc7..125de4136 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerPlanServiceImpl.java @@ -124,16 +124,6 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { VeneerPlanStatusEnum.NOCUTTING.getStatus(), VeneerPlanStatusEnum.OPTIMIZED.getStatus()); - /** - * 平方毫米转换为平方米的除数。 - */ - private static final BigDecimal SQUARE_MILLIMETER_PER_SQUARE_METER = new BigDecimal("1000000"); - - /** - * 外扩余量需要向长、宽的两侧分别增加。 - */ - private static final BigDecimal OUTER_MARGIN_DOUBLE = new BigDecimal("2"); - @Resource private VeneerPlanMapper veneerPlanMapper; @@ -877,27 +867,21 @@ public class VeneerPlanServiceImpl implements VeneerPlanService { } /** - * 根据原板尺寸和外扩余量计算当前贴皮排单的总面积。 + * 汇总当前贴皮排单的贴皮面积。 * A/B面作为两条贴皮记录分别累计,结果单位为平方米。 * * @param veneers 同一贴皮商品编号下的贴皮记录 - * @return 保留四位小数的贴皮总面积 + * @return 保留三位小数的贴皮总面积 */ private BigDecimal calculateVeneerArea(List veneers) { - BigDecimal totalSquareMillimeter = BigDecimal.ZERO; + BigDecimal totalArea = BigDecimal.ZERO; for (OrderPlateVeneerDO veneer : veneers) { - BigDecimal length = veneer.getPlateLength(); - BigDecimal width = veneer.getPlateWidth(); - BigDecimal outerMargin = Objects.requireNonNullElse(veneer.getOuterMargin(), BigDecimal.ZERO); - if (length == null || width == null || length.signum() <= 0 || width.signum() <= 0 - || outerMargin.signum() < 0) { + BigDecimal veneerArea = veneer.getVeneerArea(); + if (veneerArea == null || veneerArea.signum() <= 0) { throw new ServiceException(VENEER_PLAN_AREA_DATA_INVALID, veneer.getId()); } - BigDecimal finalLength = length.add(outerMargin.multiply(OUTER_MARGIN_DOUBLE)); - BigDecimal finalWidth = width.add(outerMargin.multiply(OUTER_MARGIN_DOUBLE)); - totalSquareMillimeter = totalSquareMillimeter.add(finalLength.multiply(finalWidth)); + totalArea = totalArea.add(veneerArea); } - return totalSquareMillimeter.divide( - SQUARE_MILLIMETER_PER_SQUARE_METER, 4, RoundingMode.HALF_UP); + return totalArea.setScale(3, RoundingMode.HALF_UP); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml index 14fcff5aa..fec2dd7ac 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerManageMapper.xml @@ -384,8 +384,8 @@ og.brand, og.material, op.height, - op.height AS length, - op.width, + opv.plate_length AS length, + opv.plate_width AS width, op.thickness, op.split_width AS splitWidth, op.split_height AS splitHeight, diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml index 2d795fe03..d8648e3cb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/veneer/VeneerPlanMapper.xml @@ -116,10 +116,7 @@