From c4fb10c49ed1744c1bafe8411496faaa8ca3cff5 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 15 Jul 2026 11:08:11 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=B4=B4=E7=9A=AE=E5=85=A5=E5=8F=82=E6=A0=A1=E9=AA=8C=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=9B2=E3=80=81excel=E5=AF=BC=E5=85=A5=E8=B4=B4?= =?UTF-8?q?=E7=9A=AE=E6=A0=A1=E9=AA=8C=E5=90=8C=E6=AD=A5=E5=8D=95=E8=B4=B4?= =?UTF-8?q?=E7=9A=AE=E6=96=B0=E5=A2=9E=E8=A7=84=E5=88=99=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/enums/ErrorCodeConstants.java | 3 + .../admin/veneer/vo/VeneerImportExcelVO.java | 3 +- .../admin/veneer/vo/VeneerSaveReqVO.java | 6 ++ .../service/veneer/VeneerExcelListener.java | 56 +++++++++++++++---- .../src/main/resources/message_cht.properties | 4 ++ .../src/main/resources/message_en.properties | 4 ++ .../message_errorcode_cht.properties | 3 + .../resources/message_errorcode_en.properties | 3 + .../resources/message_errorcode_zh.properties | 3 + .../src/main/resources/message_zh.properties | 4 ++ 10 files changed, 77 insertions(+), 12 deletions(-) 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 3a6a6f39e..b8f87017a 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 @@ -173,6 +173,9 @@ public class ErrorCodeConstants { public static final ErrorCode VENEER_ORG_CLASSIFICATION_NAME_NOT_EXIST = new ErrorCode(1_003_009_011, "veneer.org.classification.name.not.exist"); public static final ErrorCode VENEER_ORG_CLASSIFICATION_NAME_USED = new ErrorCode(1_003_009_012, "veneer.org.classification.name.used"); public static final ErrorCode VENEER_PIC_EXCEED_SIZE = new ErrorCode(1_003_009_013, "veneer.pic.exceed.size"); + public static final ErrorCode VENEER_IMPORT_VENEER_NO_DUPLICATE = new ErrorCode(1_003_009_014, "veneer.import.veneer.no.duplicate"); + public static final ErrorCode VENEER_IMPORT_VENEER_NO_FORMAT_ERROR = new ErrorCode(1_003_009_015, "veneer.import.veneer.no.format.error"); + public static final ErrorCode VENEER_IMPORT_PRODUCT_LEVEL_ERROR = new ErrorCode(1_003_009_016, "veneer.import.product.level.error"); //=========== 部件管理 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/controller/admin/veneer/vo/VeneerImportExcelVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerImportExcelVO.java index f295d959a..90fa88268 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerImportExcelVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerImportExcelVO.java @@ -81,6 +81,7 @@ public class VeneerImportExcelVO { * @return true:校验成功、false:校验失败(有必填项未填写) */ public boolean validRequired() { - return CharSequenceUtil.isAllNotEmpty(veneerNo, classificationName, veneerName, length, width, thickness, num) || ObjectUtil.isNull(productLevel); + return CharSequenceUtil.isAllNotEmpty(veneerNo, classificationName, veneerName, length, width, thickness, num) + && ObjectUtil.isNotNull(productLevel); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerSaveReqVO.java index 7aaeef2ff..f2688f77e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerSaveReqVO.java @@ -5,6 +5,8 @@ import com.cf.imes.framework.common.validation.NumberValid; import com.cf.imes.module.executor.enums.veneer.VeneerProductLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -57,24 +59,28 @@ public class VeneerSaveReqVO { @NotNull(message = "{veneer.save.num.not.null}") @NumberValid(name = "veneer.field.num", integer = 4, fraction = 0) @Min(value = 1, message = "{veneer.save.num.positive}") + @Max(value = 9999, message = "{veneer.save.num.max}") private Integer num; @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "{veneer.save.width.not.null}") @NumberValid(name = "veneer.field.width", integer = 4, fraction = 2) @DecimalMin(value = "0", inclusive = false, message = "{veneer.save.width.positive}") + @DecimalMax(value = "9999.99", message = "{veneer.save.width.max}") private BigDecimal width; @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "{veneer.save.length.not.null}") @NumberValid(name = "veneer.field.width", integer = 4, fraction = 2) @DecimalMin(value = "0", inclusive = false, message = "{veneer.save.length.positive}") + @DecimalMax(value = "9999.99", message = "{veneer.save.length.max}") private BigDecimal length; @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "{veneer.save.thickness.not.null}") @NumberValid(name = "veneer.field.width", integer = 4, fraction = 2) @DecimalMin(value = "0", inclusive = false, message = "{veneer.save.thickness.positive}") + @DecimalMax(value = "9999.99", message = "{veneer.save.thickness.max}") private BigDecimal thickness; @Schema(description = "颜色") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerExcelListener.java index 118113a85..cd413203d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerExcelListener.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerExcelListener.java @@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.metadata.CellExtra; import com.alibaba.excel.read.metadata.holder.ReadRowHolder; import com.alibaba.excel.util.ListUtils; import com.cf.imes.framework.common.exception.ServiceException; @@ -14,6 +13,7 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerClassificati import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerImportExcelVO; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; import com.cf.imes.module.executor.enums.veneer.VeneerStatusEnum; +import com.cf.imes.module.executor.enums.veneer.VeneerProductLevelEnum; import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -21,6 +21,9 @@ import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.HashSet; +import java.util.Arrays; +import java.util.Collections; import java.util.stream.Collectors; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_DIGITAL_TYPE_ERROR; @@ -29,6 +32,9 @@ import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_ORG_CLASSIFICATION_NAME_NOT_EXIST; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_POSITIVE_NUMBER_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_REQUIRED_LACK; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_VENEER_NO_DUPLICATE; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_VENEER_NO_FORMAT_ERROR; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_PRODUCT_LEVEL_ERROR; /** * 贴皮excel导入 解析器 @@ -53,6 +59,8 @@ public class VeneerExcelListener extends AnalysisEventListener headMap; private Set orgClassificationNameSet; + /** 本次文件已出现的编号,避免同一文件内重复新增/更新。 */ + private final Set importedVeneerNoSet = new HashSet<>(); private Long organId; @@ -62,9 +70,9 @@ public class VeneerExcelListener extends AnalysisEventListener orgVeneerClassificationNameList = veneerService.getOrgVeneerClassificationNameList(); - if (CollUtil.isNotEmpty(orgVeneerClassificationNameList)) { - orgClassificationNameSet = orgVeneerClassificationNameList.stream().map(VeneerClassificationNameRespVO::getName).collect(Collectors.toSet()); - } + orgClassificationNameSet = CollUtil.isNotEmpty(orgVeneerClassificationNameList) + ? orgVeneerClassificationNameList.stream().map(VeneerClassificationNameRespVO::getName).collect(Collectors.toSet()) + : Collections.emptySet(); } /** @@ -86,6 +94,20 @@ public class VeneerExcelListener extends AnalysisEventListener]*$")) { + throw new ServiceException(VENEER_IMPORT_VENEER_NO_FORMAT_ERROR, rowIndex, veneerNo); + } + if (!importedVeneerNoSet.add(veneerNo)) { + throw new ServiceException(VENEER_IMPORT_VENEER_NO_DUPLICATE, rowIndex, veneerNo); + } + + // @InEnum 在 Excel 导入场景不会自动触发,需显式校验 + if (!Arrays.stream(VeneerProductLevelEnum.values()) + .anyMatch(item -> item.getCode().equals(data.getProductLevel()))) { + throw new ServiceException(VENEER_IMPORT_PRODUCT_LEVEL_ERROR, rowIndex, data.getProductLevel()); + } + // 校验分类名称组织内是否存在 validClassificationName(data.getClassificationName(), rowIndex); @@ -94,17 +116,17 @@ public class VeneerExcelListener extends AnalysisEventListener headMap, AnalysisContext context) { + if (headMap == null || headMap.size() < 15 + || !headMap.keySet().containsAll(Arrays.asList( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))) { + throw new ServiceException(VENEER_IMPORT_REQUIRED_LACK, 1); + } this.headMap = headMap; } @@ -244,6 +271,13 @@ public class VeneerExcelListener extends AnalysisEventListener +veneer.import.product.level.error=第{0}行產品等級填寫不正確,請按照匯入範本填寫系統支援的產品等級 veneer.import.length.error=第{0}行{1}長度不能超過{2}個字元,請檢查檔案 veneer.import.digital.type.error=第{0}行{1}只能輸入數位,請檢查檔案 veneer.import.positive.number.error=第{0}行{1}必須大於0,請檢查檔案 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties index ed6d502ac..818615efb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties @@ -73,6 +73,9 @@ veneer.not.exist=veneer not exist veneer.no.exist=veneer no already exists veneer.import.required.lack=The required field is empty in line {0}, please check the file +veneer.import.veneer.no.duplicate=The veneer number {1} is duplicated in the import file at line {0}, please correct it and try again +veneer.import.veneer.no.format.error=The veneer number {1} in line {0} has an invalid format and cannot contain these special characters: \\ / : * ? " , | < > +veneer.import.product.level.error=The product level in line {0} is invalid. Please enter a product level supported by the system according to the import template veneer.import.length.error=The length of the field cannot exceed {0} characters in line {1}, please check the file veneer.import.digital.type.error=The field can only be filled in with numbers in line {0}, please check the file veneer.import.positive.number.error=The field must be greater than 0 in line {0}, please check the file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_zh.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_zh.properties index ac8b90c5d..f5ec6ddd2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_zh.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_zh.properties @@ -73,6 +73,9 @@ veneer.not.exist=贴皮不存在 veneer.no.exist=贴皮编号已存在 veneer.import.required.lack=第{0}行存在带*必填项为空,请检查文件 +veneer.import.veneer.no.duplicate=第{0}行贴皮编号{1}在本次导入文件中重复,请修改后重新导入 +veneer.import.veneer.no.format.error=第{0}行贴皮编号{1}格式不正确,不能包含以下特殊字符:\\ / : * ? " , | < > +veneer.import.product.level.error=第{0}行产品等级填写不正确,请按照导入模板填写系统支持的产品等级 veneer.import.length.error=第{0}行{1}长度不能超过{2}个字符,请检查文件 veneer.import.digital.type.error=第{0}行{1}只能输入数字,请检查文件 veneer.import.positive.number.error=第{0}行{1}必须大于0,请检查文件 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_zh.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_zh.properties index c10256a8b..a6e3210fe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_zh.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_zh.properties @@ -21,7 +21,11 @@ veneer.field.length=长度 veneer.field.thickness=厚度 veneer.save.num.not.null=数量不能为空 veneer.save.num.positive=数量必须为正整数 +veneer.save.num.max=数量不能超过 9999 veneer.save.width.positive=宽度必须大于 0 +veneer.save.width.max=宽度不能超过 9999.99 +veneer.save.length.max=长度不能超过 9999.99 +veneer.save.thickness.max=厚度不能超过 9999.99 veneer.save.length.positive=长度必须大于 0 veneer.save.thickness.positive=厚度必须大于 0 veneer.save.productLevel.not.null=产品等级不能为空