diff --git a/cf-framework/cf-spring-boot-starter-excel/src/main/java/com/cf/imes/framework/excel/core/convert/EnumConvert.java b/cf-framework/cf-spring-boot-starter-excel/src/main/java/com/cf/imes/framework/excel/core/convert/EnumConvert.java index 2f10431ef..f60f99a2d 100644 --- a/cf-framework/cf-spring-boot-starter-excel/src/main/java/com/cf/imes/framework/excel/core/convert/EnumConvert.java +++ b/cf-framework/cf-spring-boot-starter-excel/src/main/java/com/cf/imes/framework/excel/core/convert/EnumConvert.java @@ -1,5 +1,6 @@ package com.cf.imes.framework.excel.core.convert; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.converters.WriteConverterContext; @@ -61,7 +62,8 @@ public class EnumConvert implements Converter { if (enumClass != null) { for (Object e : enumClass.getEnumConstants()) { BaseEnum baseEnum = (BaseEnum) e; - if (baseEnum.getDesc().equals(desc)) { + String i18nDesc = ResourceBundleUtils.getMessage(ResourceBundleConstants.MESSAGE_ENUM_PATH, baseEnum.getDesc(), baseEnum.getDesc(), LocaleContextHolder.getLocale(), null); + if (ObjectUtil.equals(desc, i18nDesc)) { return baseEnum.getCode(); } } 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 f12c3df2a..f907b2f77 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 @@ -172,4 +172,9 @@ public class ErrorCodeConstants { //=========== 贴皮管理 1-003-009-000 ============ public static final ErrorCode VENEER_NOT_EXIST = new ErrorCode(1_003_009_000, "veneer.not.exist"); public static final ErrorCode VENEER_NO_EXIST = new ErrorCode(1_003_009_001, "veneer.no.exist"); + public static final ErrorCode VENEER_IMPORT_REQUIRED_LACK = new ErrorCode(1_003_009_002, "veneer.import.required.lack"); + public static final ErrorCode VENEER_IMPORT_LENGTH_ERROR = new ErrorCode(1_003_009_003, "veneer.import.length.error"); + public static final ErrorCode VENEER_IMPORT_DIGITAL_TYPE_ERROR = new ErrorCode(1_003_009_004, "veneer.import.digital.type.error"); + public static final ErrorCode VENEER_IMPORT_POSITIVE_NUMBER_ERROR = new ErrorCode(1_003_009_005, "veneer.import.positive.number.error"); + public static final ErrorCode VENEER_IMPORT_NUMBER_LENGTH_ERROR = new ErrorCode(1_003_009_006, "veneer.import.number.length.error"); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/file/TemplateFilePathConstants.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/file/TemplateFilePathConstants.java new file mode 100644 index 000000000..df4a2c4c1 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/file/TemplateFilePathConstants.java @@ -0,0 +1,34 @@ +package com.cf.imes.module.executor.constants.file; + +import org.springframework.boot.system.ApplicationHome; + +import java.io.File; + +/** + * 模板文件路径 常量类 + * + * @author Gqr + * @since 2026/1/5 14:35 + */ +public final class TemplateFilePathConstants { + private TemplateFilePathConstants() { + } + + public static final String ROOT_PATH; + + static { + ApplicationHome home = new ApplicationHome(TemplateFilePathConstants.class); + File jarDir = home.getDir(); // jar 所在目录 + ROOT_PATH = new File(jarDir, "type").getAbsolutePath(); + } + + /** + * 根据语种获取贴皮导入模板 + * + * @param language 语种 + * @return + */ + public static String getVeneerImportTemplatePath(String language) { + return ROOT_PATH + File.separator + "veneer" + File.separator + language; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/package-info.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/package-info.java new file mode 100644 index 000000000..38bf1e2f5 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/constants/package-info.java @@ -0,0 +1,5 @@ +/** + * executor 常量 + * + */ +package com.cf.imes.module.executor.constants; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerController.java index 760ed2e27..88bdc3fea 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/VeneerController.java @@ -1,16 +1,26 @@ package com.cf.imes.module.executor.controller.admin.veneer; +import com.alibaba.excel.EasyExcelFactory; import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; +import com.cf.imes.module.executor.constants.file.TemplateFilePathConstants; +import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDefectSaveReqVO; +import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerImportExcelVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPageReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerRespVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerSaveReqVO; +import com.cf.imes.module.executor.service.veneer.VeneerExcelListener; import com.cf.imes.module.executor.service.veneer.VeneerService; +import com.cf.imes.module.executor.util.file.FileHelperUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -24,9 +34,12 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.List; import static com.cf.imes.framework.common.pojo.CommonResult.success; import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.CREATE; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.IMPORT; /** * @@ -49,6 +62,33 @@ public class VeneerController { return success(veneerService.getPage(pageReqVO)); } + @GetMapping("/export") + @Operation(summary = "导出贴皮明细") + @OperateLog(type = EXPORT) + public void exportSalesDetailsPage(@Valid VeneerPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = veneerService.getPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "贴皮明细.xls", "数据", VeneerRespVO.class, list); + } + + @GetMapping("/import/template") + @Operation(summary = "下载贴皮导入模版") + @OperateLog(type = EXPORT) + public void importTemplate(HttpServletResponse response) { + String veneerImportTemplatePath = TemplateFilePathConstants.getVeneerImportTemplatePath(LocaleContextHolder.getLocale().getLanguage()); + FileHelperUtil.getFirstFile(veneerImportTemplatePath, response); + } + + @PostMapping("/import") + @Operation(summary = "导入贴皮") + @OperateLog(type = IMPORT) + public void importExcel(@RequestPart("file") MultipartFile file) throws IOException { + VeneerExcelListener listener = new VeneerExcelListener(veneerService); + EasyExcelFactory.read(file.getInputStream(), VeneerImportExcelVO.class, listener).headRowNumber(1).sheet().doRead(); + } + @GetMapping("/{id}") @Operation(summary = "根据id获取贴皮") public CommonResult getVeneer(@PathVariable Long id) { @@ -79,4 +119,10 @@ public class VeneerController { public CommonResult uploadVeneerPic(@RequestPart(value = "file") MultipartFile file) throws IOException { return success(veneerService.uploadPic(file)); } + + @PostMapping("/defect") + @Operation(summary = "保存瑕疵数据") + public CommonResult saveDefect(@Valid @RequestBody VeneerDefectSaveReqVO reqVO) { + return success(veneerService.saveDefect(reqVO) == 1); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerDefectSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerDefectSaveReqVO.java new file mode 100644 index 000000000..e8a30b337 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerDefectSaveReqVO.java @@ -0,0 +1,22 @@ +package com.cf.imes.module.executor.controller.admin.veneer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * + * + * @author Gqr + * @since 2026/1/6 15:57 + */ +@Schema(description = "生产管理 - 贴皮管理 保存瑕疵 Request VO") +@Data +public class VeneerDefectSaveReqVO { + @Schema( description = "贴皮id") + @NotNull(message = "{veneer.defect.save.id.not.null}") + private Long id; + + @Schema(description = "瑕疵数据") + private String defectData; +} 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 new file mode 100644 index 000000000..f295d959a --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerImportExcelVO.java @@ -0,0 +1,86 @@ +package com.cf.imes.module.executor.controller.admin.veneer.vo; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.cf.imes.framework.excel.core.annotations.EnumFormat; +import com.cf.imes.framework.excel.core.convert.EnumConvert; +import com.cf.imes.module.executor.enums.veneer.VeneerProductLevelEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 贴皮 Excel导入 VO + * + * @author Gqr + * @since 2026/1/5 15:28 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class VeneerImportExcelVO { + + private Long id; + + private Long organId; + + @ExcelProperty(index = 0) + private String veneerNo; + + @ExcelProperty(index = 1) + private String batchNo; + + @ExcelProperty(index = 2) + private String classificationName; + + @ExcelProperty(index = 3) + private String veneerName; + + @ExcelProperty(index = 4, converter = EnumConvert.class) + @EnumFormat(value = VeneerProductLevelEnum.class) + private Integer productLevel; + + @ExcelProperty(index = 5) + private String color; + + @ExcelProperty(index = 6) + private String material; + + @ExcelProperty(index = 7) + private String length; + + @ExcelProperty(index = 8) + private String width; + + @ExcelProperty(index = 9) + private String thickness; + + @ExcelProperty(index = 10) + private String brand; + + @ExcelProperty(index = 11) + private String spec; + + @ExcelProperty(index = 12) + private String factory; + + @ExcelProperty(index = 13) + private String num; + + @ExcelProperty(index = 14) + private String remark; + + /** + * 校验必填 + * + * @return true:校验成功、false:校验失败(有必填项未填写) + */ + public boolean validRequired() { + return CharSequenceUtil.isAllNotEmpty(veneerNo, classificationName, veneerName, length, width, thickness, num) || ObjectUtil.isNull(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/VeneerRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerRespVO.java index 08784851a..f4cd4f27c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/veneer/vo/VeneerRespVO.java @@ -7,7 +7,7 @@ import com.cf.imes.framework.excel.core.convert.EnumBoolValConvert; import com.cf.imes.framework.excel.core.convert.EnumConvert; import com.cf.imes.framework.excel.core.enums.WhetherEnum; import com.cf.imes.module.executor.enums.veneer.VeneerProductLevelEnum; -import com.cf.imes.module.executor.enums.veneer.VeneerStatusEnum; +import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -22,6 +22,7 @@ import java.math.BigDecimal; @Schema(description = "生产管理 - 贴皮管理分页 Response VO") @Data @ExcelIgnoreUnannotated +@JsonInclude(JsonInclude.Include.NON_NULL) public class VeneerRespVO { @Schema(description = "贴皮id") private Long id; @@ -30,6 +31,10 @@ public class VeneerRespVO { @ExcelProperty("veneer.export.head.veneerNo") private String veneerNo; + @Schema(description = "批次号") + @ExcelProperty("veneer.export.head.batchNo") + private String batchNo; + @Schema(description = "分类名称") @ExcelProperty("veneer.export.head.classificationName") private String classificationName; @@ -43,10 +48,6 @@ public class VeneerRespVO { @EnumFormat(value = VeneerProductLevelEnum.class) private Integer productLevel; - @Schema(description = "批次号") - @ExcelProperty("veneer.export.head.batchNo") - private String batchNo; - @Schema(description = "颜色") @ExcelProperty("veneer.export.head.color") private String color; @@ -55,14 +56,14 @@ public class VeneerRespVO { @ExcelProperty("veneer.export.head.material") private String material; - @Schema(description = "宽") - @ExcelProperty("veneer.export.head.width") - private BigDecimal width; - @Schema(description = "长") @ExcelProperty("veneer.export.head.length") private BigDecimal length; + @Schema(description = "宽") + @ExcelProperty("veneer.export.head.width") + private BigDecimal width; + @Schema(description = "厚") @ExcelProperty("veneer.export.head.thickness") private BigDecimal thickness; @@ -93,7 +94,8 @@ public class VeneerRespVO { private String remark; @Schema(description = "状态,0:未使用、1:已使用") - @ExcelProperty(value = "veneer.export.head.status", converter = EnumConvert.class) - @EnumFormat(value = VeneerStatusEnum.class) private Integer status; + + @Schema(description = "瑕疵数据") + private String defectData; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/VeneerDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/VeneerDO.java index 40420fd43..f72454a94 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/VeneerDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/veneer/VeneerDO.java @@ -150,4 +150,9 @@ public class VeneerDO extends BaseDO { * 贴皮文件ID */ private Long fileId; + + /** + * 瑕疵数据 + */ + private String defectData; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerBatchMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerBatchMapper.java new file mode 100644 index 000000000..2c0ed8875 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerBatchMapper.java @@ -0,0 +1,15 @@ +package com.cf.imes.module.executor.dal.mysql.veneer; + +import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper; +import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 贴皮 批量Mapper + * + * @author Gqr + * @since 2026/1/6 14:38 + */ +@Mapper +public interface VeneerBatchMapper extends BaseBatchMapper { +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerMapper.java index c9693b0d2..42bc51dfe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/veneer/VeneerMapper.java @@ -42,6 +42,10 @@ public interface VeneerMapper extends BaseMapperX { .eqIfPresent(VeneerDO::getSourcePlanNo, reqVO.getSourcePlanNo()) .eqIfPresent(VeneerDO::getPlanNo, reqVO.getPlanNo()) .eqIfPresent(VeneerDO::getStatus, reqVO.getStatus()) + // 查询字段 + .select(VeneerDO::getId, VeneerDO::getVeneerNo, VeneerDO::getBatchNo, VeneerDO::getClassificationName, VeneerDO::getVeneerName, + VeneerDO::getProductLevel, VeneerDO::getColor, VeneerDO::getMaterial, VeneerDO::getLength, VeneerDO::getWidth, VeneerDO::getThickness, + VeneerDO::getBrand, VeneerDO::getSpec, VeneerDO::getFactory, VeneerDO::getNum, VeneerDO::getDefect, VeneerDO::getRemark) .orderByDesc(VeneerDO::getId)); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/veneer/VeneerProductLevelEnum.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/veneer/VeneerProductLevelEnum.java index d0ca51be9..1c9a41036 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/veneer/VeneerProductLevelEnum.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/enums/veneer/VeneerProductLevelEnum.java @@ -16,9 +16,9 @@ import java.util.Arrays; @RequiredArgsConstructor @Getter public enum VeneerProductLevelEnum implements IntArrayValuable, BaseEnum { - A(0,"A类"), - B(1,"B类"), - C(2,"C类"); + A(0,"veneer.product.level.A"), + B(1,"veneer.product.level.B"), + C(2,"veneer.product.level.C"); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(VeneerProductLevelEnum::getCode).toArray(); 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 new file mode 100644 index 000000000..44ba487f7 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerExcelListener.java @@ -0,0 +1,252 @@ +package com.cf.imes.module.executor.service.veneer; + +import cn.hutool.core.bean.BeanUtil; +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; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +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.util.fileConversion.admin.ToolUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_DIGITAL_TYPE_ERROR; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_LENGTH_ERROR; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_IMPORT_NUMBER_LENGTH_ERROR; +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; + +/** + * 贴皮excel导入 解析器 + * + * @author Gqr + * @since 2026/1/5 18:18 + */ +@Slf4j +public class VeneerExcelListener extends AnalysisEventListener { + /** + * 每500条操作入库一次 + */ + private static final int BATCH_COUNT = 500; + private List cachedInsertDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + private List cachedUpdateDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + private VeneerService veneerService; + + // 贴皮编号:id + private Map orgVeneerNoMap; + + private Map headMap; + + private Long organId; + + public VeneerExcelListener(VeneerService veneerService) { + this.veneerService = veneerService; + // 查询机构下所有的贴皮编号 + orgVeneerNoMap = veneerService.getOrgVeneerNo(); + organId = SecurityFrameworkUtils.getUserOrganId(); + } + + /** + * 每解析一行都会回调invoke()方法 + * + * @param data 读取后的数据对象 + * @param context 内容 + */ + @Override + public void invoke(VeneerImportExcelVO data, AnalysisContext context) { + // 获取行号,标题算一行+1 + ReadRowHolder readRowHolder = context.readRowHolder(); + int rowIndex = readRowHolder.getRowIndex() + 1; + + // 必填属性校验 + if (!data.validRequired()) { + throw new ServiceException(VENEER_IMPORT_REQUIRED_LACK, rowIndex); + } + + // 校验贴皮是新增还是更新 + String veneerNo = data.getVeneerNo(); + Long existId = orgVeneerNoMap.get(veneerNo); + if (ObjectUtil.isNotNull(existId)) { + data.setId(existId); + // 累计更新列表 + cachedUpdateDataList.add(data); + + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (cachedUpdateDataList.size() >= BATCH_COUNT) { + updateData(); + // 存储完成清理 list + cachedUpdateDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } + return; + } + + // 校验属性长度 + validFieldLength(headMap.get(0), veneerNo, 32, rowIndex); + validFieldLength(headMap.get(1), data.getBatchNo(), 32, rowIndex); + validFieldLength(headMap.get(3), data.getVeneerName(), 64, rowIndex); + validFieldLength(headMap.get(5), data.getColor(), 32, rowIndex); + validFieldLength(headMap.get(6), data.getMaterial(), 64, rowIndex); + validFieldLength(headMap.get(10), data.getBrand(), 64, rowIndex); + validFieldLength(headMap.get(11), data.getSpec(), 64, rowIndex); + validFieldLength(headMap.get(12), data.getFactory(), 128, rowIndex); + validFieldLength(headMap.get(14), data.getRemark(), 255, rowIndex); + + // 校验类型 + validPositiveFloatNumberSize(headMap.get(7), data.getLength(), Double.class, 5, 3, rowIndex); + validPositiveFloatNumberSize(headMap.get(8), data.getWidth(), Double.class, 5, 3, rowIndex); + validPositiveFloatNumberSize(headMap.get(9), data.getThickness(), Double.class, 5, 3, rowIndex); + validPositiveNumber(headMap.get(13), data.getNum(), rowIndex); + + // 累计新增列表 + cachedInsertDataList.add(data); + + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (cachedInsertDataList.size() >= BATCH_COUNT) { + insertData(); + // 存储完成清理 list + cachedInsertDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } + } + + @Override + public void extra(CellExtra extra, AnalysisContext context) { + super.extra(extra, context); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + insertData(); + updateData(); + log.debug("所有数据解析完成!"); + } + + @Override + public boolean hasNext(AnalysisContext context) { + return super.hasNext(context); + } + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + this.headMap = headMap; + } + + /** + * 批量新增贴皮 + */ + private void insertData() { + log.debug("{}条数据,开始新增贴皮数据!", cachedInsertDataList.size()); + List veneerDOS = BeanUtil.copyToList(cachedInsertDataList, VeneerDO.class); + for (VeneerDO veneerDO : veneerDOS) { + veneerDO.setOrganId(organId); + veneerDO.setDefect(false); + veneerDO.setRemain(false); + veneerDO.setStatus(VeneerStatusEnum.NOT_USE.getCode()); + veneerDO.setDeleted(false); + } + if (CollUtil.isNotEmpty(cachedInsertDataList)) { + veneerService.batchInsert(veneerDOS); + } + log.debug("excel导入贴皮数据保存成功!"); + } + + /** + * 批量更新贴皮 + */ + private void updateData() { + log.debug("{}条数据,开始更新贴皮数据!", cachedUpdateDataList.size()); + if (CollUtil.isNotEmpty(cachedUpdateDataList)) { + veneerService.batchUpdate(BeanUtil.copyToList(cachedUpdateDataList, VeneerDO.class)); + } + log.debug("excel导入贴皮数据保存成功!"); + } + + /** + * 校验长度 + * + * @param key + * @param val + * @param length + */ + private void validFieldLength(String key, String val, int length, int rowIndex) { + if (StringUtils.isNotEmpty(val) && length < val.length()) { + throw new ServiceException(VENEER_IMPORT_LENGTH_ERROR, rowIndex, key, length); + } + } + + + /** + * 检查值大于0、数据浮点类型和长度 + * + * @param key + * @param value + * @param targetType + * @param length + * @param decimalLength + * @param rowIndex + */ + private void validPositiveFloatNumberSize(String key, String value, Class targetType, Integer length, Integer decimalLength, int rowIndex) { + if (StringUtils.isNotEmpty(value)) { + if (Boolean.TRUE.equals(ToolUtil.convertToType(value, targetType))) { + if (Boolean.TRUE.equals(checkPositiveNumber(value))) { + if (!ToolUtil.checkPrecision(value, length, decimalLength)) { + throw new ServiceException(VENEER_IMPORT_NUMBER_LENGTH_ERROR, rowIndex, key, length, decimalLength); + } + } else { + throw new ServiceException(VENEER_IMPORT_POSITIVE_NUMBER_ERROR, rowIndex, key); + } + } else { + throw new ServiceException(VENEER_IMPORT_DIGITAL_TYPE_ERROR, rowIndex, key); + } + } + } + + /** + * 检查值大于0、integer类型 + * @param key + * @param value + * @param rowIndex + */ + private void validPositiveNumber(String key, String value, int rowIndex) { + if (StringUtils.isNotEmpty(value)) { + if (Boolean.TRUE.equals(ToolUtil.convertToType(value, Integer.class))) { + if (Boolean.FALSE.equals(checkPositiveNumber(value))) { + throw new ServiceException(VENEER_IMPORT_POSITIVE_NUMBER_ERROR, rowIndex, key); + } + } else { + throw new ServiceException(VENEER_IMPORT_DIGITAL_TYPE_ERROR, rowIndex, key); + } + } + } + + /** + * 检查是否正数(不包含0) + * + * @param numberStr + * @return + */ + public static Boolean checkPositiveNumber(String numberStr) { + try { + double number = Double.parseDouble(numberStr); + // 进行正负判断 + if (number > 0) { + return true; + } else { + return false; + } + } catch (NumberFormatException e) { + return false; + } + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerService.java index 9cfdb8b0e..940ed2538 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerService.java @@ -1,12 +1,16 @@ package com.cf.imes.module.executor.service.veneer; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDefectSaveReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPageReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerRespVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.List; +import java.util.Map; /** * 贴皮管理 Service接口 @@ -63,4 +67,33 @@ public interface VeneerService { * @return */ VeneerRespVO get(Long id); + + /** + * 获取组织下所有贴皮编号:id的组合 + * + * @return + */ + Map getOrgVeneerNo(); + + /** + * 批量新增贴皮 + * + * @param list + */ + void batchInsert(List list); + + /** + * 批量更新贴皮 + * + * @param list + */ + void batchUpdate(List list); + + /** + * 保存瑕疵数据 + * + * @param defectSaveReqVO + * @return + */ + int saveDefect(VeneerDefectSaveReqVO defectSaveReqVO); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerServiceImpl.java index be315e794..0df360975 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerServiceImpl.java @@ -3,15 +3,20 @@ package com.cf.imes.module.executor.service.veneer; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerDefectSaveReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPageReqVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerRespVO; import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerSaveReqVO; import com.cf.imes.module.executor.dal.dataobject.veneer.VeneerDO; +import com.cf.imes.module.executor.dal.mysql.veneer.VeneerBatchMapper; import com.cf.imes.module.executor.dal.mysql.veneer.VeneerMapper; import com.cf.imes.module.infra.api.file.FileApi; import com.cf.imes.module.system.api.organ.OrganApi; @@ -23,7 +28,10 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.time.LocalDateTime; +import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; import static cn.hutool.core.date.DatePattern.PURE_DATETIME_PATTERN; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.VENEER_NOT_EXIST; @@ -46,6 +54,9 @@ public class VeneerServiceImpl implements VeneerService { @Resource private VeneerMapper veneerMapper; + @Resource + private VeneerBatchMapper veneerBatchMapper; + @Override public Long create(VeneerSaveReqVO reqVO) { // 1、校验贴皮编号 @@ -127,9 +138,47 @@ public class VeneerServiceImpl implements VeneerService { if (ObjectUtil.isNull(veneerDO)) { throw new ServiceException(VENEER_NOT_EXIST); } + String defectData = veneerDO.getDefectData(); + if (StringUtils.isNotEmpty(defectData)) { + veneerDO.setDefectData(JsonUtils.unzipString(defectData)); + } return BeanUtil.copyProperties(veneerDO, VeneerRespVO.class); } + @Override + public Map getOrgVeneerNo() { + return veneerMapper.selectList(new LambdaQueryWrapper().select(VeneerDO::getId, VeneerDO::getVeneerNo)).stream().collect(Collectors.toMap(VeneerDO::getVeneerNo, VeneerDO::getId)); + } + + @Override + public void batchInsert(List list) { + veneerBatchMapper.insertBatchSomeColumn(list); + } + + @Override + public void batchUpdate(List list) { + veneerBatchMapper.updateBatch(list); + } + + @Override + public int saveDefect(VeneerDefectSaveReqVO defectSaveReqVO) { + Long id = defectSaveReqVO.getId(); + // 校验贴皮是否存在 + if (ObjectUtil.isNull(validateExist(id))) { + throw new ServiceException(VENEER_NOT_EXIST); + } + + String defectData = defectSaveReqVO.getDefectData(); + if(StringUtils.isNotEmpty(defectData)) { + // 更新瑕疵数据和状态 + return veneerMapper.update(new LambdaUpdateWrapper() + .eq(VeneerDO::getId, id) + .set(VeneerDO::getDefect, true) + .set(VeneerDO::getDefectData, JsonUtils.zipString(defectData))); + } + return 1; + } + /** * 校验贴皮是否存在 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java index 6f60b1ccd..7068da420 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java @@ -1,5 +1,6 @@ package com.cf.imes.module.executor.util.file; +import cn.hutool.core.util.CharsetUtil; import com.cf.imes.framework.common.exception.ServiceException; import org.springframework.web.multipart.MultipartFile; @@ -34,8 +35,8 @@ public class FileHelperUtil { fis.close(); response.reset(); - response.setCharacterEncoding("UTF-8"); - response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, CharsetUtil.UTF_8)); response.addHeader("Content-Length", "" + file.length()); response.setContentType("application/octet-stream"); @@ -64,4 +65,44 @@ public class FileHelperUtil { return true; } + + /** + * 下载目录下第一个文件 + * + * @param dirPath + * @param response + */ + public static void getFirstFile(String dirPath, HttpServletResponse response) { + File dir = new File(dirPath); + if (!dir.exists() || !dir.isDirectory()) { + throw new ServiceException(FILE_NOT_EXISTS); + } + + File[] files = dir.listFiles(File::isFile); + if (files == null || files.length == 0) { + throw new ServiceException(FILE_NOT_EXISTS); + } + + File file = files[0]; + // 获取文件名 + String filename = file.getName(); + // 将文件写入输入流 + try (FileInputStream fis = new FileInputStream(file); + OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) { + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + + response.reset(); + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, CharsetUtil.UTF_8)); + response.addHeader("Content-Length", "" + file.length()); + + response.setContentType("application/octet-stream"); + outputStream.write(buffer); + outputStream.flush(); + } catch (IOException ex) { + throw new ServiceException(FILE_NOT_EXISTS); + } + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message.properties index e604e7ddc..d60296ba9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message.properties @@ -14,4 +14,5 @@ veneer.save.veneerNo.length.max=贴皮编号不能超过32个字符 veneer.save.veneerNo.not.null=贴皮编号不能为空 veneer.save.width.not.null=宽度不能为空 veneer.save.veneerName.not.null=贴皮名称不能为空 -veneer.save.veneerName.length.max=贴皮名称不能超过64个字符 \ No newline at end of file +veneer.save.veneerName.length.max=贴皮名称不能超过64个字符 +veneer.defect.save.id.not.null=贴皮ID不能为空 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_cht.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_cht.properties index 0fecfcb8a..d86a20658 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_cht.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_cht.properties @@ -6,7 +6,7 @@ veneer.save.factory.length.max=廠家不能超過128個字元 veneer.save.length.not.null=長度不能為空 veneer.save.material.length.max=材質不能超過64個字元 veneer.save.num.not.null=數量不能為空 -veneer.save.productLevel.not.null=产品等级不能為空 +veneer.save.productLevel.not.null=產品等級不能為空 veneer.save.remark.length.max=備註不能超過255個字元 veneer.save.spec.length.max=規格不能超過64個字元 veneer.save.thickness.not.null=厚度不能為空 @@ -14,4 +14,5 @@ veneer.save.veneerNo.length.max=貼皮編號不能超過32個字元 veneer.save.veneerNo.not.null=貼皮編號不能為空 veneer.save.width.not.null=寬度不能為空 veneer.save.veneerName.not.null=貼皮名稱不能為空 -veneer.save.veneerName.length.max=貼皮名稱不能超过64个字符 \ No newline at end of file +veneer.save.veneerName.length.max=貼皮名稱不能超过64个字符 +veneer.defect.save.id.not.null=貼皮ID不能為空 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_en.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_en.properties index fb8474ef8..36aa2f147 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_en.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_en.properties @@ -14,4 +14,5 @@ veneer.save.veneerNo.length.max=veener no length cannot exceed 32 characters veneer.save.veneerNo.not.null=veener no cannot be empty veneer.save.width.not.null=width cannot be empty veneer.save.veneerName.not.null=veneer name cannot be empty -veneer.save.veneerName.length.max=veneer name length cannot exceed 64 characters \ No newline at end of file +veneer.save.veneerName.length.max=veneer name length cannot exceed 64 characters +veneer.defect.save.id.not.null=veneer id cannot be empty \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum.properties index b63f0a272..8e7a186f1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum.properties @@ -17,4 +17,7 @@ veneer.export.head.factory=厂家 veneer.export.head.num=数量 veneer.export.head.defect=瑕疵 veneer.export.head.remark=备注 -veneer.export.head.status=状态 \ No newline at end of file + +veneer.product.level.A=A类 +veneer.product.level.B=B类 +veneer.product.level.C=C类 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_cht.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_cht.properties index 65aa883ad..c75984451 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_cht.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_cht.properties @@ -17,4 +17,7 @@ veneer.export.head.factory=廠家 veneer.export.head.num=數量 veneer.export.head.defect=瑕疵 veneer.export.head.remark=備註 -veneer.export.head.status=狀態 \ No newline at end of file + +veneer.product.level.A=A類 +veneer.product.level.B=B類 +veneer.product.level.C=C類 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_en.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_en.properties index f5b8e70ea..075deb5f5 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_en.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_enum_en.properties @@ -17,4 +17,7 @@ veneer.export.head.factory=factory veneer.export.head.num=num veneer.export.head.defect=defect veneer.export.head.remark=remark -veneer.export.head.status=status \ No newline at end of file + +veneer.product.level.A=Class A +veneer.product.level.B=Class B +veneer.product.level.C=Class C \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties index c15bd3676..12de73fc6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties @@ -14,4 +14,10 @@ global.org.product.expired=组织产品套餐已过期,请续费后继续使 global.not.login=账号未登录 veneer.not.exist=贴皮不存在 -veneer.no.exist=贴皮编号已存在 \ No newline at end of file +veneer.no.exist=贴皮编号已存在 + +veneer.import.required.lack=第{0}行存在带*必填项为空,请检查文件 +veneer.import.length.error=第{0}行{1}长度不能超过{2}个字符,请检查文件 +veneer.import.digital.type.error=第{0}行{1}只能输入数字,请检查文件 +veneer.import.positive.number.error=第{0}行{1}必须大于0,请检查文件 +veneer.import.number.length.error=第{0}行{1}长度不能超过整数{2}位、小数{3}位,请检查文件 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties index 9fc0d1ff8..0ae72d7a4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties @@ -14,4 +14,10 @@ global.org.product.expired=組織產品套餐已過期,請續費後繼續使 global.not.login=賬號未登錄 veneer.not.exist=貼皮不存在 -veneer.no.exist=貼皮編號已存在 \ No newline at end of file +veneer.no.exist=貼皮編號已存在 + +veneer.import.required.lack=第{0}行存在帶*必填項為空,請檢查檔案 +veneer.import.length.error=第{0}行{1}長度不能超過{2}個字元,請檢查檔案 +veneer.import.digital.type.error=第{0}行{1}只能輸入數位,請檢查檔案 +veneer.import.positive.number.error=第{0}行{1}必須大於0,請檢查檔案 +veneer.import.number.length.error=第{0}行{1}長度不能超過整數{2}位、小數{3}位,請檢查檔案 \ No newline at end of file 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 da4d6559f..0cd8c16da 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 @@ -14,4 +14,10 @@ global.org.product.expired=The organization's product package has expired, pleas global.not.login=The account is not logged in veneer.not.exist=veneer not exist -veneer.no.exist=veneer no already exists \ No newline at end of file +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.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 +veneer.import.number.length.error=The length of the field cannot exceed integer {0} digits and decimal {1} digits in line {2}, please check the file \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/cht/貼皮導入範本.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/cht/貼皮導入範本.xlsx new file mode 100644 index 000000000..a4fe4a0b6 Binary files /dev/null and b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/cht/貼皮導入範本.xlsx differ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/zh/贴皮导入模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/zh/贴皮导入模板.xlsx new file mode 100644 index 000000000..587bc5755 Binary files /dev/null and b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/veneer/zh/贴皮导入模板.xlsx differ