From e899eb2fea66db88cccf1de874a4acfd55770cff Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Sat, 14 Sep 2024 16:31:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/enums/DictTypeConstants.java | 2 + .../admin/order/OrderController.java | 153 ++- .../executor/service/order/OrderService.java | 10 +- .../service/order/OrderServiceImpl.java | 44 +- .../module/executor/util/ExcelWriterUtil.java | 2 +- .../deviseData/structure/BasePosition.java | 12 +- .../deviseData/structure/PlateDetail.java | 3 +- .../util/fileConversion/admin/ToolUtil.java | 39 +- .../admin/api/webcad/ApiTypeRealize.java | 8 +- .../admin/files/excel/ExcelReadUtil.java | 152 ++- .../admin/files/excel/ExcelTypeRealize.java | 8 +- .../admin/files/xml/VO/BlockXmlVO.java | 20 + .../admin/files/xml/VO/BlockXmlVOS.java | 8 + .../admin/files/xml/VO/OutlineXmlVO.java | 5 + .../admin/files/xml/VO/PlateXmlVO.java | 4 + .../admin/files/xml/VO/PlateXmlVOS.java | 4 + .../admin/files/xml/XMLReadUtil.java | 129 --- .../admin/files/xml/XMLUtil.java | 999 ++++++++++++++++++ .../admin/files/xml/XmlBuilder.java | 20 + .../admin/files/xml/XmlTypeRealize.java | 129 +-- .../main/resources/type/order_add_excel.xlsx | Bin 28891 -> 28882 bytes 21 files changed, 1389 insertions(+), 362 deletions(-) delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLReadUtil.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java index e478f08a7..a4fb9469a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java @@ -10,6 +10,8 @@ public interface DictTypeConstants { String GRAIN_TYPE = "grainType";// 小板纹路类型 String DOOR_OPENING_DIRECTIONS = "doorOpeningDirections";//开门方向 String PLATE_TYPE = "order_plate_type"; // 板类型 + String UNIT_LENGTH = "unit_length"; // 长度单位 + String UNIT_AREA = "area_unit"; // 面积单位 // ========== HOLE 模块 ========== 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 9a115c258..2afcac5cb 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 @@ -1,12 +1,9 @@ package com.cf.imes.module.executor.controller.admin.order; import com.alibaba.fastjson.JSONObject; -import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; -import com.cf.imes.framework.web.config.WebProperties; -import com.cf.imes.framework.web.core.util.WebFrameworkUtils; import com.cf.imes.module.executor.controller.admin.order.vo.order.*; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO; @@ -20,12 +17,11 @@ import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiTypeR import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.ExcelReadUtil; import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO; -import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XMLReadUtil; +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; import io.swagger.v3.oas.annotations.Parameters; import lombok.extern.slf4j.Slf4j; -import org.springdoc.webmvc.core.RequestService; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -61,12 +57,9 @@ import com.cf.imes.module.executor.service.order.OrderService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -93,7 +86,7 @@ public class OrderController { private IdentifierGenerator identifierGenerator; @Resource - private XmlTypeRealize xmlTypeRealize; + private XMLUtil xmlUtil; @PutMapping("/update") @@ -195,8 +188,7 @@ public class OrderController { @Operation(summary = "生产单api数据导入新增") @Parameter(name = "orderNo", description = "原订单号", required = true, example = "20230809027818") @PreAuthorize("@ss.hasPermission('production:manager-list:create')") - public CommonResult getApiData(@RequestParam(value = "orderNo") String orderNo) - throws InterruptedException, ExecutionException { + public CommonResult getApiData(@RequestParam(value = "orderNo") String orderNo){ try { Long orderId = (Long) identifierGenerator.nextId(null); @@ -292,70 +284,107 @@ public class OrderController { @RequestParam(value = "type") Integer type, @RequestParam(value = "index", required = false, defaultValue = "0") Integer index, @RequestParam(value = "id", required = false, defaultValue = "0") Long orderId, - HttpServletResponse response) throws IOException { + HttpServletResponse response) { try { - List list = null; - OrderDO orderDO = new OrderDO(); + List list = null; OrderXmlVO orderXmlVO = null; - Map mapOrder = null; - String err = ""; + OrderDO orderDO = null; + Map mapOrder; + + Boolean flag = true; + if (type == 0) { //excel excelReadUtil.setErr(0); Map map = excelReadUtil.read(file); - if (excelReadUtil.isErr() > 0) { - ExcelWriterUtil.write(response, (Map) map.get("order"), (List) map.get("plate"), - orderService.getSavePath() + File.separator + "order_add_excel_err.xlsx"); - return; + list = (List) map.get("plate"); + mapOrder = (Map) map.get("orderPri"); + + if (index == 0) { // 全部 + if (mapOrder != null) { + Map mapChange = excelReadUtil.changeOrderDO(mapOrder); + mapOrder = (Map) mapChange.get("file"); + orderDO = (OrderDO) mapChange.get("order"); + flag = (Boolean) mapChange.get("error"); + } } else { - list = (List) map.get("plate"); - mapOrder = (Map) map.get("order"); - orderDO = (OrderDO) mapOrder.get("order"); + orderDO = orderService.getOrder(orderId); + if (orderDO == null) { + mapOrder = new HashMap<>(); + mapOrder.put("自定义单号", "生产单号不存在"); + flag = false; + } + } + + if (mapOrder == null) { + mapOrder = new HashMap<>(); + mapOrder.put("自定义单号", "生产单内容解析为空"); + flag = false; + }else if (orderDO == null) { + mapOrder.put("自定义单号", "生产单内为空"); + flag = false; + } else if (orderDO.getCustomOrderNo() != null && !orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { + mapOrder.put("自定义单号", mapOrder.get("自定义单号") + "自定义单号重复"); + flag = false; + } else if ( excelReadUtil.isErr() > 0 ){ + flag = false; + } else if ( excelReadUtil.isErr() == 0 && flag ){ if (list.size() == 0) { orderDO.setStatus(OrderStatusEnum.EMPTY.getStatus()); } else { orderDO.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()); } } + if (!flag) { + ExcelWriterUtil.write(response, mapOrder, list, orderService.getSavePath() + File.separator + "order_add_excel_err.xlsx"); + return; + } } else if (type == 1) { // json } else if (type == 2) { // xml - orderXmlVO = (OrderXmlVO) XMLReadUtil.read(file, OrderXmlVO.class); - // 数据内容正确判断 -// if(){ -// -// } - assert orderXmlVO != null; - mapOrder = xmlTypeRealize.changeOrder(orderXmlVO, getUserOrganId()); - orderDO = (OrderDO) mapOrder.get("order"); - if (orderXmlVO.getMaterialXmlVO().getPlateXmlVOS().getPlateXmlVOList().size() == 0) { - orderDO.setStatus(OrderStatusEnum.EMPTY.getStatus()); - } else { - orderDO.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()); - } - } + orderXmlVO = (OrderXmlVO) XMLUtil.read(file, OrderXmlVO.class); - if (index == null || index == 0) { // 整单导入 - err = ((String) mapOrder.get("error")); - orderDO.setOrderType(OrderTypeEnum.MAIN_ORDER.getStatus()); - if (!orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { - err += orderDO.getCustomOrderNo() + "-自定义生产单号已存在;"; + if (index == 0){ + if (orderXmlVO != null) { + mapOrder = xmlUtil.changeDate(orderXmlVO, getUserOrganId()); // 生产单数据格式验证 + orderDO = (OrderDO) mapOrder.get("order"); + flag = (Boolean) mapOrder.get("error"); + } + } else { + orderDO = orderService.getOrder(orderId); + if (orderDO == null) { + orderXmlVO = new OrderXmlVO().setMemo("生产单号不存在"); + flag = false; + } } - if (!err.equals("")) { - ExcelWriterUtil.writeErr(response, err, orderService.getSavePath() + File.separator + "order_err.xlsx"); + + // 生产数据格式验证 + if (orderXmlVO == null) { + orderXmlVO = new OrderXmlVO().setMemo("文件内容解析为空"); + flag = false; + } else if (orderDO == null) { + orderXmlVO = new OrderXmlVO().setMemo("生产单内容为空"); + flag = false; + } else if (orderDO.getCustomOrderNo() != null && !orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { + orderXmlVO.setCustomOrderNo(orderXmlVO.getCustomOrderNo() + "自定义单号重复"); + flag = false; + } else if (flag){ // 生产单的内容正确 + if (orderXmlVO.getMaterialXmlVO().getPlateXmlVOS().getPlateXmlVOList().size() == 0) { + orderDO.setStatus(OrderStatusEnum.EMPTY.getStatus()); + } else { + orderDO.setStatus(OrderStatusEnum.NEW_ORDER.getStatus()); + } + } + if (!flag){ + String xmlStr = XmlBuilder.objectToXmlStr(orderXmlVO); + XMLUtil.writeErr(response, xmlStr, " 错误.xml"); return; } - - } else { // 板材导入 - orderDO = orderService.getOrder(orderId); } - - orderService.importExcelData(orderDO, list, index, orderXmlVO); - + orderService.importExcelData(orderDO, type , index, list, orderXmlVO); } catch (Exception e) { - ExcelWriterUtil.writeErr(response, "系统出现未知错误,请下载模板,按照模板重新上传文件,注意编码格式", orderService.getSavePath() + File.separator + "order_err.xlsx"); - log.error("导入文件出现异常", e); + log.error("文件导入异常", e); } } @@ -453,12 +482,20 @@ public class OrderController { } // 统计 - // 生产单超期/到期告警 (工作台) - @GetMapping("/getOrderWarn") - @Operation(summary = "生产单超期/到期告警 (工作台)") + // 生产单超期(工作台) + @GetMapping("/getOrderOverdue") + @Operation(summary = "生产单超期 (工作台)") @PreAuthorize("@ss.hasPermission('productManager:List')") - public CommonResult>> getOrderOverdue(@Valid PageParam pageParam) { - return success(orderService.getOrderWarn(pageParam)); + public CommonResult> getOrderOverdue(@Valid PageParam pageParam) { + return success(orderService.getOrderOverdue(pageParam)); + } + + // 生产单到期告警 (工作台) + @GetMapping("/getOrderWarn") + @Operation(summary = "生产单到期告警 (工作台)") + @PreAuthorize("@ss.hasPermission('productManager:List')") + public CommonResult> getOrderNear(@Valid PageParam pageParam) { + return success(orderService.getOrderNear(pageParam)); } } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java index 9c0696d42..25398f97b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java @@ -11,6 +11,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBo import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO; import org.springframework.boot.system.ApplicationHome; @@ -107,7 +108,7 @@ public interface OrderService { /** * 文件数据导入 */ - void importExcelData(OrderDO orderDO, List list, Integer index, OrderXmlVO orderXmlVO); + void importExcelData(OrderDO orderDO, Integer type, Integer index, List list, OrderXmlVO orderXmlVO); /** * 生产导入文件模板下载 @@ -141,7 +142,12 @@ public interface OrderService { /** * 生产单超期告警分析统计 */ - Map> getOrderWarn(PageParam pageParam); + PageResult getOrderOverdue(PageParam pageParam); + + /** + * 生产单到期告警分析统计 + */ + PageResult getOrderNear(PageParam pageParam); /** 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 1e4a22a9e..f6518cfe6 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 @@ -44,6 +44,7 @@ import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail; 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.ExcelTypeRealize; +import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.OrderXmlVO; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.XmlTypeRealize; import org.springframework.stereotype.Service; @@ -423,17 +424,30 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional(rollbackFor = Exception.class) - public void importExcelData(OrderDO orderDO, List list, Integer index, OrderXmlVO orderXmlVO) { + public void importExcelData(OrderDO orderDO, Integer type, Integer index, List list, OrderXmlVO orderXmlVO) { if (index == null || index == 0) { orderDO.setId((Long) snowFlakeGenerator.nextId(null)); + String nickName = SecurityFrameworkUtils.getLoginUser().getNickname(); + if (orderDO.getSalesman() == null || orderDO.getSalesman().equals("")) { + orderDO.setSalesman(nickName); + } + if (orderDO.getSplitter() == null || orderDO.getSplitter().equals("")) { + orderDO.setSplitter(nickName); + } orderMapper.insert(orderDO); } Map> listMap = null; - if (list != null && list.size() > 0) { - listMap = excelTypeRealize.changeDate(list, orderDO.getId()); - } else if (orderXmlVO != null) { - listMap = xmlTypeRealize.goodsInfoChange(orderXmlVO, orderDO.getId(), getUserOrganId()); + if (type == 0){ + if (list != null && list.size() > 0) { + listMap = excelTypeRealize.changeDate(list, orderDO.getId()); + } + } else if (type == 1) { + + } else if (type == 2) { + if (orderXmlVO != null) { + listMap = xmlTypeRealize.goodsInfoChange(orderXmlVO, orderDO.getId(), getUserOrganId()); + } } List rawGoodsDO = (List) listMap.get("rawGoodsDOS"); List goodsDO = (List) listMap.get("goodsDOS"); @@ -564,19 +578,21 @@ public class OrderServiceImpl implements OrderService { } @Override - public Map> getOrderWarn(PageParam pageParam) { - Map> map = new HashMap<>(); - + public PageResult getOrderOverdue(PageParam pageParam) { LocalDate todayDate = LocalDate.now(); - LocalDate tomorrow = LocalDate.now().plus(1, ChronoUnit.DAYS); PageDTO page = new PageDTO<>(pageParam.getPageNo(), pageParam.getPageSize()); - // 查询预警单 - IPage orderNearVOS = orderMapper.selectOrderNear(tomorrow, OrganContextHolder.getOrganId(), page); - map.put("orderNearVOS", new PageResult(orderNearVOS.getRecords(), orderNearVOS.getTotal())); // 查询超时单 IPage orderOverdueVOS = orderMapper.selectOrderOverdue(todayDate, OrganContextHolder.getOrganId(), page); - map.put("orderOverdueVOS", new PageResult(orderOverdueVOS.getRecords(), orderOverdueVOS.getTotal())); - return map; + return new PageResult(orderOverdueVOS.getRecords(), orderOverdueVOS.getTotal()); + } + + @Override + public PageResult getOrderNear(PageParam pageParam) { + PageDTO page = new PageDTO<>(pageParam.getPageNo(), pageParam.getPageSize()); + LocalDate tomorrow = LocalDate.now().plus(1, ChronoUnit.DAYS); + // 查询预警单 + IPage orderNearVOS = orderMapper.selectOrderNear(tomorrow, OrganContextHolder.getOrganId(), page); + return new PageResult(orderNearVOS.getRecords(), orderNearVOS.getTotal()); } @Override 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 e31638ebc..3becfeb48 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 @@ -30,7 +30,7 @@ public class ExcelWriterUtil { // 写excel public static void write(HttpServletResponse response, - Map orderMap, + Map orderMap, List list, String filePathErr) throws IOException { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/BasePosition.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/BasePosition.java index 801267455..e2dd79f76 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/BasePosition.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/BasePosition.java @@ -15,16 +15,16 @@ import lombok.NoArgsConstructor; public class BasePosition { private String basePoint;// 基准点 - private String basePointX;// 基准点X坐标 + private Double basePointX;// 基准点X坐标 - private String basePointY;// 基准点Y坐标 + private Double basePointY;// 基准点Y坐标 - private String basePointZ;// 基准点Z坐标 + private Double basePointZ;// 基准点Z坐标 - private String axisXrotate;// 绕X轴旋转角度 + private Double axisXrotate;// 绕X轴旋转角度 - private String axisYrotate;// 绕Y轴旋转角度 + private Double axisYrotate;// 绕Y轴旋转角度 - private String axisZrotate;// 绕Z轴旋转角度 + private Double axisZrotate;// 绕Z轴旋转角度 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java index cecc972f3..3766d9ae3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/structure/PlateDetail.java @@ -1,5 +1,6 @@ package com.cf.imes.module.executor.util.deviseData.structure; +import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -99,7 +100,7 @@ public class PlateDetail{ private List sideHoleDetail;//侧面孔明细 // 备注 - private Map remark;// 板件备注 (生产数据接口中) + private Map plateRemark;// 板件备注 (生产数据接口中) private Map sideRemark;// 封边备注 private String extraRemark; // 扩展备注(包含铰链备注、订单板件流水号)(板材明细中) 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 7894fde22..c7c6075e3 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 @@ -55,7 +55,7 @@ public class ToolUtil { } // 数据类型转换 - public static boolean convertToType(String str, Class targetType) { + public static Boolean convertToType(String str, Class targetType) { try { Method method = targetType.getMethod("parse" + targetType.getSimpleName(), String.class); method.invoke(null, str); @@ -65,5 +65,42 @@ public class ToolUtil { } } + // 数值正负判断 + public static Boolean checkNumber(String numberStr) { + try { + double number = Double.parseDouble(numberStr); + // 进行正负判断 + if (number >= 0) { + return true; + } else { + return false; + } + } catch (NumberFormatException e) { + return false; + } + } + + // 数据长度判断 + public static boolean checkPrecision(String numberStr, Integer length, Integer decimalLength) { + if (numberStr == null) { + return false; + } + + // 分割整数部分和小数部分 + String[] parts = numberStr.split("\\."); + String integerPart = parts[0]; + String decimalPart = parts.length > 1 ? parts[1] : ""; + + // 检查整数部分位数 + if (integerPart.length() > length) { + return false; + } + + // 检查小数部分位数 + if (decimalPart.length() > decimalLength) { + 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/api/webcad/ApiTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java index 7473f9084..97b886714 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java @@ -795,8 +795,8 @@ public class ApiTypeRealize { .setThroughModelCount(Double.valueOf(block.getJSONObject("ExtraRemark").getJSONObject("extra").getString("throughModelCount"))) .setHas2DModel(Boolean.valueOf(block.getJSONObject("ExtraRemark").getJSONObject("extra").getString("has2DModel"))) .setHas3DModel(Boolean.valueOf(block.getJSONObject("ExtraRemark").getJSONObject("extra").getString("has3DModel"))) - .setRemark(remarkToMap(block)) - .setSideRemark(edgeRemarkToMap(block.getJSONObject("ExtraRemark").getJSONObject("extra"))); + .setPlateRemark(remarkToMap(block)); +// .setSideRemark(edgeRemarkToMap(block.getJSONObject("ExtraRemark").getJSONObject("extra"))); } plateDetails.put(block.getLong("BlockNo"), plateDetail); } @@ -975,8 +975,8 @@ public class ApiTypeRealize { // 将remark转为map public Map remarkToMap(JSONObject block) { Map map = new HashMap<>(); - for (int i = 0; i < 4; i++) { - if (block.getString("remark" + i) != null && !block.getString("remark" + i).isEmpty()) { + for (int i = 1; i < 6; i++) { + if (block.getString("Remark" + i) != null && !block.getString("Remark" + i).isEmpty()) { map.put("remark" + i, block.getString("remark" + i)); } } 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/ExcelReadUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java index 05961d326..5f3ed82ef 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java @@ -8,6 +8,7 @@ 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.DataTypeEnum; +import com.cf.imes.module.executor.enums.OrderTypeEnum; 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; @@ -21,13 +22,10 @@ import java.io.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Slf4j @Component @@ -45,7 +43,7 @@ public class ExcelReadUtil { // 文件读取 // 读文件 EasyExcel.read(file.getInputStream(), excelListener).headRowNumber(-1).sheet().doRead(); - Map orderMap = new HashMap<>();// order + Map orderMap = new HashMap<>();// order List> dataLists = excelListener.getDataLists();// 读取的内容 List list = new ArrayList<>();// plate @@ -78,72 +76,146 @@ public class ExcelReadUtil { // 文件读取 // if (MapUtil.isEmpty(orderMap) || CollectionUtil.isEmpty(list)) { // isErr.set(-1); // } - map.put("order", changeOrderDO(orderMap)); + map.put("orderPri", orderMap); map.put("plate", list); return map; } // order 数据转换 - public Map changeOrderDO(Map orderMap) { + public Map changeOrderDO(Map orderMap) { Map map = new HashMap<>(); - String error = ""; -// 判断是否为空 + boolean error = true; + if (orderMap.get("客户") == null) { - error += "客户不能为空;"; + orderMap.put("客户", "---< 客户不能为空 >---"); + error = false; } if (orderMap.get("经销商") == null) { - error += "经销商不能为空;"; + orderMap.put("经销商", "---< 经销商不能为空 >---"); + error = false; } if (orderMap.get("客户地址") == null) { - error += "客户地址不能为空;"; + orderMap.put("客户地址", "---< 客户地址不能为空 >---"); + error = false; } + if (orderMap.get("客户电话") == null) { - error += "客户电话不能为空;"; + orderMap.put("客户电话", "---< 客户电话不能为空 >---"); + error = false; } else { if (!ToolUtil.validatePhoneNumber((String) orderMap.get("客户电话"))) { - error += orderMap.get("客户电话") + "-客户电话格式错误;"; + orderMap.put("客户电话", orderMap.get("客户电话") + "---< 客户电话格式错误 >---"); + error = false; } } if (orderMap.get("经销商电话") != null) { if (!ToolUtil.validatePhoneNumber((String) orderMap.get("经销商电话"))) { - error += orderMap.get("经销商电话") + "-经销商电话格式错误;"; + orderMap.put("经销商电话", orderMap.get("经销商电话") + "---< 经销商电话格式错误 >---"); + error = false; } } - OrderDO orderDO = OrderDO.builder() - .organId(OrganContextHolder.getOrganId()) - .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) - .orderDate(LocalDateTime.now()) - .customer((String) orderMap.get("客户")) // - .customOrderNo((String) orderMap.get("自定义单号")) - .dealer((String) orderMap.get("经销商")) // - .dealerPhoneNumber((String) orderMap.get("经销商电话")) - .address((String) orderMap.get("客户地址")) // - .phoneNumber((String) orderMap.get("客户电话")) // - .salesman((String) orderMap.get("业务员")) - .splitter((String) orderMap.get("拆单员")) - .remark((String) orderMap.get("备注")) - .build(); + LocalDate deliverDate = null; if (orderMap.get("出货日期") == null) { - error += "出货日期不能为空;"; + orderMap.put("出货日期", "---< 出货日期不能为空 >---"); + error = false; } else { String s = (String) orderMap.get("出货日期"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); Map mapDate = ToolUtil.changeDate(s, formatter); if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { - error += s + "-出货日期格式错误;"; + orderMap.put("出货日期", s + "---< 出货日期格式错误 >---"); + error = false; } else { - LocalDate deliveryDate = (LocalDate) mapDate.get("date"); - if (deliveryDate.isBefore(LocalDate.now())) { - deliveryDate = LocalDate.now().plus(30, ChronoUnit.DAYS); + deliverDate = (LocalDate) mapDate.get("date"); + if (deliverDate.isBefore(LocalDate.now())) { + deliverDate = LocalDate.now().plus(30, ChronoUnit.DAYS); } - orderDO.setDeliveryDate(deliveryDate.atStartOfDay()); } } + OrderDO orderDO = new OrderDO(); + if (error) { + orderDO = OrderDO.builder() + .organId(OrganContextHolder.getOrganId()) + .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) + .orderDate(LocalDateTime.now()) + .customer((String) orderMap.get("客户")) + .customOrderNo((String) orderMap.get("自定义单号")) + .dealer((String) orderMap.get("经销商")) + .dealerPhoneNumber((String) orderMap.get("经销商电话")) + .address((String) orderMap.get("客户地址")) + .phoneNumber((String) orderMap.get("客户电话")) + .salesman((String) orderMap.get("业务员")) + .splitter((String) orderMap.get("拆单员")) + .deliveryDate(deliverDate.atStartOfDay()) + .orderType(OrderTypeEnum.MAIN_ORDER.getStatus()) + .remark((String) orderMap.get("备注")) + .build(); + } map.put("order", orderDO); + map.put("file", orderMap); map.put("error", error); return map; } +// public Map changeOrderDO(Map orderMap) { +// Map map = new HashMap<>(); +// String error = ""; +// if (orderMap.get("客户") == null) { +// error += "客户不能为空;"; +// } +// if (orderMap.get("经销商") == null) { +// error += "经销商不能为空;"; +// } +// if (orderMap.get("客户地址") == null) { +// error += "客户地址不能为空;"; +// } +// if (orderMap.get("客户电话") == null) { +// error += "客户电话不能为空;"; +// } else { +// if (!ToolUtil.validatePhoneNumber((String) orderMap.get("客户电话"))) { +// error += orderMap.get("客户电话") + "-客户电话格式错误;"; +// } +// } +// if (orderMap.get("经销商电话") != null) { +// if (!ToolUtil.validatePhoneNumber((String) orderMap.get("经销商电话"))) { +// error += orderMap.get("经销商电话") + "-经销商电话格式错误;"; +// } +// } +// OrderDO orderDO = OrderDO.builder() +// .organId(OrganContextHolder.getOrganId()) +// .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) +// .orderDate(LocalDateTime.now()) +// .customer((String) orderMap.get("客户")) // +// .customOrderNo((String) orderMap.get("自定义单号")) +// .dealer((String) orderMap.get("经销商")) // +// .dealerPhoneNumber((String) orderMap.get("经销商电话")) +// .address((String) orderMap.get("客户地址")) // +// .phoneNumber((String) orderMap.get("客户电话")) // +// .salesman((String) orderMap.get("业务员")) +// .splitter((String) orderMap.get("拆单员")) +// .orderType(OrderTypeEnum.MAIN_ORDER.getStatus()) +// .remark((String) orderMap.get("备注")) +// .build(); +// if (orderMap.get("出货日期") == null) { +// error += "出货日期不能为空;"; +// } else { +// String s = (String) orderMap.get("出货日期"); +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); +// Map mapDate = ToolUtil.changeDate(s, formatter); +// if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { +// error += s + "-出货日期格式错误;"; +// } else { +// LocalDate deliveryDate = (LocalDate) mapDate.get("date"); +// if (deliveryDate.isBefore(LocalDate.now())) { +// deliveryDate = LocalDate.now().plus(30, ChronoUnit.DAYS); +// } +// orderDO.setDeliveryDate(deliveryDate.atStartOfDay()); +// } +// } +// map.put("order", orderDO); +// map.put("error", error); +// return map; +// } // 赋值单元格数据 private OrderPlateImportExcelVO changeValue(Map dataMap) { @@ -319,9 +391,9 @@ public class ExcelReadUtil { // 文件读取 } } // 检查商品物料编码或是商品名称、规格、材质、颜色不可全为空 - if (StringUtils.isEmpty(vo.getGoodsId()) && (StringUtils.isEmpty(vo.getGoodsName()) || StringUtils.isEmpty(vo.getSpec()) - || StringUtils.isEmpty(vo.getMaterial()) || StringUtils.isEmpty(vo.getColor()) || StringUtils.isEmpty(vo.getUnit()))) { - errList.add("商品物料编码或是商品名称、规格、材质、颜色、单位不可全为空"); + if (StringUtils.isEmpty(vo.getGoodsName()) || StringUtils.isEmpty(vo.getSpec()) + || StringUtils.isEmpty(vo.getMaterial()) || StringUtils.isEmpty(vo.getColor()) || StringUtils.isEmpty(vo.getUnit())) { + errList.add("商品商品名称、规格、材质、颜色、单位不可为空"); flag = false; } // 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空 @@ -392,9 +464,9 @@ public class ExcelReadUtil { // 文件读取 errList.add("房间、柜体、板名称不能为空"); } //成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 不能为空 - if (StringUtils.isEmpty(vo.getHeight()) && StringUtils.isEmpty(vo.getWidth()) && StringUtils.isEmpty(vo.getSplitHeight()) - && StringUtils.isEmpty(vo.getSplitWidth()) && StringUtils.isEmpty(vo.getThickness()) && StringUtils.isEmpty(vo.getSealLeft()) - && StringUtils.isEmpty(vo.getSealRight()) && StringUtils.isEmpty(vo.getSealUp()) && StringUtils.isEmpty(vo.getSealDown())) { + if (StringUtils.isEmpty(vo.getHeight()) || StringUtils.isEmpty(vo.getWidth()) || StringUtils.isEmpty(vo.getSplitHeight()) + || StringUtils.isEmpty(vo.getSplitWidth()) || StringUtils.isEmpty(vo.getThickness()) || StringUtils.isEmpty(vo.getSealLeft()) + || StringUtils.isEmpty(vo.getSealRight()) || StringUtils.isEmpty(vo.getSealUp()) || StringUtils.isEmpty(vo.getSealDown())) { flag = false; errList.add("小板轮廓数据不能为空"); 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/ExcelTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java index 03b799f58..221b80518 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java @@ -50,12 +50,12 @@ public class ExcelTypeRealize { final String NOT_ASSIGNED = "未命名"; // 数据转换 + 错误验证 - public Map> changeDate(List list, Long orderId) { - if (list.isEmpty()) { + public Map> changeDate(List excelVOS, Long orderId) { + if (excelVOS.isEmpty()) { return null; } - List excelVOS = (List) list; +// List excelVOS = (List) list; Map> map = new HashMap<>(); Long organId = OrganContextHolder.getOrganId(); @@ -266,7 +266,7 @@ public class ExcelTypeRealize { // if (orderBodyDO.getName() != null && !orderBodyDO.getName().trim().isEmpty()) { orderBodyDOS.add(orderBodyDO); // } - System.out.println(" ban-num " + plateCountByCabinetName[0]); +// System.out.println(" ban-num " + plateCountByCabinetName[0]); }); }); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java index 6a423d351..b8a4f6960 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVO.java @@ -111,6 +111,26 @@ public class BlockXmlVO implements Serializable { @XmlAttribute(name = "coatingReverse") private String coatingReverse; + // 长度单位 + @XmlAttribute(name = "unitLength") + private String unitLength; + + // 面积单位 + @XmlAttribute(name = "unitArea") + private String unitArea; + + // 成品面积 + @XmlAttribute(name = "area") + private String area; + + // 开料面积 + @XmlAttribute(name = "areaCutting") + private String areaCutting; + + // 是否钻孔 + @XmlAttribute(name = "drilling") + private String drilling; + // 房间ID @XmlAttribute(name = "roomId") private String roomId; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVOS.java index 120305468..74cac6261 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/BlockXmlVOS.java @@ -20,6 +20,14 @@ public class BlockXmlVOS implements Serializable { @XmlAttribute( name = "count") private String count; + // 面积 + @XmlAttribute( name = "area") + private String area; + + // 面积单位 + @XmlAttribute( name = "unit") + private String unit; + // @XmlElement( name = "Block") private List blockXmlVOList; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OutlineXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OutlineXmlVO.java index 93bfa0734..71f84330d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OutlineXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/OutlineXmlVO.java @@ -15,6 +15,11 @@ import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) public class OutlineXmlVO implements Serializable { + // 点阵数量 + @XmlAttribute(name = "count") + private String count; + + @XmlElement(name = "Point") private List pointXmlVOList; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java index fe3851932..7f768fdd6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVO.java @@ -71,6 +71,10 @@ public class PlateXmlVO implements Serializable { @XmlAttribute(name = "thickness") private String thickness; + // 是否余料 + @XmlAttribute(name = "oddment") + private String oddment; + // 余料长 @XmlAttribute(name = "oddmentLength") private String oddmentLength; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java index 33b891d03..558c5531c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/PlateXmlVOS.java @@ -20,4 +20,8 @@ public class PlateXmlVOS implements Serializable { @XmlElement( name = "Plate") private List plateXmlVOList; + + // 上传结果 + @XmlElement( name = "result") + private String result; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLReadUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLReadUtil.java deleted file mode 100644 index 775fe975b..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLReadUtil.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; - -import com.alibaba.fastjson.JSON; -import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil; -import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.*; -import java.nio.charset.StandardCharsets; - -@Slf4j -@Component -public class XMLReadUtil { - - final String TYPE_ERR = "数据类型错误"; - - public static Object read(MultipartFile file, Class clazz) throws IOException { - - - byte[] firstThreeBytes = new byte[3]; - - // 用字符缓冲流获取XML文件内容 - - InputStream inputStream = file.getInputStream(); - inputStream.read(firstThreeBytes, 0, 3); -// if (firstThreeBytes[0] == (byte) 0xEF && firstThreeBytes[1] == (byte) 0xBB && firstThreeBytes[2] == (byte) 0xBF) { -// // 跳过 BOM -// inputStream.skip(3); -// } - try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { - StringBuffer builder = new StringBuffer(); - String line; - while ((line = br.readLine()) != null) { - builder.append(line); - } - - // XML转为JAVA对象 - Object odfBody = XmlBuilder.xmlStrToOject(clazz, builder.toString()); - - return odfBody; - } catch (IOException e) { - log.error("Error reading the file: " + file.getOriginalFilename(), e); - } catch (Exception e) { - log.error("Error parsing the XML to an OrderXmlVO object", e); - } - - return null; - } - - // 数据格式转换 - public Boolean checkVO(OrderXmlVO orderXmlVO) { - Boolean flag = true; - - RoomXmlVOS roomXmlVOS = orderXmlVO.getRoomXmlVOS(); - if ( roomXmlVOS != null ) { - for ( RoomXmlVO room : roomXmlVOS.getRoomXmlVOList() ) { - if (room != null){ - if (!ToolUtil.convertToType(room.getHeight(), Double.class)){ - room.setHeight(room.getHeight() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(room.getLength(), Double.class)){ - room.setLength(room.getLength() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(room.getWidth(), Double.class)){ - room.setWidth(room.getWidth() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(room.getCount(), Integer.class)){ - room.setCount(room.getCount() + "-" + TYPE_ERR); - } - if (room.getBoxXmlVOList() != null){ - for (BoxXmlVO box : room.getBoxXmlVOList()) { - if (box != null){ - if (!ToolUtil.convertToType(box.getHeight(), Double.class)){ - box.setHeight(box.getHeight() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(box.getLength(), Double.class)){ - box.setLength(box.getLength() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(box.getWidth(), Double.class)){ - box.setWidth(box.getWidth() + "-" + TYPE_ERR); - } - } - } - } - } - } - } - - ModuleXmlVOS moduleXmlVOS = orderXmlVO.getModuleXmlVOS(); - if ( moduleXmlVOS != null ) { - for ( ModuleXmlVO module : moduleXmlVOS.getModuleXmlVOList() ) { - if (module != null){ - if (!ToolUtil.convertToType(module.getHeight(), Double.class)){ - module.setHeight(module.getHeight() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(module.getLength(), Double.class)){ - module.setLength(module.getLength() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(module.getWidth(), Double.class)){ - module.setWidth(module.getWidth() + "-" + TYPE_ERR); - } - } - } - } - - GroupXmlVOS grooveXmlVOS = orderXmlVO.getGroupXmlVOS(); - if ( grooveXmlVOS != null ) { - for ( GroupXmlVO groove : grooveXmlVOS.getGroupXmlVOList() ) { - if (groove != null){ - if (!ToolUtil.convertToType(groove.getHeight(), Double.class)){ - groove.setHeight(groove.getHeight() + "-" + TYPE_ERR); - } - if (!ToolUtil.convertToType(groove.getLength(), Double.class)){ - groove.setLength(groove.getLength() + "-"+ TYPE_ERR); - } - if (!ToolUtil.convertToType(groove.getWidth(), Double.class)){ - groove.setWidth(groove.getWidth() + "-" + TYPE_ERR); - } - } - } - } - - - return flag; - } - -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java new file mode 100644 index 000000000..36ad584c2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XMLUtil.java @@ -0,0 +1,999 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; + +import com.alibaba.nacos.common.utils.StringUtils; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.enums.DataTypeEnum; +import com.cf.imes.module.executor.enums.DictTypeConstants; +import com.cf.imes.module.executor.enums.OrderTypeEnum; +import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil; +import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.*; +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 org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +public class XMLUtil { + + final String TYPE_ERR = "数据类型错误"; + final String POSITIVE_ERR = "数据需为正数"; + final String LONG_ERR = "数据长度不符合(共8位整数位5位,小数位3位)"; + + @Resource + private DictDataApi dictDataApi; + + public static Object read(MultipartFile file, Class clazz) throws IOException { + + + byte[] firstThreeBytes = new byte[3]; + + // 用字符缓冲流获取XML文件内容 + + InputStream inputStream = file.getInputStream(); + inputStream.read(firstThreeBytes, 0, 3); +// if (firstThreeBytes[0] == (byte) 0xEF && firstThreeBytes[1] == (byte) 0xBB && firstThreeBytes[2] == (byte) 0xBF) { +// // 跳过 BOM +// inputStream.skip(3); +// } + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + StringBuffer builder = new StringBuffer(); + String line; + while ((line = br.readLine()) != null) { + builder.append(line); + } + + // XML转为JAVA对象 + Object odfBody = XmlBuilder.xmlStrToOject(clazz, builder.toString()); + + return odfBody; + } catch (IOException e) { + log.error("Error reading the file: " + file.getOriginalFilename(), e); + } catch (Exception e) { + log.error("Error parsing the XML to an OrderXmlVO object", e); + } + + return null; + } + + public static void writeErr(HttpServletResponse response, String xmlStr, String name) throws IOException { + // 获取输出流 + Writer writer = new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8); + + // 输出 XML 数据 + writer.write(xmlStr); + writer.flush(); + writer.close(); + + // 设置响应头 + response.setContentType("application/xml; charset=UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name, StandardCharsets.UTF_8.name())); + } + + // 生产单数据格式验证 + public Map changeDate(OrderXmlVO orderXmlVO, Long organId) { + Map map = new HashMap<>(); + boolean error = true; + + if (orderXmlVO.getCustomOrderNo() == null) { + orderXmlVO.setCustomOrderNo("---< 客户不能为空 >---"); + error = false; + } + if (orderXmlVO.getDealer() == null) { + orderXmlVO.setDealer("---< 经销商不能为空 >---"); + error = false; + } + if (orderXmlVO.getCustomerAddress() == null) { + orderXmlVO.setCustomerAddress("---< 客户地址不能为空 >---"); + error = false; + } + if (orderXmlVO.getCustomerPhone() == null) { + orderXmlVO.setCustomerPhone("---< 客户电话不能为空 >---"); + error = false; + } else { + if (!ToolUtil.validatePhoneNumber(orderXmlVO.getCustomerPhone())) { + orderXmlVO.setCustomerPhone("---< " + orderXmlVO.getCustomerPhone() + "客户电话格式错误 >---"); + error = false; + } + } + if (orderXmlVO.getDealerPhone() != null) { + if (!ToolUtil.validatePhoneNumber(orderXmlVO.getDealerPhone())) { + orderXmlVO.setDealerPhone("---< " + orderXmlVO.getDealerPhone() + "经销商电话格式错误 >---"); + error = false; + } + } + LocalDate orderDate = null; + LocalDate deliverDate = null; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + Map mapDate = ToolUtil.changeDate(orderXmlVO.getOrderDate(), formatter); + if (orderXmlVO.getOrderDate() == null) { + orderXmlVO.setOrderDate("---< 订单日期不能为空 >---"); + error = false; + } else { + if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { + orderXmlVO.setOrderDate("---< " + orderXmlVO.getOrderDate() + "订单日期格式错误 >---"); + error = false; + } else { + orderDate = (LocalDate) mapDate.get("date"); + } + } + mapDate = ToolUtil.changeDate(orderXmlVO.getDeliveryDate(), formatter); + if (orderXmlVO.getDeliveryDate() == null) { + orderXmlVO.setDeliveryDate("---< 出货日期不能为空 >---"); + error = false; + } else { + if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { + orderXmlVO.setDeliveryDate("---< " + orderXmlVO.getDeliveryDate() + "出货日期格式错误 >---"); + error = false; + } else { + deliverDate = (LocalDate) mapDate.get("date"); + if (orderDate != null && deliverDate.isBefore(orderDate)) { + deliverDate = orderDate.plus(30, ChronoUnit.DAYS); + } + } + } + OrderDO orderDO = new OrderDO(); + if (error){ + assert orderDate != null; + orderDO = OrderDO.builder() + .organId(organId) + .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) + .customer(orderXmlVO.getCustomer()) + .customOrderNo(orderXmlVO.getCustomOrderNo()) + .dealer(orderXmlVO.getDealer()) + .dealerPhoneNumber(orderXmlVO.getDealerPhone()) + .address(orderXmlVO.getCustomerAddress()) + .phoneNumber(orderXmlVO.getCustomerPhone()) + .salesman(orderXmlVO.getSeller()) + .splitter(orderXmlVO.getAnalyst()) + .remark(orderXmlVO.getMemo()) + .orderDate(orderDate.atStartOfDay()) + .deliveryDate(deliverDate.atStartOfDay()) + .orderType(OrderTypeEnum.MAIN_ORDER.getStatus()) + .build(); + } + + // 生产单信息验证 + map.put("order", orderDO); + map.put("file", orderXmlVO); + map.put("error", error); + return map; + } + + // 数据格式转换 + public Boolean checkVO(OrderXmlVO orderXmlVO) { + Boolean flag = true; + + RoomXmlVOS roomXmlVOS = orderXmlVO.getRoomXmlVOS(); + if ( roomXmlVOS != null ) { + checkRoom(roomXmlVOS, flag); + } + + ModuleXmlVOS moduleXmlVOS = orderXmlVO.getModuleXmlVOS(); + if ( moduleXmlVOS != null ) { + checkModules(moduleXmlVOS, flag); + } + + GroupXmlVOS grooveXmlVOS = orderXmlVO.getGroupXmlVOS(); + if ( grooveXmlVOS != null ) { + checkGroups(grooveXmlVOS, flag); + } + + MaterialXmlVO materialXmlVO = orderXmlVO.getMaterialXmlVO(); + if ( materialXmlVO != null ) { + PlateXmlVOS plateXmlVOS = materialXmlVO.getPlateXmlVOS(); + if (plateXmlVOS != null) { + + } else { + materialXmlVO.setPlateXmlVOS(new PlateXmlVOS().setResult("---< 板材信息不能为空 >---")); + } + } + + return flag; + } + + // 房间数据格式验证 + public void checkRoom(RoomXmlVOS roomXmlVOS, Boolean error) { + if (StringUtils.isEmpty(roomXmlVOS.getCount())) { + roomXmlVOS.setCount("---< 房间数量不能为空 >---"); + error = false; + } else { + if (ToolUtil.convertToType(roomXmlVOS.getCount(), Integer.class)){ + if (!ToolUtil.checkNumber(roomXmlVOS.getCount())){ + roomXmlVOS.setCount("---< " + roomXmlVOS.getCount() + POSITIVE_ERR + " >---"); + error = false; + } + } else { + roomXmlVOS.setCount("---< " + roomXmlVOS.getCount() + TYPE_ERR + " >---"); + error = false; + } + } + for ( RoomXmlVO room : roomXmlVOS.getRoomXmlVOList() ) { + if (room != null){ + if (StringUtils.isEmpty(room.getId())){ + room.setId("---< 房间编号不能为空 >---"); + error = false; + } + if (StringUtils.isEmpty(room.getName())){ + room.setName("---< 房间名称不能为空 >---"); + error = false; + } + if (!StringUtils.isEmpty(room.getHeight()) ){ + Boolean flag = checkNumber(room.getHeight(), Double.class); + if (!flag) { + room.setHeight("---< " + room.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + room.setHeight("0"); + } + if (!StringUtils.isEmpty(room.getLength()) ){ + Boolean flag = checkNumber(room.getLength(), Double.class); + if (!flag) { + room.setLength("---< " + room.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + room.setLength("0"); + } + if (!StringUtils.isEmpty(room.getWidth()) ){ + Boolean flag = checkNumber(room.getWidth(), Double.class); + if (!flag) { + room.setWidth("---< " + room.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + }else { + room.setWidth("0"); + } + + if (room.getBoxXmlVOList() != null && room.getBoxXmlVOList().size() > 0){ + checkBoxList(room.getBoxXmlVOList(), error); + } + } + } + } + // 柜体数据格式验证 + public void checkBoxList(List boxXmlVOList, Boolean error) { + for ( BoxXmlVO box : boxXmlVOList ) { + if (StringUtils.isEmpty(box.getId())){ + box.setId("---< 柜体编号不能为空 >---"); + error = false; + } + if (StringUtils.isEmpty(box.getName())){ + box.setName("---< 柜体名称不能为空 >---"); + error = false; + } + if (!StringUtils.isEmpty(box.getHeight()) ){ + Boolean flag = checkNumber(box.getHeight(), Double.class); + if (!flag) { + box.setHeight("---< " + box.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + box.setHeight("0"); + } + if (!StringUtils.isEmpty(box.getLength()) ){ + Boolean flag = checkNumber(box.getLength(), Double.class); + if (!flag) { + box.setLength("---< " + box.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + box.setLength("0"); + } + if (!StringUtils.isEmpty(box.getWidth()) ){ + Boolean flag = checkNumber(box.getWidth(), Double.class); + if (!flag) { + box.setWidth("---< " + box.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + box.setWidth("0"); + } + if (!StringUtils.isEmpty(box.getBasePointX())){ + if (!ToolUtil.convertToType(box.getBasePointX(), Double.class)) { + box.setBasePointX("---< " + box.getBasePointX() + TYPE_ERR + " >---"); + } + } else { + box.setBasePointX("0"); + } + if (!StringUtils.isEmpty(box.getBasePointY())){ + if (!ToolUtil.convertToType(box.getBasePointY(), Double.class)) { + box.setBasePointY("---< " + box.getBasePointY() + TYPE_ERR + " >---"); + } + } else { + box.setBasePointY("0"); + } + if (!StringUtils.isEmpty(box.getBasePointZ())){ + if (!ToolUtil.convertToType(box.getBasePointZ(), Double.class)) { + box.setBasePointZ("---< " + box.getBasePointZ() + TYPE_ERR + " >---"); + } + } else { + box.setBasePointZ("0"); + } + if (!StringUtils.isEmpty(box.getAxisYrotate())){ + if (!ToolUtil.convertToType(box.getAxisYrotate(), Double.class)) { + box.setAxisYrotate("---< " + box.getAxisYrotate() + TYPE_ERR + " >---"); + } + } else { + box.setAxisYrotate("0"); + } + if (!StringUtils.isEmpty(box.getAxisXrotate())){ + if (!ToolUtil.convertToType(box.getAxisXrotate(), Double.class)) { + box.setAxisXrotate("---< " + box.getAxisXrotate() + TYPE_ERR + " >---"); + } + } else { + box.setAxisXrotate("0"); + } + if (!StringUtils.isEmpty(box.getAxisZrotate())){ + if (!ToolUtil.convertToType(box.getAxisZrotate(), Double.class)) { + box.setAxisZrotate("---< " + box.getAxisZrotate() + TYPE_ERR + " >---"); + } + } else { + box.setAxisZrotate("0"); + } + } + } + + // 模块数据格式验证 + public void checkModules(ModuleXmlVOS moduleXmlVOS, Boolean error) { + if (StringUtils.isEmpty(moduleXmlVOS.getCount())) { + moduleXmlVOS.setCount("---< 模块数量不能为空 >---"); + error = false; + } else { + if (ToolUtil.convertToType(moduleXmlVOS.getCount(), Integer.class)){ + if (!ToolUtil.checkNumber(moduleXmlVOS.getCount())){ + moduleXmlVOS.setCount("---< " + moduleXmlVOS.getCount() + POSITIVE_ERR + " >---"); + error = false; + } + } else { + moduleXmlVOS.setCount("---< " + moduleXmlVOS.getCount() + TYPE_ERR + " >---"); + error = false; + } + } + if (moduleXmlVOS.getModuleXmlVOList() != null && moduleXmlVOS.getModuleXmlVOList().size() > 0){ + checkModuleList(moduleXmlVOS.getModuleXmlVOList(), error); + } + + } + // 模块数据格式验证 + public void checkModuleList(List moduleXmlVOSList, Boolean error) { + for ( ModuleXmlVO module : moduleXmlVOSList ) { + if (StringUtils.isEmpty(module.getId())){ + module.setId("---< 柜体编号不能为空 >---"); + error = false; + } + if (StringUtils.isEmpty(module.getName())){ + module.setName("---< 柜体名称不能为空 >---"); + error = false; + } + if (!StringUtils.isEmpty(module.getLength()) ){ + Boolean flag = checkNumber(module.getLength(), Double.class); + if (!flag) { + module.setLength("---< " + module.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + module.setLength("0"); + } + if (!StringUtils.isEmpty(module.getWidth()) ){ + Boolean flag = checkNumber(module.getWidth(), Double.class); + if (!flag) { + module.setWidth("---< " + module.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + module.setWidth("0"); + } + if (!StringUtils.isEmpty(module.getHeight()) ){ + Boolean flag = checkNumber(module.getHeight(), Double.class); + if (!flag) { + module.setHeight("---< " + module.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + module.setHeight("0"); + } + } + } + + // 加工组数据格式验证 + public void checkGroups(GroupXmlVOS groupXmlVOS, Boolean error) { + if (StringUtils.isEmpty(groupXmlVOS.getCount())) { + groupXmlVOS.setCount("---< 模块数量不能为空 >---"); + error = false; + } else { + if (ToolUtil.convertToType(groupXmlVOS.getCount(), Integer.class)){ + if (!ToolUtil.checkNumber(groupXmlVOS.getCount())){ + groupXmlVOS.setCount("---< " + groupXmlVOS.getCount() + POSITIVE_ERR + " >---"); + error = false; + } + } else { + groupXmlVOS.setCount("---< " + groupXmlVOS.getCount() + TYPE_ERR + " >---"); + error = false; + } + } + if (groupXmlVOS.getGroupXmlVOList() != null && groupXmlVOS.getGroupXmlVOList().size() > 0){ + checkGroupList(groupXmlVOS.getGroupXmlVOList(), error); + } + } + // 加工组数据格式验证 + public void checkGroupList(List groupXmlVOList, Boolean error) { + for ( GroupXmlVO group : groupXmlVOList ) { + if (StringUtils.isEmpty(group.getId())){ + group.setId("---< 加工组编号不能为空 >---"); + error = false; + } + if (StringUtils.isEmpty(group.getName())){ + group.setName("---< 加工组名称不能为空 >---"); + error = false; + } + if (!StringUtils.isEmpty(group.getLength()) ){ + Boolean flag = checkNumber(group.getLength(), Double.class); + if (!flag) { + group.setLength("---< " + group.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + group.setLength("0"); + } + if (!StringUtils.isEmpty(group.getWidth()) ){ + Boolean flag = checkNumber(group.getWidth(), Double.class); + if (!flag) { + group.setWidth( "---< " + group.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + group.setWidth("0"); + } + if (!StringUtils.isEmpty(group.getHeight()) ){ + Boolean flag = checkNumber(group.getHeight(), Double.class); + if (!flag) { + group.setHeight("---< " + group.getHeight() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } else { + group.setHeight("0"); + } + } + } + + // 板材数据格式验证 + public void checkPlates(List plateXmlVOList, Boolean error) { + for ( PlateXmlVO plate : plateXmlVOList ) { + if (StringUtils.isEmpty(plate.getName())){ + plate.setId("---< 板材名称不能为空 >---"); + error = false; + } + if (StringUtils.isEmpty(plate.getMaterial())){ + plate.setItemNo("---< 板材材质不能为空 >---"); + error = false; + } + // 纹理有效性判断 + if (StringUtils.isEmpty(plate.getGrained())) { + plate.setGrained("有"); + } else { + if (!StringUtils.equals(plate.getGrained().trim(), "无") && !StringUtils.equals(plate.getGrained().trim(), "有")) { + plate.setGrained("---< " + plate.getGrained() + " 板材纹理无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(plate.getCoatingObverse())) { + plate.setCoatingObverse("---< 板材正面颜色不可为空>---"); + } + if (StringUtils.isEmpty(plate.getLength())){ + plate.setLength("---< 板材长度不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(plate.getLength(), Double.class); + if (!flag) { + plate.setLength("---< " + plate.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getLength(), 5, 3)){ + plate.setLength("---< " + plate.getLength() + LONG_ERR + " >---"); + error = false; + } + } + } + if (StringUtils.isEmpty(plate.getWidth())){ + plate.setWidth("---< 板材宽度不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(plate.getWidth(), Double.class); + if (!flag) { + plate.setWidth("---< " + plate.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getWidth(), 5, 3)){ + plate.setWidth("---< " + plate.getWidth() + LONG_ERR + " >---"); + error = false; + } + } + } + if (StringUtils.isEmpty(plate.getThickness())){ + plate.setThickness("---< 板材宽度不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(plate.getThickness(), Double.class); + if (!flag) { + plate.setThickness("---< " + plate.getThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getThickness(), 5, 3)){ + plate.setThickness("---< " + plate.getThickness() + LONG_ERR + " >---"); + error = false; + } + } + } + if (!StringUtils.isEmpty(plate.getOddmentLength())){ + Boolean flag = checkNumber(plate.getOddmentLength(), Double.class); + if (!flag) { + plate.setOddmentLength("---< " + plate.getOddmentLength() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getOddmentLength(), 5, 3)){ + plate.setOddmentLength("---< " + plate.getOddmentLength() + LONG_ERR + " >---"); + error = false; + } + } + } + if (!StringUtils.isEmpty(plate.getOddmentWidth())){ + Boolean flag = checkNumber(plate.getOddmentWidth(), Double.class); + if (!flag) { + plate.setOddmentWidth("---< " + plate.getOddmentWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getOddmentWidth(), 5, 3)){ + plate.setOddmentWidth("---< " + plate.getOddmentWidth() + LONG_ERR + " >---"); + error = false; + } + } + } + if (!StringUtils.isEmpty(plate.getOddmentThickness())){ + Boolean flag = checkNumber(plate.getOddmentThickness(), Double.class); + if (!flag) { + plate.setOddmentThickness("---< " + plate.getOddmentThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkPrecision(plate.getOddmentThickness(), 5, 3)){ + plate.setOddmentThickness("---< " + plate.getOddmentThickness() + LONG_ERR + " >---"); + error = false; + } + } + } + if (!StringUtils.isEmpty(plate.getOddment())) { + if (!StringUtils.equals(plate.getOddment().trim(), "是") && !StringUtils.equals(plate.getOddment().trim(), "否")) { + plate.setGrained("---< " + plate.getOddment() + "板材是否余料标识无效无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(plate.getUnitLength())){ + plate.setThickness("---< 板材长度单位不可为空>---"); + error = false; + } + if (StringUtils.isEmpty(plate.getArea())){ + plate.setArea("---< 板材面积不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(plate.getArea(), Double.class); + if (!flag) { + plate.setArea("---< " + plate.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + + if (plate.getBlockXmlVOS() != null) { + checkBlocks(plate.getBlockXmlVOS(), error); + } + } + } + // 小板数据格式验证 + public void checkBlocks(BlockXmlVOS blockXmlVOS, Boolean error) { + if (StringUtils.isNotEmpty(blockXmlVOS.getCount())) { + blockXmlVOS.setCount("---< 小板片数不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(blockXmlVOS.getCount(), Integer.class); + if (!flag) { + blockXmlVOS.setCount("---< " + blockXmlVOS.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkNumber(blockXmlVOS.getCount())){ + blockXmlVOS.setCount("---< " + blockXmlVOS.getCount() + POSITIVE_ERR + " >---"); + error = false; + } + } + } + if (StringUtils.isNotEmpty(blockXmlVOS.getArea())) { + blockXmlVOS.setArea("---< 小板总面积不可为空>---"); + error = false; + } else { + Boolean flag = checkNumber(blockXmlVOS.getArea(), Integer.class); + if (!flag) { + blockXmlVOS.setArea("---< " + blockXmlVOS.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } else { + if (!ToolUtil.checkNumber(blockXmlVOS.getArea())){ + blockXmlVOS.setArea("---< " + blockXmlVOS.getArea() + POSITIVE_ERR + " >---"); + error = false; + } + } + } + if (StringUtils.isNotEmpty(blockXmlVOS.getCount())) { + blockXmlVOS.setArea("---< 小板面积单位不可为空>---"); + error = false; + } + + if (blockXmlVOS.getBlockXmlVOList() != null) { + checkBlockList(blockXmlVOS.getBlockXmlVOList(), error); + } + } + // 板块数据格式验证 + public void checkBlockList(List blockXmlVOList, Boolean error) { + if (blockXmlVOList.size() > 0) { + for (BlockXmlVO blockXmlVO : blockXmlVOList) { + if (StringUtils.isEmpty(blockXmlVO.getName())){ + blockXmlVO.setName("未命名"); + } + if (StringUtils.isEmpty(blockXmlVO.getType())) { + blockXmlVO.setType("---< 板块类型不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.PLATE_TYPE, blockXmlVO.getType()).getData(); + if (dictData == null) { + blockXmlVO.setType("---< " + blockXmlVO.getType() + "板块类型无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getOpenDirection())) { + blockXmlVO.setOpenDirection("---< 板块开门方向不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, blockXmlVO.getOpenDirection()).getData(); + if (dictData == null) { + blockXmlVO.setOpenDirection("---< " + blockXmlVO.getOpenDirection() + "板块开门方向无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getTexture())) { + blockXmlVO.setTexture("---< 板块设计纹路不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, blockXmlVO.getTexture()).getData(); + if (dictData == null) { + blockXmlVO.setTexture("---< " + blockXmlVO.getTexture() + "板块设计纹路无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getLayoutFace())) { + blockXmlVO.setLayoutFace("---< 板块排版面不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, blockXmlVO.getLayoutFace()).getData(); + if (dictData == null) { + blockXmlVO.setLayoutFace("---< " + blockXmlVO.getLayoutFace() + "板块排版面无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getCoatingType())) { + blockXmlVO.setCoatingType("---< 板块设计饰面不可为空 >---"); + error = false; + } + if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { + blockXmlVO.setCoatingObverse("---< 板块正面颜色不可为空 >---"); + error = false; + } + if (StringUtils.isEmpty(blockXmlVO.getCoatingObverse())) { + blockXmlVO.setCoatingReverse("---< 板块反面颜色不可为空 >---"); + error = false; + } + if (StringUtils.isEmpty(blockXmlVO.getLength())) { + blockXmlVO.setLength("---< 板块长度不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getLength(), Double.class,5, 3)){ + blockXmlVO.setLength("---< " + blockXmlVO.getLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getWidth())) { + blockXmlVO.setWidth("---< 板块宽度不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getWidth(), Double.class,5, 3)){ + blockXmlVO.setWidth("---< " + blockXmlVO.getWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getThickness())) { + blockXmlVO.setThickness("---< 板块厚度不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getThickness(), Double.class,5, 3)){ + blockXmlVO.setThickness("---< " + blockXmlVO.getThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getCuttingLength())) { + blockXmlVO.setCuttingLength("---< 板块开料长不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getThickness(), Double.class,5, 3)){ + blockXmlVO.setCuttingLength("---< " + blockXmlVO.getCuttingLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getCuttingWidth())) { + blockXmlVO.setCuttingWidth("---< 板块开料宽不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getCuttingWidth(), Double.class,5, 3)){ + blockXmlVO.setCuttingWidth("---< " + blockXmlVO.getCuttingWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getCuttingThickness())) { + blockXmlVO.setCuttingThickness("---< 板块开料厚不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getCuttingThickness(), Double.class,5, 3)){ + blockXmlVO.setCuttingThickness("---< " + blockXmlVO.getCuttingThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getRawLength())) { + blockXmlVO.setRawLength("---< 板块胚料长不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getRawLength(), Double.class,5, 3)){ + blockXmlVO.setRawLength("---< " + blockXmlVO.getRawLength() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getRawWidth())) { + blockXmlVO.setRawWidth("---< 板块胚料宽不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getRawWidth(), Double.class,5, 3)){ + blockXmlVO.setRawWidth("---< " + blockXmlVO.getRawWidth() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getRawThickness())) { + blockXmlVO.setRawThickness("---< 板块胚料厚不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getRawThickness(), Double.class,5, 3)){ + blockXmlVO.setRawThickness("---< " + blockXmlVO.getRawThickness() + POSITIVE_ERR + "或是" + TYPE_ERR + "或是" + LONG_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getUnitLength())) { + blockXmlVO.setRawThickness("---< 板块长度单位不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_LENGTH, blockXmlVO.getUnitLength()).getData(); + if (dictData == null){ + blockXmlVO.setUnitLength("---< " + blockXmlVO.getUnitLength() + " 长度单位无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getArea())) { + blockXmlVO.setArea("---< 板块成品面积不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getArea(), Double.class)){ + blockXmlVO.setArea("---< " + blockXmlVO.getArea() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getAreaCutting())){ + blockXmlVO.setAreaCutting("---< 板块开料面积不可为空 >---"); + error = false; + } else { + if (!checkNumber(blockXmlVO.getAreaCutting(), Double.class)){ + blockXmlVO.setAreaCutting("---< " + blockXmlVO.getAreaCutting() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getUnitArea())) { + blockXmlVO.setUnitArea("---< 板块面积单位不可为空 >---"); + error = false; + } else { + DictDataRespDTO dictData = dictDataApi.parseDictData(DictTypeConstants.UNIT_AREA, blockXmlVO.getUnitArea()).getData(); + if (dictData == null){ + blockXmlVO.setUnitArea("---< " + blockXmlVO.getUnitArea() + "面积单位无效 >---"); + } + } + if (StringUtils.isEmpty(blockXmlVO.getMultipleNumber())){ + blockXmlVO.setMultipleNumber("1"); + } else { + if (!checkNumber(blockXmlVO.getMultipleNumber(), Integer.class)){ + blockXmlVO.setMultipleNumber("---< " + blockXmlVO.getMultipleNumber() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getUnregular())){ + blockXmlVO.setUnregular("---< 板块是否异形不可为空 >---"); + error = false; + } else { + if (!StringUtils.equals(blockXmlVO.getUnregular().trim(), "是") && !StringUtils.equals(blockXmlVO.getUnregular().trim(), "否")) { + blockXmlVO.setUnregular("---< " + blockXmlVO.getUnregular() + "板材是否异形数据无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getDrilling())){ + blockXmlVO.setDrilling("---< 板块是否钻孔不可为空 >---"); + error = false; + } else { + if (!StringUtils.equals(blockXmlVO.getDrilling().trim(), "是") && !StringUtils.equals(blockXmlVO.getDrilling().trim(), "否")) { + blockXmlVO.setDrilling("---< " + blockXmlVO.getDrilling()+ "板材是否钻孔数据无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getSlotting())){ + blockXmlVO.setSlotting("---< 板块是否挖槽不可为空 >---"); + error = false; + } else { + if (!StringUtils.equals(blockXmlVO.getSlotting().trim(), "是") && !StringUtils.equals(blockXmlVO.getSlotting().trim(), "否")) { + blockXmlVO.setSlotting("---< " + blockXmlVO.getSlotting() + "板材是否挖槽数据无效 >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getBasePointX())){ + blockXmlVO.setBasePointX("---< 板块基点X坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getBasePointX(), Double.class)) { + blockXmlVO.setBasePointX("---< " + blockXmlVO.getBasePointX() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getBasePointY())){ + blockXmlVO.setBasePointY("---< 板块基点Y坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getBasePointX(), Double.class)) { + blockXmlVO.setBasePointY("---< " + blockXmlVO.getBasePointY() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getBasePointZ())){ + blockXmlVO.setBasePointZ("---< 板块基点X坐标不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getBasePointZ(), Double.class)) { + blockXmlVO.setBasePointZ("---< " + blockXmlVO.getBasePointZ() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getAxisXrotate())){ + blockXmlVO.setAxisXrotate("---< 板块绕X轴旋转角度不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getAxisXrotate(), Double.class)) { + blockXmlVO.setAxisXrotate("---< " + blockXmlVO.getAxisXrotate() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getAxisYrotate())){ + blockXmlVO.setAxisYrotate("---< 板块绕Y轴旋转角度不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getAxisYrotate(), Double.class)) { + blockXmlVO.setAxisYrotate("---< " + blockXmlVO.getAxisYrotate() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(blockXmlVO.getAxisZrotate())){ + blockXmlVO.setAxisZrotate("---< 板块绕Z轴旋转角度不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(blockXmlVO.getAxisZrotate(), Double.class)) { + blockXmlVO.setAxisZrotate("---< " + blockXmlVO.getAxisZrotate() + TYPE_ERR + " >---"); + error = false; + } + } + + if (blockXmlVO.getOutlineXmlVO() != null){ + checkOutline(blockXmlVO.getOutlineXmlVO(), error); + } + + } + } + } + + // 成品轮廓数据验证 + public void checkOutline(OutlineXmlVO outlineXmlVO, Boolean error) { + if (!StringUtils.isNotEmpty(outlineXmlVO.getCount())){ + Boolean flag = checkNumber(outlineXmlVO.getCount(), Integer.class); + if (!flag) { + outlineXmlVO.setCount("---< " + outlineXmlVO.getCount() + POSITIVE_ERR + "或是" + TYPE_ERR + " >---"); + error = false; + } + } + if (outlineXmlVO.getPointXmlVOList() != null && outlineXmlVO.getPointXmlVOList().size() > 0){ + for (PointXmlVO pointXmlVO : outlineXmlVO.getPointXmlVOList()) { + if (StringUtils.isEmpty(pointXmlVO.getPointX())){ + pointXmlVO.setPointX("---< 板块轮廓起点坐标X不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getPointX(), Double.class)) { + pointXmlVO.setPointX("---< " + pointXmlVO.getPointX() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getPointY())){ + pointXmlVO.setPointY("---< 板块轮廓起点坐标Y不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getPointY(), Double.class)) { + pointXmlVO.setPointY("---< " + pointXmlVO.getPointY() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getCurvature())){ + pointXmlVO.setPointZ("---< 板块轮廓边圆弧凹凸度不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getCurvature(), Double.class)) { + pointXmlVO.setCurvature("---< " + pointXmlVO.getCurvature() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getRadius())){ + pointXmlVO.setRadius("---< 板块轮廓边圆弧半径不可为空 >---"); + error = false; + } else { + if (!ToolUtil.convertToType(pointXmlVO.getRadius(), Double.class)) { + pointXmlVO.setRadius("---< " + pointXmlVO.getRadius() + TYPE_ERR + " >---"); + error = false; + } + } + if (StringUtils.isEmpty(pointXmlVO.getEdgingId())){ + pointXmlVO.setProcess("---< 板块轮廓封边条ID不可为空 >---"); + error = false; + } + + } + } + } + // 数据格式+数据正数判断 + private Boolean checkNumber(String numberStr, Class targetType) { + boolean error = true; + if (ToolUtil.convertToType(numberStr, targetType)) { + if (!ToolUtil.checkNumber(numberStr)){ + error = false; + } + } else { + error = false; + } + return error; + } + // 数据格式+数据正数+数据长度判断 + private Boolean checkNumber(String numberStr, Class targetType, Integer length, Integer decimalLength) { + Boolean flag = checkNumber(numberStr, targetType); + if (!flag) { + return false; + } else { + if (!ToolUtil.checkPrecision(numberStr, length, decimalLength)) { + 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/xml/XmlBuilder.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlBuilder.java index f1793cba4..a4d691227 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlBuilder.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlBuilder.java @@ -3,8 +3,10 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; import java.io.Reader; import java.io.StringReader; +import java.io.StringWriter; import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** @@ -38,5 +40,23 @@ public class XmlBuilder { return xmlObject; } + /** + * 将指定的POJO转为XML + * @param object 要转换的对象 + * @return XML 字符串 + * @throws Exception 如果转换过程中出现错误 + */ + public static String objectToXmlStr(Object object) throws Exception { + StringWriter writer = new StringWriter(); + JAXBContext context = JAXBContext.newInstance(object.getClass()); + + // 对象转为XML的接口 + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(object, writer); + + return writer.toString(); + } + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java index b1ac1cb6b..2d3b74cfe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/XmlTypeRealize.java @@ -1,21 +1,18 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; -import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO; -import com.cf.imes.module.executor.enums.DataTypeEnum; import com.cf.imes.module.executor.util.deviseData.structure.*; import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd; -import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil; import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.*; import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO; @@ -26,8 +23,6 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -55,82 +50,6 @@ public class XmlTypeRealize { @Resource private IdentifierGenerator identifierGenerator; - // 数据转换 + 错误验证 - public Map> changeDate(OrderXmlVO orderXmlVO, Long orderId, Long organId) { - if (orderXmlVO == null) { - return null; - } - Map> map = new HashMap<>(); - - return null; - } - - // 生产单转换 - public Map changeOrder(OrderXmlVO orderXmlVO, Long organId) { - Map map = new HashMap<>(); - String error = ""; - - if (orderXmlVO.getCustomOrderNo() == null) { - error += "客户不能为空;"; - } - if (orderXmlVO.getDealer() == null) { - error += "经销商不能为空;"; - } - if (orderXmlVO.getCustomerAddress() == null) { - error += "客户地址不能为空;"; - } - if (orderXmlVO.getCustomerPhone() == null) { - error += "客户电话不能为空;"; - } else { - if (!ToolUtil.validatePhoneNumber(orderXmlVO.getCustomerPhone())) { - error += orderXmlVO.getCustomerPhone() + "-客户电话格式错误;"; - } - } - if (orderXmlVO.getDealerPhone() != null) { - if (!ToolUtil.validatePhoneNumber(orderXmlVO.getDealerPhone())) { - error += orderXmlVO.getDealerPhone() + "-经销商电话格式错误;"; - } - } - OrderDO orderDO = OrderDO.builder() - .organId(organId) - .dataType(DataTypeEnum.FILE_IMPORT.getStatus()) - .customer(orderXmlVO.getCustomer()) - .customOrderNo(orderXmlVO.getCustomOrderNo()) - .dealer(orderXmlVO.getDealer()) - .dealerPhoneNumber(orderXmlVO.getDealerPhone()) - .address(orderXmlVO.getCustomerAddress()) - .phoneNumber(orderXmlVO.getCustomerPhone()) - .salesman(orderXmlVO.getSeller()) - .splitter(orderXmlVO.getAnalyst()) - .remark(orderXmlVO.getMemo()) - .build(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - Map mapDate = ToolUtil.changeDate(orderXmlVO.getOrderDate(), formatter); - if (orderXmlVO.getOrderDate() == null) { - error += "-订单日期不可为空;"; - } else { - if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { - error += orderXmlVO.getOrderDate() + "-订单日期格式错误;"; - } else { - orderDO.setOrderDate(((LocalDate) mapDate.get("date")).atStartOfDay()); - } - } - mapDate = ToolUtil.changeDate(orderXmlVO.getDeliveryDate(), formatter); - if (orderXmlVO.getDeliveryDate() == null) { - error += "-出货日期不可为空;"; - } else { - if (mapDate.get("error") instanceof Integer && (Integer) mapDate.get("error") == -1) { - error += orderXmlVO.getDeliveryDate() + "-出货日期格式错误;"; - } else { - orderDO.setDeliveryDate(((LocalDate) mapDate.get("date")).atStartOfDay()); - } - } - - map.put("order", orderDO); - map.put("error", error); - return map; - } - // 房间柜体信息转换 public Map> bodyInfoChange(RoomXmlVOS roomXmlVOS, Long orderId, Long organId) { @@ -170,12 +89,12 @@ public class XmlTypeRealize { for (RoomXmlVO roomXmlVO : roomXmlVOS.getRoomXmlVOList()) { for (BoxXmlVO boxXmlVO : roomXmlVO.getBoxXmlVOList()) { BasePosition basePosition = BasePosition.builder() - .basePointX(boxXmlVO.getBasePointX()) - .basePointY(boxXmlVO.getBasePointY()) - .basePointZ(boxXmlVO.getBasePointZ()) - .axisXrotate(boxXmlVO.getAxisXrotate()) - .axisYrotate(boxXmlVO.getAxisYrotate()) - .axisZrotate(boxXmlVO.getAxisZrotate()) + .basePointX(Double.valueOf(boxXmlVO.getBasePointX())) + .basePointY(Double.valueOf(boxXmlVO.getBasePointY())) + .basePointZ(Double.valueOf(boxXmlVO.getBasePointZ())) + .axisXrotate(Double.valueOf(boxXmlVO.getAxisXrotate())) + .axisYrotate(Double.valueOf(boxXmlVO.getAxisYrotate())) + .axisZrotate(Double.valueOf(boxXmlVO.getAxisZrotate())) .build(); basePositions.put(boxXmlVO.getId(), basePosition); } @@ -248,6 +167,12 @@ public class XmlTypeRealize { // 板材 小板 if (plateXmlVOS.getPlateXmlVOList() != null && plateXmlVOS.getPlateXmlVOList().size() > 0) { for (PlateXmlVO plateXmlVO : plateXmlVOS.getPlateXmlVOList()) { + if (StringUtils.equals(plateXmlVO.getGrained().trim(), "无")) { + plateXmlVO.setGrained("false"); + } else if (StringUtils.equals(plateXmlVO.getGrained().trim(), "有")) { + plateXmlVO.setGrained("true"); + } + Long rawGoodsId = (Long) identifierGenerator.nextId(null); Long goodsId = (Long) identifierGenerator.nextId(null); rawGoodsDOs.add(RawGoodsDO.builder() @@ -259,7 +184,7 @@ public class XmlTypeRealize { .material(plateXmlVO.getMaterial()) .color(plateXmlVO.getCoatingObverse()) .colorBlack(plateXmlVO.getCoatingReverse()) - .texture(ToolUtil.convertToType(plateXmlVO.getGrained(), Boolean.class) ? Boolean.valueOf(plateXmlVO.getGrained()) : false) + .texture(Boolean.valueOf(plateXmlVO.getGrained())) .thickness(Double.parseDouble(plateXmlVO.getThickness())) .brand(plateXmlVO.getBrand()) .spec(plateXmlVO.getSpecs()) @@ -275,7 +200,7 @@ public class XmlTypeRealize { .material(plateXmlVO.getMaterial()) .color(plateXmlVO.getCoatingObverse()) .colorBlack(plateXmlVO.getCoatingReverse()) - .texture(ToolUtil.convertToType(plateXmlVO.getGrained(), Boolean.class) ? Boolean.valueOf(plateXmlVO.getGrained()) : false) + .texture(Boolean.valueOf(plateXmlVO.getGrained())) .width(BigDecimal.valueOf(Double.parseDouble(plateXmlVO.getWidth()))) .height(BigDecimal.valueOf(Double.parseDouble(plateXmlVO.getLength()))) .thickness(BigDecimal.valueOf(Double.parseDouble(plateXmlVO.getThickness()))) @@ -617,7 +542,7 @@ public class XmlTypeRealize { .area(area) .texture(Integer.valueOf(dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, blockXmlVO.getTexture()).getData().getValue())) .holeFace(Integer.valueOf(dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, blockXmlVO.getLayoutFace()).getData().getValue())) - .isDoor(doorType == 0) + .isDoor(doorType != 0) .openDoorType(doorType) .isSpecialShaped(convertToBoolean(blockXmlVO.getUnregular())) .build(); @@ -637,12 +562,12 @@ public class XmlTypeRealize { // 基点坐标获取 BasePosition plateBasePosition = BasePosition.builder() .basePoint(blockXmlVO.getId()) - .basePointX(blockXmlVO.getBasePointX()) - .basePointY(blockXmlVO.getBasePointY()) - .basePointZ(blockXmlVO.getBasePointZ()) - .axisXrotate(blockXmlVO.getAxisXrotate()) - .axisYrotate(blockXmlVO.getAxisYrotate()) - .axisZrotate(blockXmlVO.getAxisZrotate()) + .basePointX(Double.valueOf(blockXmlVO.getBasePointX())) + .basePointY(Double.valueOf(blockXmlVO.getBasePointY())) + .basePointZ(Double.valueOf(blockXmlVO.getBasePointZ())) + .axisXrotate(Double.valueOf(blockXmlVO.getAxisXrotate())) + .axisYrotate(Double.valueOf(blockXmlVO.getAxisYrotate())) + .axisZrotate(Double.valueOf(blockXmlVO.getAxisZrotate())) .build(); PlateDetail plateDetail = PlateDetail.builder() .plateId(plateId) @@ -667,8 +592,8 @@ public class XmlTypeRealize { .holeDetail(new ArrayList<>()) .contourDetail(new ArrayList<>()) .sideHoleDetail(new ArrayList<>()) - .remark(new HashMap<>()) - .sideRemark(new HashMap<>()) + .plateRemark(new HashMap<>()) +// .sideRemark(new HashMap<>()) .isUnRegular(plateDO.getIsSpecialShaped()) .build(); // 小板、es 封边值 @@ -745,7 +670,7 @@ public class XmlTypeRealize { .radius(Double.parseDouble(pointXmlVO.getRadius())) .sealSize(size) .build()); - plateDetail.getSideRemark().put(pointXmlVO.getId(), pointXmlVO.getRemark()); +// plateDetail.getSideRemark().put(pointXmlVO.getId(), pointXmlVO.getRemark()); } } plateDetail.setSealUp(sealUp).setSealDown(sealDown).setSealLeft(sealLeft).setSealRight(sealRight); @@ -892,9 +817,9 @@ public class XmlTypeRealize { private void addRemark(PlateDO plateDO, PlateDetail plateDetail, BlockXmlVO blockXmlVO) { if (blockXmlVO.getRemarkXmlVOS() != null && blockXmlVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && blockXmlVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { for (RemarkXmlVO remarkXmlVO : blockXmlVO.getRemarkXmlVOS().getRemarkXmlVOList()) { - plateDetail.getRemark().put(remarkXmlVO.getName(), remarkXmlVO.getInfo()); + plateDetail.getPlateRemark().put(remarkXmlVO.getName(), remarkXmlVO.getInfo()); } - plateDO.setRemark(JSONObject.toJSONString(plateDetail.getRemark())); + plateDO.setRemark(JSONObject.toJSONString(plateDetail.getPlateRemark())); } } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel.xlsx index abdf894da8a3f979d149c85a21328edaed0cee11..0778999da3827f8b8c37acb127d4dac2db374156 100644 GIT binary patch delta 9810 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 L-_3XV>;8WLX2