1、新增贴皮管理导出明细、下载导入模板、批量导入、保存瑕疵接口;2、整理对应参数校验国际化;

This commit is contained in:
gaoqr
2026-01-06 16:59:42 +08:00
parent 6ffb810e29
commit 924abaab6b
27 changed files with 658 additions and 27 deletions
@@ -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");
}
@@ -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;
}
}
@@ -0,0 +1,5 @@
/**
* executor 常量
*
*/
package com.cf.imes.module.executor.constants;
@@ -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);
}
}
@@ -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;
}
@@ -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);
}
}
@@ -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;
}
@@ -150,4 +150,9 @@ public class VeneerDO extends BaseDO {
* 贴皮文件ID
*/
private Long fileId;
/**
* 瑕疵数据
*/
private String defectData;
}
@@ -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> {
}
@@ -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));
}
}
@@ -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();
@@ -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;
}
}
}
@@ -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);
}
@@ -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;
}
/**
* 校验贴皮是否存在
*
@@ -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);
}
}
}
@@ -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不能为空
@@ -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不能為空
@@ -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
@@ -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类
@@ -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類
@@ -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
@@ -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}位,请检查文件
@@ -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}位,請檢查檔案
@@ -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