diff --git a/cf-dependencies/pom.xml b/cf-dependencies/pom.xml
index 0c0122051..05d4205d2 100644
--- a/cf-dependencies/pom.xml
+++ b/cf-dependencies/pom.xml
@@ -89,6 +89,9 @@
2.5.1
+ 2.1.0
+ 1.0-2
+ 4.1.2
@@ -511,6 +514,17 @@
${easyexcel.verion}
+
+ org.apache.poi
+ poi
+ ${excel-poi.version}
+
+
+ org.apache.poi
+ poi-ooxml
+ ${excel-poi.version}
+
+
commons-io
commons-io
@@ -647,6 +661,26 @@
${pingyinfj.version}
+
+
+
+
+ com.monitorjbl
+ xlsx-streamer
+ ${xlsx-streamer.version}
+
+
+
+
+
+
+ javax.xml.stream
+ stax-api
+ ${stax-api.version}
+
+
+
+
com.aliyun
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml
index d460c91dc..8b37e6290 100644
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml
@@ -152,6 +152,31 @@
podam
+
+
+
+ com.monitorjbl
+ xlsx-streamer
+
+
+
+ org.apache.poi
+ poi
+
+
+ org.apache.poi
+ poi-ooxml
+
+
+
+ javax.xml.stream
+ stax-api
+
+
+
+
+
+
com.alibaba
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java
index 2314f0e13..033b2c160 100644
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java
@@ -24,10 +24,9 @@ import com.cf.imes.module.executor.service.order.OrderService;
import com.cf.imes.module.executor.util.ExcelWriterUtil;
import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataAchieve;
import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiTypeRealize;
-import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.ExcelReadUtil;
-import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.ExcelTypeRealize;
-import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO;
+import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.*;
import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO;
+import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.XmlCheckVO;
import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XMLUtil;
import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XmlBuilder;
import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XmlTypeRealize;
@@ -72,7 +71,10 @@ public class OrderController {
private OrderMapper orderMapper;
@Resource
- private ExcelReadUtil excelReadUtil;
+ private LargeFilesUtils largeFilesUtils;
+
+ @Resource
+ private ExcelCheckListUtil excelCheckListUtil;
@Resource
private ApiDataAchieve apiDataAchieve;
@@ -256,10 +258,10 @@ public class OrderController {
Map listMap = null;
OrderDO orderDO = null;
- Map mapOrder = null;
+ Map mapOrder = null;
Boolean flag = true;
- String customOrderNoKey = "自定义单号";
+
boolean isLocked = redisLockUtil.lock(lockKey);
if (!isLocked) {
log.error(errKey, errValue);
@@ -267,45 +269,39 @@ public class OrderController {
} else {
try {
if (type == 0) { //excel
- excelReadUtil.setErr(0);
- Map map = excelReadUtil.read(file);
- list = (List) map.get("plate");
- mapOrder = (Map) map.get("orderPri");
+
+ List[] listBoth = largeFilesUtils.importExcelLargeFile(file);// 表头+列表
+ list = listBoth[1];// 列表
+ mapOrder = largeFilesUtils.changeToOrderMap(listBoth[0]); // 表头
if (index == 0) { // 全部
- if (mapOrder != null) {
- Map mapChange = excelReadUtil.changeOrderDO(mapOrder);
- mapOrder = (Map) mapChange.get("file");
- orderDO = (OrderDO) mapChange.get("order");
- orderDO.setId((Long) snowFlakeGenerator.nextId(null));
- AtomicBoolean error = (AtomicBoolean) mapChange.get("error");
- flag = error.get();
- }
- } else {
+ ExcelCheckVO excelCheckVO = excelCheckListUtil.checkExcelList(mapOrder); // 表头验证
+ orderDO = excelCheckVO.getOrderDO();
+ orderDO.setId((Long) snowFlakeGenerator.nextId(null));
+ flag = excelCheckVO.getFlag();
+ } else { // 补板
orderDO = orderService.getOrder(orderId);
if (orderDO == null) {
mapOrder = new HashMap<>();
- mapOrder.put("自定义单号", "生产单号不存在");
+ mapOrder.put(ProduceExcelConstants.ORDER_CUSTOM_ORDER_NO, "---< 生产单号不存在 >---");
flag = false;
}
}
- if (mapOrder == null) {
- mapOrder = new HashMap<>();
- mapOrder.put(customOrderNoKey, "生产单内容解析为空");
+ String customOrderNo = mapOrder.get(ProduceExcelConstants.ORDER_CUSTOM_ORDER_NO);
+ if (index == 0 && customOrderNo != null && !orderService.customOrderNoIsExists(customOrderNo)) {
+ mapOrder.put(ProduceExcelConstants.ORDER_CUSTOM_ORDER_NO, customOrderNo + "重复");
flag = false;
- }else if (orderDO == null) {
- mapOrder.put(customOrderNoKey, "生产单内为空");
- flag = false;
- } else if (index == 0 && orderDO.getCustomOrderNo() != null && !orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) {
- mapOrder.put(customOrderNoKey, mapOrder.get(customOrderNoKey) + customOrderNoKey + "重复");
- flag = false;
- } else if ( excelReadUtil.isErr() > 0 ){
- flag = false;
- } else if ( excelReadUtil.isErr() == 0 && flag ){
- if (list.size() == 0) {
+ }
+
+ if (flag){
+ // list 校验
+ ExcelCheckVO excelCheckVO = excelCheckListUtil.checkExcelLargeFile(listBoth[1]);
+ list = excelCheckVO.getList();
+ flag = excelCheckVO.getFlag() & flag;
+ if (excelCheckVO.getFlag() && excelCheckVO.getList().size() == 0) {
orderDO.setStatus(OrderStatusEnum.EMPTY.getStatus());
- } else {
+ } else if (excelCheckVO.getFlag()){
orderDO.setStatus(OrderStatusEnum.NEW_ORDER.getStatus());
listMap = excelTypeRealize.changeDate(list, orderDO.getId());
}
@@ -321,10 +317,10 @@ public class OrderController {
if (index == 0){
if (orderXmlVO != null) {
- mapOrder = xmlUtil.changeDate(orderXmlVO, getUserOrganId()); // 生产单数据格式验证
- orderDO = (OrderDO) mapOrder.get("order");
+ XmlCheckVO xmlCheckVO = xmlUtil.changeDate(orderXmlVO, getUserOrganId()); // 生产单数据格式验证
+ orderDO = xmlCheckVO.getOrderDO();
orderDO.setId((Long) snowFlakeGenerator.nextId(null));
- flag = (Boolean) mapOrder.get("error");
+ flag = xmlCheckVO.getFlag();
}
} else {
orderDO = orderService.getOrder(orderId);
@@ -377,13 +373,16 @@ public class OrderController {
String xmlStr = XmlBuilder.objectToXmlStr(orderXmlVO);
XMLUtil.writeErr(response, xmlStr, " order_add_xml_err.xml");
}
- } finally {
+
// 进行判断,为空,写入时出现了错误,数据库数据回滚,此时删除 ES 里的数据
OrderDO order = orderMapper.selectById(orderDO.getId());
if (order == null) {
orderInputProcessor.deleteByOrderId(orderDO.getId(), ORDER_PLATE_MODEL);
orderInputProcessor.deleteByOrderId(orderDO.getId(), ORDER_PLATE_MODEL_COMPRESS);
}
+
+ } finally {
+
redisLockUtil.unlock(lockKey);
}
}
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java
index 692bc9589..425db1464 100644
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java
@@ -520,9 +520,7 @@ public class OrderServiceImpl implements OrderService {
if (plateDetail != null && !plateDetail.isEmpty()){
List orderModelDOs = BeanUtils.toBean(plateDetail, OrderModelDO.class);
orderInputProcessor.batchSaveModel(orderModelDOs);
-// if (!orderModelDOs.isEmpty()) {
-// orderModelDOs.forEach(orderModelDO -> orderModelDO.setOrderId(orderDO.getId()));
-// System.out.println("----" + orderModelDOs);
+
// 将生产单板材的造型信息进行压缩并保存
OrderModelCompressDO orderModelCompressDO = new OrderModelCompressDO();
orderModelCompressDO.setOrderId(orderDO.getId());
@@ -763,7 +761,7 @@ public class OrderServiceImpl implements OrderService {
List partsDOS = new ArrayList<>();
for (OrderPartsDO partsDO : partsLists) {
- if (partsDO.getGoodsId() != null) { // 有goodsId
+ if (partsDO.getGoodsId() != null && !partsDO.getGoodsId().isEmpty()) { // 有goodsId
PartsDO part = partsMapper.selectByGoodID(partsDO.getGoodsId(), OrganContextHolder.getOrganId());
if (part == null) { // 不存在记录,存入数据库
partsDOS.add(BeanUtils.toBean(partsDO, PartsDO.class).setOrganId(OrganContextHolder.getOrganId()));
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java
index 2af860c3d..94c9799d8 100644
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java
@@ -27,7 +27,7 @@ public class ExcelWriterUtil {
// 写excel
public static void write(HttpServletResponse response,
- Map orderMap,
+ Map orderMap,
List list,
String filePathErr) {
ServletOutputStream outputStream = null;
@@ -44,20 +44,7 @@ public class ExcelWriterUtil {
//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
- //准备单组和数据
- Map map = new HashMap<>();
- map.put("customOrderNo", (String) orderMap.get("自定义单号"));
- map.put("customer", (String) orderMap.get("客户"));
- map.put("address", (String) orderMap.get("客户地址"));
- map.put("phoneNumber", (String) orderMap.get("客户电话"));
- map.put("remark", (String) orderMap.get("备注"));
- map.put("splitter", (String) orderMap.get("拆单员"));
- map.put("salesman", (String) orderMap.get("业务员"));
- map.put("dealerPhoneNumber", (String) orderMap.get("经销商电话"));
- map.put("dealer", (String) orderMap.get("经销商"));
- map.put("deliveryDate", (String) orderMap.get("出货日期"));
-
- excelWriter.fill(map, writeSheet);
+ excelWriter.fill(orderMap, writeSheet);
//列表
excelWriter.fill(list, fillConfig, writeSheet);
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java
index 4f100a249..5d3cd1c4e 100644
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/ToolUtil.java
@@ -1,5 +1,6 @@
package com.cf.imes.module.executor.util.fileConversion.admin;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@@ -110,4 +111,27 @@ public class ToolUtil {
return true;
}
+ // 判断对象是否全为空或是null,进行去除
+ /**
+ * 检查给定的对象的所有字段是否为空或 null。
+ * @param obj 要检查的对象。
+ * @return 如果所有字段都是空或 null,则返回 true;否则返回 false。
+ */
+ public static boolean isAllFieldsEmptyOrNull(Object obj) {
+ if (obj == null) return true;
+
+ Class> clazz = obj.getClass();
+ for (Field field : clazz.getDeclaredFields()) {
+ field.setAccessible(true);
+ try {
+ Object value = field.get(obj);
+ if (value != null && !(value instanceof String && ((String)value).trim().isEmpty())) {
+ return false;
+ }
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return true;
+ }
}
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckListUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckListUtil.java
new file mode 100644
index 000000000..8c7db2d66
--- /dev/null
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckListUtil.java
@@ -0,0 +1,393 @@
+package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.cf.imes.framework.organ.core.context.OrganContextHolder;
+import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
+import com.cf.imes.module.executor.enums.*;
+import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil;
+import com.cf.imes.module.system.api.dict.DictDataApi;
+import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Excel文件数据校验器
+ */
+@Slf4j
+@Component
+public class ExcelCheckListUtil {
+
+ @Resource
+ private DictDataApi dictDataApi;
+
+ private static final String ERR = "error";
+ private static final String DEALER_PHONE = "dealerPhoneNumber";
+ private static final String NUMBER_TYPE_ERR = "数量类型错误";
+ private static final String NOT_EMPTY= "不可为空";
+ private static final String NUMBER_ERR = "数量错误";
+ private static final String ACCORD_ENUM = "请按照提示词语选择填入";
+ private static final String POSITIVE_ERR = "数据需为正数";
+ private static final String NUMBER_LENGTH_ERR = "数据长度过长";
+
+ // 校验文件订单数据, 当有错时返回Map,当数据完全正确时,返回OrderDO
+ public ExcelCheckVO checkExcelList(Map orderMap) {
+
+ AtomicBoolean error = new AtomicBoolean(true);
+
+ // 非空判断
+ setIfInvalid(ProduceExcelConstants.ORDER_CUSTOMER, "---< 客户不能为空 >---", orderMap, 255, error);
+ setIfInvalid(ProduceExcelConstants.ORDER_SALESMAN, "---< 经销商不能为空 >---", orderMap, 255, error);
+ setIfInvalid(ProduceExcelConstants.ORDER_ADDRESS, "---< 客户地址不能为空 >---", orderMap, 255, error);
+ setIfInvalid(ProduceExcelConstants.ORDER_ADDRESS, "---< 客户地址不能为空 >---", orderMap, 255, error);
+
+ if (orderMap.get(ProduceExcelConstants.ORDER_PHONE_NUMBER) == null) {
+ orderMap.put(ProduceExcelConstants.ORDER_PHONE_NUMBER, "---< 客户电话不能为空 >---");
+ error.set(false);
+ } else {
+ setPhone(ProduceExcelConstants.ORDER_PHONE_NUMBER, "---< 客户电话格式错误 >---", orderMap, error);
+ }
+ if (orderMap.get(ProduceExcelConstants.ORDER_DEALER_PHONE_NUMBER) != null) {
+ setPhone(ProduceExcelConstants.ORDER_DEALER_PHONE_NUMBER, "---< 经销商电话格式错误 >---", orderMap, error);
+ }
+ LocalDate deliverDate = null;
+ if (orderMap.get(ProduceExcelConstants.ORDER_DELIVERY_DATE) == null) {
+ orderMap.put(ProduceExcelConstants.ORDER_DELIVERY_DATE, "---< 出货日期不能为空 >---");
+ error.set(false);
+ } else {
+ String s = orderMap.get(ProduceExcelConstants.ORDER_DELIVERY_DATE);
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ Map mapDate = ToolUtil.changeDate(s, formatter);
+ if (mapDate.get(ERR) instanceof Integer && (Integer) mapDate.get(ERR) == -1) {
+ orderMap.put(ProduceExcelConstants.ORDER_DELIVERY_DATE, s + "---< 出货日期格式错误 >---");
+ error.set(false);
+ } else {
+ deliverDate = (LocalDate) mapDate.get("date");
+ if (deliverDate.isBefore(LocalDate.now())) {
+ deliverDate = LocalDate.now().plus(30, ChronoUnit.DAYS);
+ }
+ }
+ }
+ OrderDO orderDO = new OrderDO();
+ if (error.get()) {
+ orderDO = OrderDO.builder()
+ .organId(OrganContextHolder.getOrganId())
+ .dataType(DataTypeEnum.FILE_IMPORT.getStatus())
+ .orderDate(LocalDateTime.now())
+ .customer(ProduceExcelConstants.ORDER_CUSTOMER)
+ .customOrderNo(orderMap.get(ProduceExcelConstants.ORDER_CUSTOM_ORDER_NO))
+ .dealer(orderMap.get(ProduceExcelConstants.ORDER_DEALER))
+ .dealerPhoneNumber(orderMap.get(ProduceExcelConstants.ORDER_DEALER_PHONE_NUMBER))
+ .address(orderMap.get(ProduceExcelConstants.ORDER_CUSTOMER))
+ .phoneNumber(orderMap.get(ProduceExcelConstants.ORDER_PHONE_NUMBER))
+ .salesman(orderMap.get(ProduceExcelConstants.ORDER_SALESMAN))
+ .splitter(orderMap.get(ProduceExcelConstants.ORDER_SPLITTER))
+ .deliveryDate(deliverDate.atStartOfDay())
+ .orderType(OrderTypeEnum.MAIN_ORDER.getStatus())
+ .remark(orderMap.get(ProduceExcelConstants.ORDER_REMARK))
+ .build();
+ }
+
+ return new ExcelCheckVO().setFlag(error.get()).setOrderDO(orderDO).setMapOder(orderMap);
+ }
+
+ // order生产单校验电话号码
+ private void setPhone(String key, String errValue, Map orderMap, AtomicBoolean error) {
+ if (!ToolUtil.validatePhoneNumber(orderMap.get(key))) {
+ orderMap.put(key, orderMap.get(key) + errValue);
+ error.set(false);
+ }
+ }
+
+ private void setIfInvalid(String key, String errValue, Map orderMap, int length, AtomicBoolean error) {
+ orderMap.compute(key, (k, v) -> {
+ if (v == null) {
+ error.set(false);
+ return errValue;
+ } else {
+ int size = (v).length();
+ if (size > length) {
+ error.set(false);
+ return NUMBER_LENGTH_ERR;
+ }
+ }
+ return v;
+ });
+ }
+
+
+ // 校验文件生产数据
+ public ExcelCheckVO checkExcelLargeFile(List list) {
+ List resultList = new ArrayList<>();
+ // 100条一分,确定分片多少
+ int batchSize = 100;
+ int batchCount = (list.size() + batchSize - 1) / batchSize;
+
+ List>> futures = new ArrayList<>();
+ AtomicBoolean flag = new AtomicBoolean(true);
+
+ // 遍历分片
+ for (int i = 0; i < batchCount; i++) {
+ int start = i * batchSize;
+ int end = Math.min(start + batchSize, list.size());
+ List subList = list.subList(start, end);
+
+
+ CompletableFuture> future = CompletableFuture.supplyAsync(() -> checkData(subList, flag));
+ futures.add(future);
+ }
+
+ // 等待所有异步操作完成,并收集结果
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[batchCount])).join();
+
+ for (CompletableFuture> future : futures) {
+ try {
+ List result = future.get(); // 获取每个任务的结果
+
+ resultList.addAll(result);
+ } catch (InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ return new ExcelCheckVO().setFlag(flag.get()).setList(resultList);
+ }
+
+ // List数据校验
+ private List checkData(List list, AtomicBoolean flag) {
+
+ for (OrderPlateImportExcelVO vo : list) {
+ List errList = new ArrayList<>();
+ // 全部需要值的字段
+ // 检查非空 类型、数量
+ isEmpty(vo.getGoodType(), errList, "类型",32, flag);
+ isEmpty(vo.getGoodsNumber(), errList, "数量", 10000000 ,flag);
+
+ // 检查商品物料编码或是商品名称、规格、材质、颜色不可全为空
+ if (StringUtils.isEmpty(vo.getGoodsName()) || StringUtils.isEmpty(vo.getSpec())
+ || StringUtils.isEmpty(vo.getMaterial()) || StringUtils.isEmpty(vo.getColor()) || StringUtils.isEmpty(vo.getUnit())) {
+ errList.add("商品商品名称、规格、材质、颜色、单位不可为空");
+ flag.set(false);
+ }
+
+
+ if (StringUtils.equals(vo.getGoodType(), "配件")) {
+ // 复合部件必填
+ isNotEmptyAndBack(vo.getIsComposite(), QuarrelEnum.class, errList, "是否复合部件", 1, flag); // 判断传入的值,是否符合字典中的枚举类
+ // 配件类型必填
+ isNotEmptyAndBack(vo.getCategory(), CategoryEnum.class, errList, "配件类型", 32, flag);
+ // 配件长宽厚,存在判断是否可以转义
+ isEmptyAndPositiveNumberSize(vo.getGoodsWidth(), Double.class, 5, 3, errList, "配件宽", flag);
+ isEmptyAndPositiveNumberSize(vo.getGoodsHeight(), Double.class, 5, 3, errList, "配件高", flag);
+ isEmptyAndPositiveNumberSize(vo.getGoodsThickness(), Double.class, 5, 3, errList, "配件厚", flag);
+ // 配件类型为封边条的时候,需要填写配件宽厚
+ if (StringUtils.equals(vo.getCategory(), CategoryEnum.EDGING.getValue())) { // 封边条必须有宽高
+ isNotEmptyAndBack(vo.getGoodsWidth(), errList, "封边条宽", flag);
+ isNotEmptyAndBack(vo.getGoodsThickness(), errList, "封边条厚", flag);
+ }
+ // 配件数量判断
+ isEmptyAndPositiveNumber(vo.getGoodsNumber(), Double.class, errList, "配件数量", flag);
+ }
+ // 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空
+ if (StringUtils.equals(vo.getGoodType(), "板材")) {
+ checkPlate(vo, errList, flag);
+ }
+
+
+// if (!flag.get()) {
+// isErr.getAndIncrement();
+// }
+ JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(errList));// 错误列表
+ vo.setResult(String.valueOf(jsonArray));
+
+ }
+
+ return list;
+ }
+
+ // 非空判断,错误填入
+ private void isEmpty(String value, List errList, String errValue, int length, AtomicBoolean flag) {
+ if (StringUtils.isEmpty(value)) {
+ errList.add(errValue + NOT_EMPTY);
+ flag.set(false);
+ } else {
+ // 字符串长度检查
+ int size = value.length();
+ if (size > length) {
+ errList.add(errValue + NUMBER_LENGTH_ERR);
+ flag.set(false);
+ }
+ }
+ }
+
+ // 错误判断通用方法
+ // 判断非零,错误返回;不为空时,判断是否符合枚举类
+ private void isNotEmptyAndBack(String value, Class extends Enum>> enumClass, List errList, String errValue, int length , AtomicBoolean flag) {
+ if (StringUtils.isEmpty(value)) {
+ errList.add(errValue + NOT_EMPTY);
+ flag.set(false);
+ } else {
+ isEmptyAndSize(value, length, errList, errValue, flag);
+ try {
+ // 获取枚举类的所有值
+ Enum>[] enums = enumClass.getEnumConstants();
+ boolean isValid = false;
+ for (Enum> enumValue : enums) {
+ Field valueField = enumValue.getClass().getDeclaredField("value");
+ valueField.setAccessible(true);
+ String enumValueStr = (String) valueField.get(enumValue);
+ if (enumValueStr.equals(value)) {
+ isValid = true;
+ break;
+ }
+ }
+ if (!isValid) {
+ errList.add(errValue + ACCORD_ENUM);
+ flag.set(false);
+ }
+ } catch (IllegalArgumentException e) {
+ errList.add(errValue + ACCORD_ENUM);
+ flag.set(false);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ // 非零判断,有值判断---判断数值类型,数值长度
+ private void isEmptyAndPositiveNumberSize(String value, Class> targetType, Integer length, Integer decimalLength, List errList, String errValue, AtomicBoolean flag) {
+ if (StringUtils.isNotEmpty(value)) {
+ if (Boolean.TRUE.equals(ToolUtil.convertToType(value, targetType))) {
+ if (Boolean.TRUE.equals(ToolUtil.checkNumber(value))) {
+ if (!ToolUtil.checkPrecision(value, length, decimalLength)) {
+ errList.add(errValue + NUMBER_LENGTH_ERR);
+ flag.set(false);
+ }
+ } else {
+ errList.add(errValue + POSITIVE_ERR);
+ flag.set(false);
+ }
+ } else {
+ errList.add(errValue + NUMBER_TYPE_ERR);
+ flag.set(false);
+ }
+ }
+ }
+
+ // 判断非零,错误返回
+ private void isNotEmptyAndBack(String value, List errList, String errValue, AtomicBoolean flag) {
+ if (StringUtils.isEmpty(value)) {
+ errList.add(errValue + NOT_EMPTY);
+ flag.set(false);
+ }
+ }
+
+ // 判断非空,有值判断字符串的长度
+ private void isEmptyAndSize(String value, Integer length, List errList, String errValue, AtomicBoolean flag) {
+ if (StringUtils.isNotEmpty(value)) {
+ int size = value.length();
+ if (size > length) {
+ errList.add(errValue + NUMBER_LENGTH_ERR);
+ flag.set(false);
+ }
+ }
+ }
+
+ // 判断非空,大于零判断
+ public void isEmptyAndPositiveNumber(String value, Class> targetType, List errList, String errValue, AtomicBoolean flag) {
+ if (StringUtils.isNotEmpty(value)) {
+ if (Boolean.FALSE.equals(ToolUtil.convertToType(value, targetType))) {
+ errList.add(errValue + NUMBER_TYPE_ERR);
+ flag.set(false);
+ }else {
+ if (Boolean.FALSE.equals(checkNumber(value))) {
+ errList.add(errValue + "数量不能为0");
+ flag.set(false);
+ }
+ }
+ }
+ }
+
+ // 板材的数据以及长度的检验
+ public void checkPlate(OrderPlateImportExcelVO vo, List errList , AtomicBoolean flag) {
+ // 数量类型判断
+ isEmptyAndPositiveNumber(vo.getGoodsNumber(), Integer.class, errList, "板材数量", flag);
+ // 板材纹理
+ isNotEmptyAndBack(vo.getWave(), IsHavaeEnum.class, errList, "板材纹理", 4, flag);
+ // 大板的长宽厚存在以及是否符合数个
+ isNotEmptyAndBack(vo.getGoodsWidth(), errList, "板材长度", flag);
+ isEmptyAndPositiveNumberSize(vo.getGoodsWidth(), Double.class, 5, 3, errList, "板材长度", flag);
+ isNotEmptyAndBack(vo.getGoodsHeight(), errList, "板材宽度", flag);
+ isEmptyAndPositiveNumberSize(vo.getGoodsHeight(), Double.class, 5, 3, errList, "板材宽度", flag);
+ isNotEmptyAndBack(vo.getGoodsThickness(), errList, "板材厚度", flag);
+ isEmptyAndPositiveNumberSize(vo.getGoodsThickness(), Double.class, 5, 3, errList, "板材厚度", flag);
+ // 房间、柜体、板名称 不可以为空
+ isEmpty(vo.getRoomsName(), errList, "房间名称", 64, flag);
+ isEmpty(vo.getCabinetsName(), errList, "柜体名称", 64, flag);
+ isEmpty(vo.getName(), errList, "板材名称", 64, flag);
+ //成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 不能为空
+ isNotEmptyAndBack(vo.getHeight(), errList, "成品长度", flag);
+ isEmptyAndPositiveNumberSize(vo.getHeight(), Double.class, 5, 3, errList, "成品长度", flag);
+ isNotEmptyAndBack(vo.getWidth(), errList, "成品宽度", flag);
+ isEmptyAndPositiveNumberSize(vo.getWidth(), Double.class, 5, 3, errList, "成品宽度", flag);
+ isNotEmptyAndBack(vo.getSplitHeight(), errList, "拆单长度", flag);
+ isEmptyAndPositiveNumberSize(vo.getSplitHeight(), Double.class, 5, 3, errList, "拆单长度", flag);
+ isNotEmptyAndBack(vo.getSplitWidth(), errList, "拆单宽度", flag);
+ isEmptyAndPositiveNumberSize(vo.getSplitWidth(), Double.class, 5, 3, errList, "拆单宽度", flag);
+ isNotEmptyAndBack(vo.getThickness(), errList, "厚度", flag);
+ isEmptyAndPositiveNumberSize(vo.getThickness(), Double.class, 5, 3, errList, "厚度", flag);
+ isNotEmptyAndBack(vo.getSealLeft(), errList, "左封边", flag);
+ isEmptyAndPositiveNumberSize(vo.getSealLeft(), Double.class, 5, 3, errList, "左封边", flag);
+ isNotEmptyAndBack(vo.getSealRight(), errList, "右封边", flag);
+ isEmptyAndPositiveNumberSize(vo.getSealRight(), Double.class, 5, 3, errList, "右封边", flag);
+ isNotEmptyAndBack(vo.getSealUp(), errList, "上封边", flag);
+ isEmptyAndPositiveNumberSize(vo.getSealUp(), Double.class, 5, 3, errList, "上封边", flag);
+ isNotEmptyAndBack(vo.getSealDown(), errList, "下封边", flag);
+ isEmptyAndPositiveNumberSize(vo.getSealDown(), Double.class, 5, 3, errList, "下封边", flag);
+ // 排版面、纹路、开门方向
+ isNotEmptyAndDict(vo.getTypographicFace(), DictTypeConstants.TYPOGRAPHY_TYPE, errList, "排版面", flag);
+ isNotEmptyAndDict(vo.getTexture(), DictTypeConstants.GRAIN_TYPE, errList, "纹路", flag);
+ isNotEmptyAndDict(vo.getOpenDoorType(), DictTypeConstants.DOOR_OPENING_DIRECTIONS, errList, "开门方向", flag);
+
+ }
+
+ // 判断非空,字典值判断
+ public void isNotEmptyAndDict(String value, String dictType, List errList, String errValue, AtomicBoolean flag) {
+ if (StringUtils.isEmpty(value)) {
+ errList.add(errValue + NOT_EMPTY);
+ flag.set(false);
+ } else {
+ DictDataRespDTO dictDataRespDTO = dictDataApi.parseDictData(dictType, value).getData();
+ if (dictDataRespDTO == null) {
+ errList.add(errValue + ACCORD_ENUM);
+ flag.set(false);
+ }
+ }
+ }
+
+ // 数量大小判断
+ public Boolean checkNumber(String numberStr) {
+ if (numberStr == null) {
+ return false;
+ }
+ if (Double.parseDouble(numberStr) <= 0) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckVO.java
new file mode 100644
index 000000000..975f0c2de
--- /dev/null
+++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelCheckVO.java
@@ -0,0 +1,32 @@
+package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
+
+import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Excel 校验数据类型
+ */
+@Schema(description = "Excel 校验数据类型")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString(callSuper = true)
+public class ExcelCheckVO {
+
+ @Schema(description = "校验结果")
+ private Boolean flag;
+
+ @Schema(description = "校验结果数据")
+ private List list;
+
+ @Schema(description = "订单信息")
+ private OrderDO orderDO;
+
+ @Schema(description = "订单信息")
+ private Map mapOder;
+}
diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java
deleted file mode 100644
index a5f14ee96..000000000
--- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.alibaba.excel.exception.ExcelDataConvertException;
-import com.alibaba.fastjson.JSON;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-
-@Slf4j
-public final class ExcelListener extends AnalysisEventListener