mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
1、新增贴皮管理导出明细、下载导入模板、批量导入、保存瑕疵接口;2、整理对应参数校验国际化;
This commit is contained in:
+5
@@ -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");
|
||||
}
|
||||
|
||||
+34
@@ -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;
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* executor 常量
|
||||
*
|
||||
*/
|
||||
package com.cf.imes.module.executor.constants;
|
||||
+46
@@ -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<VeneerRespVO> 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<VeneerRespVO> getVeneer(@PathVariable Long id) {
|
||||
@@ -79,4 +119,10 @@ public class VeneerController {
|
||||
public CommonResult<Long> uploadVeneerPic(@RequestPart(value = "file") MultipartFile file) throws IOException {
|
||||
return success(veneerService.uploadPic(file));
|
||||
}
|
||||
|
||||
@PostMapping("/defect")
|
||||
@Operation(summary = "保存瑕疵数据")
|
||||
public CommonResult<Boolean> saveDefect(@Valid @RequestBody VeneerDefectSaveReqVO reqVO) {
|
||||
return success(veneerService.saveDefect(reqVO) == 1);
|
||||
}
|
||||
}
|
||||
|
||||
+22
@@ -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;
|
||||
}
|
||||
+86
@@ -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);
|
||||
}
|
||||
}
|
||||
+13
-11
@@ -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;
|
||||
}
|
||||
|
||||
+5
@@ -150,4 +150,9 @@ public class VeneerDO extends BaseDO {
|
||||
* 贴皮文件ID
|
||||
*/
|
||||
private Long fileId;
|
||||
|
||||
/**
|
||||
* 瑕疵数据
|
||||
*/
|
||||
private String defectData;
|
||||
}
|
||||
|
||||
+15
@@ -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<VeneerDO> {
|
||||
}
|
||||
+4
@@ -42,6 +42,10 @@ public interface VeneerMapper extends BaseMapperX<VeneerDO> {
|
||||
.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));
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -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();
|
||||
|
||||
|
||||
+252
@@ -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<T> extends AnalysisEventListener<VeneerImportExcelVO> {
|
||||
/**
|
||||
* 每500条操作入库一次
|
||||
*/
|
||||
private static final int BATCH_COUNT = 500;
|
||||
private List<VeneerImportExcelVO> cachedInsertDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
|
||||
private List<VeneerImportExcelVO> cachedUpdateDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
|
||||
|
||||
private VeneerService veneerService;
|
||||
|
||||
// 贴皮编号:id
|
||||
private Map<String, Long> orgVeneerNoMap;
|
||||
|
||||
private Map<Integer, String> 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<Integer, String> headMap, AnalysisContext context) {
|
||||
this.headMap = headMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量新增贴皮
|
||||
*/
|
||||
private void insertData() {
|
||||
log.debug("{}条数据,开始新增贴皮数据!", cachedInsertDataList.size());
|
||||
List<VeneerDO> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
@@ -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<String, Long> getOrgVeneerNo();
|
||||
|
||||
/**
|
||||
* 批量新增贴皮
|
||||
*
|
||||
* @param list
|
||||
*/
|
||||
void batchInsert(List<VeneerDO> list);
|
||||
|
||||
/**
|
||||
* 批量更新贴皮
|
||||
*
|
||||
* @param list
|
||||
*/
|
||||
void batchUpdate(List<VeneerDO> list);
|
||||
|
||||
/**
|
||||
* 保存瑕疵数据
|
||||
*
|
||||
* @param defectSaveReqVO
|
||||
* @return
|
||||
*/
|
||||
int saveDefect(VeneerDefectSaveReqVO defectSaveReqVO);
|
||||
}
|
||||
|
||||
+49
@@ -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<String, Long> getOrgVeneerNo() {
|
||||
return veneerMapper.selectList(new LambdaQueryWrapper<VeneerDO>().select(VeneerDO::getId, VeneerDO::getVeneerNo)).stream().collect(Collectors.toMap(VeneerDO::getVeneerNo, VeneerDO::getId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchInsert(List<VeneerDO> list) {
|
||||
veneerBatchMapper.insertBatchSomeColumn(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchUpdate(List<VeneerDO> 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<VeneerDO>()
|
||||
.eq(VeneerDO::getId, id)
|
||||
.set(VeneerDO::getDefect, true)
|
||||
.set(VeneerDO::getDefectData, JsonUtils.zipString(defectData)));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验贴皮是否存在
|
||||
*
|
||||
|
||||
+43
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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个字符
|
||||
veneer.save.veneerName.length.max=贴皮名称不能超过64个字符
|
||||
veneer.defect.save.id.not.null=贴皮ID不能为空
|
||||
+3
-2
@@ -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个字符
|
||||
veneer.save.veneerName.length.max=貼皮名稱不能超过64个字符
|
||||
veneer.defect.save.id.not.null=貼皮ID不能為空
|
||||
+2
-1
@@ -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
|
||||
veneer.save.veneerName.length.max=veneer name length cannot exceed 64 characters
|
||||
veneer.defect.save.id.not.null=veneer id cannot be empty
|
||||
+4
-1
@@ -17,4 +17,7 @@ veneer.export.head.factory=厂家
|
||||
veneer.export.head.num=数量
|
||||
veneer.export.head.defect=瑕疵
|
||||
veneer.export.head.remark=备注
|
||||
veneer.export.head.status=状态
|
||||
|
||||
veneer.product.level.A=A类
|
||||
veneer.product.level.B=B类
|
||||
veneer.product.level.C=C类
|
||||
+4
-1
@@ -17,4 +17,7 @@ veneer.export.head.factory=廠家
|
||||
veneer.export.head.num=數量
|
||||
veneer.export.head.defect=瑕疵
|
||||
veneer.export.head.remark=備註
|
||||
veneer.export.head.status=狀態
|
||||
|
||||
veneer.product.level.A=A類
|
||||
veneer.product.level.B=B類
|
||||
veneer.product.level.C=C類
|
||||
+4
-1
@@ -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
|
||||
|
||||
veneer.product.level.A=Class A
|
||||
veneer.product.level.B=Class B
|
||||
veneer.product.level.C=Class C
|
||||
+7
-1
@@ -14,4 +14,10 @@ global.org.product.expired=组织产品套餐已过期,请续费后继续使
|
||||
global.not.login=账号未登录
|
||||
|
||||
veneer.not.exist=贴皮不存在
|
||||
veneer.no.exist=贴皮编号已存在
|
||||
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}位,请检查文件
|
||||
+7
-1
@@ -14,4 +14,10 @@ global.org.product.expired=組織產品套餐已過期,請續費後繼續使
|
||||
global.not.login=賬號未登錄
|
||||
|
||||
veneer.not.exist=貼皮不存在
|
||||
veneer.no.exist=貼皮編號已存在
|
||||
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}位,請檢查檔案
|
||||
+7
-1
@@ -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
|
||||
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
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Reference in New Issue
Block a user