From 026b761c297c7d08f4f6d311ef1ee9f287aaf496 Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Tue, 4 Jun 2024 16:50:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=AF=BC=E5=87=BA1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/ESDocumentServiceImpl.java | 1 + .../admin/goods/vo/GoodsPageReqVO.java | 3 + .../admin/goods/vo/GoodsRespVO.java | 4 + .../admin/goods/vo/GoodsSaveReqVO.java | 3 + .../admin/order/OrderController.java | 22 ++- .../admin/order/vo/order/OrderPageReqVO.java | 3 + .../admin/order/vo/order/OrderSaveReqVO.java | 14 +- .../admin/order/vo/product/ProductRespVO.java | 24 --- .../process/vo/OrderProcessSaveReqVO.java | 7 +- .../admin/rawgoods/vo/RawGoodsPageReqVO.java | 3 + .../admin/rawgoods/vo/RawGoodsRespVO.java | 4 + .../admin/rawgoods/vo/RawGoodsSaveReqVO.java | 3 + .../dal/dataobject/goods/GoodsDO.java | 4 + .../dal/dataobject/rawgoods/RawGoodsDO.java | 4 + .../executor/dal/mysql/order/OrderMapper.java | 1 + .../mysql/orderParts/OrderPartsMapper.java | 4 +- .../executor/service/order/OrderService.java | 3 +- .../service/order/OrderServiceImpl.java | 41 +++-- .../module/executor/util/ExcelWriterUtil.java | 160 ++++++++++++++++++ .../admin/api/webcad/ApiTypeRealize.java | 22 ++- .../api/webcad/MultiThreadingConfig.java | 96 +++++------ .../admin/files/excel/ExcelReadUtil.java | 61 +------ .../admin/files/excel/ExcelTypeRealize.java | 6 +- .../files/excel/OrderPlateImportExcelVO.java | 15 +- .../mapper/orderParts/OrderPartsMapper.xml | 26 ++- .../resources/mapper/plate/PlateMapper.xml | 1 + .../resources/type/板材明细-按房间-模板.xlsx | Bin 0 -> 10927 bytes .../resources/type/板材明细-按板材-模板.xlsx | Bin 0 -> 12302 bytes .../resources/type/板材汇总-按房间-模板.xlsx | Bin 0 -> 10404 bytes .../resources/type/板材汇总-按板材-模板.xlsx | Bin 0 -> 10397 bytes .../main/resources/type/配件明细1-模板.xlsx | Bin 0 -> 10993 bytes .../main/resources/type/配件汇总1-模板.xlsx | Bin 0 -> 11206 bytes .../src/main/resources/type/错误文件.xlsx | Bin 0 -> 8946 bytes .../admin/plate/vo/plate/PlateSaveReqVO.java | 11 +- .../plate/vo/remain/RemainPlateSaveReqVO.java | 12 +- 35 files changed, 358 insertions(+), 200 deletions(-) delete mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/product/ProductRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材明细-按房间-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材明细-按板材-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材汇总-按房间-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材汇总-按板材-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件明细1-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件汇总1-模板.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/错误文件.xlsx diff --git a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/core/service/ESDocumentServiceImpl.java b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/core/service/ESDocumentServiceImpl.java index 84f7c22fe..514ad55ee 100644 --- a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/core/service/ESDocumentServiceImpl.java +++ b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/core/service/ESDocumentServiceImpl.java @@ -53,6 +53,7 @@ public class ESDocumentServiceImpl implements ESDocumentService { document.setOrganId(loginUser.getOrganId()); document.setCreateTime(simpleDateFormat.format(date)); document.setUpdateTime(simpleDateFormat.format(date)); + if (StrUtil.isBlank(document.getId())) { document.setId(snowflake.nextIdStr()); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsPageReqVO.java index 287a221de..99e9f2e3d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsPageReqVO.java @@ -35,6 +35,9 @@ public class GoodsPageReqVO extends PageParam { @Schema(description = "颜色") private String color; + @Schema(description = "纹路") + private Integer texture; + @Schema(description = "宽度") private BigDecimal width; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsRespVO.java index 05196514e..c45f5359b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsRespVO.java @@ -43,6 +43,10 @@ public class GoodsRespVO { @ExcelProperty("颜色") private String color; + @Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("纹路") + private Integer texture; + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("宽度") private BigDecimal width; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java index 69c356cc3..07d81cbae 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java @@ -32,6 +32,9 @@ public class GoodsSaveReqVO { @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) private String color; + @Schema(description = "纹路") + private Integer texture; + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal width; 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 ce9b537dd..7ca0def77 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 @@ -6,6 +6,7 @@ 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.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; +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; @@ -260,12 +261,14 @@ public class OrderController { Map map = excelReadUtil.read(file); System.err.println(excelReadUtil.isErr()); // 判断是否读取有误 - if (excelReadUtil.isErr() > 1) { + if (excelReadUtil.isErr() == -1) { // 文件为空 + ExcelWriterUtil.writeErr(response, "生产单内容为空",orderService.getSavePath()+ "\\"+ "错误文件.xlsx"); + return; + }else if (excelReadUtil.isErr() > 0) { // 返回文件 - System.err.println(orderService.getSavePath()+ "生产单Excel导入错误导出模板.xlsx"); - excelReadUtil.write(response, (Map) map.get("order"), (List) map.get("plate"),orderService.getSavePath()+ "\\"+ "生产单Excel导入错误导出模板.xlsx"); - throw exception(FILE_READ_ERR); - }else { + ExcelWriterUtil.write(response, (Map) map.get("order"), (List) map.get("plate"),orderService.getSavePath()+ "\\"+ "生产单Excel导入错误导出模板.xlsx"); + return; + } else { // 获取数据 list = (List) map.get("plate"); orderDO = excelReadUtil.changeOrderDO((Map) map.get("order")).setOrderType(0).setStatus(1); @@ -276,7 +279,6 @@ public class OrderController { } orderService.importExcelData(orderDO,list); - throw exception(FILE_READ_SUCCESS); } @GetMapping("/get-goodsList") @@ -302,9 +304,11 @@ public class OrderController { @GetMapping("/printing") @Operation(summary = "打印/导出") - @PreAuthorize("@ss.hasPermission('executor:order:query')") @Parameter(name = "type", description = "文件类型", required = true, example = "0") - public CommonResult getOrderPrinting(@Valid OrderPageReqVO pageReqVO, @RequestParam("type") String type) { - return success(orderService.getPrintData(pageReqVO,type)); + @PreAuthorize("@ss.hasPermission('executor:order:query')") + @OperateLog(type = EXPORT) + public void getOrderPrinting(@Valid OrderPageReqVO pageReqVO, @RequestParam("type") String type, + HttpServletResponse response) throws IOException { + orderService.getPrintData(pageReqVO,type,response); } } \ 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/controller/admin/order/vo/order/OrderPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPageReqVO.java index c1729335a..b06abefc6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderPageReqVO.java @@ -19,6 +19,9 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @NoArgsConstructor public class OrderPageReqVO extends PageParam { + @Schema(description = "生产单号") + private Long id; + @Schema(description = "父单号") private Long parentNo; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderSaveReqVO.java index a8362ee64..c0d0ff918 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderSaveReqVO.java @@ -31,8 +31,7 @@ public class OrderSaveReqVO { @NotNull(message = "生产单类型,1主单 2子单不能为空") private Boolean orderType; - @Schema(description = "生产单排序号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "生产单排序号不能为空") + @Schema(description = "生产单排序号") private Integer orderSort; @Schema(description = "CAD数据类型,1CAD 2WebCAD 3Excel", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @@ -43,8 +42,7 @@ public class OrderSaveReqVO { @NotNull(message = "订单状态,订单状态,0空订单1新单2生产中3生产完成") private Integer status; - @Schema(description = "自定义单号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "自定义单号不能为空") + @Schema(description = "自定义单号") private String customOrderNo; @Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED) @@ -67,15 +65,13 @@ public class OrderSaveReqVO { @NotEmpty(message = "经销商电话不能为空") private String dealerPhoneNumber; - @Schema(description = "业务员", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "业务员不能为空") + @Schema(description = "业务员") private String salesman; - @Schema(description = "拆单员", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "拆单员不能为空") + @Schema(description = "拆单员") private String splitter; - @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + @Schema(description = "备注", example = "你猜") private String remark; private Boolean deleted; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/product/ProductRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/product/ProductRespVO.java deleted file mode 100644 index 1a7d8494b..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/product/ProductRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.cf.imes.module.executor.controller.admin.order.vo.product; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 产品信息合集 Response VO") -@Data -@ExcelIgnoreUnannotated -public class ProductRespVO { - -// private Long orderId; - private Long roomId; - private String roomName; - private Long bodyId; - private String bodyName; - private Long groupId; - private Long groupTypeId; - private String groupTypeName; - private int goodType; - private String goodName; - private String units; - private Double num; -} \ 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/controller/admin/process/vo/OrderProcessSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/process/vo/OrderProcessSaveReqVO.java index 073cf3047..0871b4d7a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/process/vo/OrderProcessSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/process/vo/OrderProcessSaveReqVO.java @@ -15,8 +15,7 @@ public class OrderProcessSaveReqVO { @NotNull(message = "生产单号不能为空") private Long orderId; - @Schema(description = "工序名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - @NotEmpty(message = "工序组名不能为空") + @Schema(description = "工序名", example = "张三") private String name; @Schema(description = "工序组 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4356") @@ -27,10 +26,10 @@ public class OrderProcessSaveReqVO { @NotNull(message = "工序状态,0未加工,1已加工不能为空") private Boolean status; - @Schema(description = "板材大小", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "板材大小", example = "0") private Double size; - @Schema(description = "下一工序 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24046") + @Schema(description = "下一工序 ID", example = "24046") private Long nextStepId; private Long organId; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsPageReqVO.java index c8fa59f13..c1bc9075d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsPageReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsPageReqVO.java @@ -30,6 +30,9 @@ public class RawGoodsPageReqVO extends PageParam { @Schema(description = "颜色") private String color; + @Schema(description = "纹路") + private Integer texture; + @Schema(description = "厚度") private Double thickness; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsRespVO.java index 92819fe9f..43da8a906 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsRespVO.java @@ -37,6 +37,10 @@ public class RawGoodsRespVO { @ExcelProperty("颜色") private String color; + @Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("纹路") + private Integer texture; + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("厚度") private Double thickness; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsSaveReqVO.java index 3e082b742..b1f7beb7d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/rawgoods/vo/RawGoodsSaveReqVO.java @@ -32,6 +32,9 @@ public class RawGoodsSaveReqVO { @NotEmpty(message = "颜色不能为空") private String color; + @Schema(description = "纹路") + private Integer texture; + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "厚度不能为空") private Double thickness; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java index adb09c355..57cd946c6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/GoodsDO.java @@ -53,6 +53,10 @@ public class GoodsDO extends BaseDO { * 材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板 */ private String material; + /** + * 纹路 0 正纹 1 可翻转 2 反纹 + */ + private Integer texture; /** * 颜色 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/rawgoods/RawGoodsDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/rawgoods/RawGoodsDO.java index 6c063cb34..7b0318bda 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/rawgoods/RawGoodsDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/rawgoods/RawGoodsDO.java @@ -51,6 +51,10 @@ public class RawGoodsDO extends BaseDO { * 颜色 */ private String color; + /** + * 纹路 0 正纹 1 可翻转 2 反纹 + */ + private Integer texture; /** * 厚度 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index cb8747cec..e2b6eea0e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -32,6 +32,7 @@ public interface OrderMapper extends BaseMapperX { .eqIfPresent(OrderDO::getParentNo, reqVO.getParentNo()) .betweenIfPresent(OrderDO::getDeliveryDate, reqVO.getDeliveryDate()) .betweenIfPresent(OrderDO::getOrderDate, reqVO.getOrderDate()) + .eqIfPresent(OrderDO::getId, reqVO.getId()) .eqIfPresent(OrderDO::getOrderType, reqVO.getOrderType()) .eqIfPresent(OrderDO::getOrderSort, reqVO.getOrderSort()) .eqIfPresent(OrderDO::getDataType, reqVO.getDataType()) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java index 67831608e..4397da790 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java @@ -62,5 +62,7 @@ public interface OrderPartsMapper extends BaseMapperX { IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId); - List selectPartGoodsList(@Param("orderId") Long orderId, @Param("organId") Long organId); + List selectPartDetail(@Param("orderId") Long orderId, @Param("organId") Long organId);// 配件明细 + + List selectPartAll(@Param("orderId") Long orderId, @Param("organId") Long organId);// 配件汇总 } \ 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 f43edbda2..23d6caeb8 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 @@ -17,6 +17,7 @@ import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import org.springframework.boot.system.ApplicationHome; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -156,7 +157,7 @@ public interface OrderService { /** * 打印/导出数据获取 */ - String getPrintData(OrderPageReqVO orderPageReqVO, String type); + void getPrintData(OrderPageReqVO orderPageReqVO, String type,HttpServletResponse response) throws IOException; default String getSavePath() { ApplicationHome applicationHome = new ApplicationHome(this.getClass()); 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 db813fd22..f3cb6ee4d 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 @@ -35,18 +35,22 @@ import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.dal.mysql.rawgoods.RawGoodsMapper; +import com.cf.imes.module.executor.util.ExcelWriterUtil; import com.cf.imes.module.executor.util.deviseData.dataTwo.PlateDetail; import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataProduction; 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.system.api.application.ApplicationApi; import com.cf.imes.module.system.api.dict.DictDataApi; +import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO; import com.cf.imes.module.system.api.user.AdminUserApi; +import com.cf.imes.module.system.enums.DictTypeConstants; import com.cf.imes.module.system.enums.ErrorCodeConstants; import org.springframework.boot.system.ApplicationHome; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.springframework.transaction.annotation.Transactional; @@ -72,6 +76,7 @@ import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.zip.ZipOutputStream; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; @@ -439,9 +444,11 @@ public class OrderServiceImpl implements OrderService { } } + DictDataRespDTO typographyDTO = dictDataApi.getDictData(DictTypeConstants.TYPOGRAPHY_TYPE, String.valueOf(goodsDO.getGoodsId())).getData();// 排版面 Long plateGoods = (Long) identifierGenerator.nextId(null); PlateGoodDO plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class) .setId(plateGoods) + .setTexture(typographyDTO.getLabel()) .setGoodsId(String.valueOf(goodsDO.getGoodsId())); goodsDO.setGoodsId(plateGoodDO.getId()); plateGoodLists.add(plateGoodDO); @@ -596,7 +603,7 @@ public class OrderServiceImpl implements OrderService { // 根据type获取文件名称 try { // path是指想要下载的文件的路径 - File file = new File(getSavePath()+ "\\" + value); + File file = new File(getSavePath() + "\\" + value); // 获取文件名 String filename = file.getName(); // 获取文件后缀名 @@ -623,30 +630,38 @@ public class OrderServiceImpl implements OrderService { } @Override - public String getPrintData(OrderPageReqVO orderPageReqVO, String type) { + public void getPrintData(OrderPageReqVO orderPageReqVO, String type, HttpServletResponse response) throws IOException { orderPageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); PageResult pageResult = orderMapper.selectPage(orderPageReqVO.setOrganId(SecurityFrameworkUtils.getLoginUser().getOrganId())); List orderDOList = pageResult.getList(); if (orderDOList == null || orderDOList.size() < 0) { - throw exception(ORDER_NOT_EXISTS); + ExcelWriterUtil.writeErr(response, "生产单查找结果为空", getSavePath() + "\\" + "错误文件.xlsx"); } - List> list = new ArrayList<>(); + + Map map = new HashMap(); for (OrderDO orderDO : orderDOList) { - list.add(getDataByOrderIdAndType(orderDO, type)); + map.putAll(getDataByOrderIdAndType(orderDO, type)); } - return JSON.toJSONString(list); + ExcelWriterUtil.exportExcel(response, map, getSavePath() + "\\" + type, type); } // 根据ype 与 orderId获取相关信息 - public Map getDataByOrderIdAndType(OrderDO orderDO, String type) { - Map map = new HashMap<>(); - map.put("order", orderDO); + public Map getDataByOrderIdAndType(OrderDO orderDO, String type) { + Map map = new HashMap<>(); switch (type) { - case "001":// 板材明细 - map.put("plateGoods", plateMapper.selectPlateGoodsList(orderDO.getId(),SecurityFrameworkUtils.getLoginUser().getOrganId())); + case "配件明细1-模板.xlsx":// 配件明细 + map.put(orderDO, orderPartsMapper.selectPartDetail(orderDO.getId(), SecurityFrameworkUtils.getLoginUser().getOrganId())); break; - case "002":// 配件明细 - map.put("partGoods", orderPartsMapper.selectPartGoodsList(orderDO.getId(),SecurityFrameworkUtils.getLoginUser().getOrganId())); + case "配件汇总1-模板.xlsx":// 配件汇总 + map.put(orderDO, orderPartsMapper.selectPartAll(orderDO.getId(), SecurityFrameworkUtils.getLoginUser().getOrganId())); + break; + case "板材明细-按房间-模板.xlsx":// + break; + case "板材明细-按板材-模板.xlsx":// + break; + case "板材汇总-按房间-模板.xlsx":// + break; + case "板材汇总-按板材-模板.xlsx":// break; default: // 处理默认情况,可以选择忽略或者做其他处理 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 new file mode 100644 index 000000000..0b8de12aa --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ExcelWriterUtil.java @@ -0,0 +1,160 @@ +package com.cf.imes.module.executor.util; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.util.ResourceUtils; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * excel 文件写入 + */ +public class ExcelWriterUtil { + + // 写excel + public static void write(HttpServletResponse response, + Map orderMap, + List list, + String filePathErr) throws IOException { + + //输入流 + InputStream inputStream = ResourceUtils.getURL(filePathErr).openStream(); + ServletOutputStream outputStream = response.getOutputStream(); + + + //设置输出流和模板信息 + ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + //开启自动换行,自动换行表示每次写入一条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(list, fillConfig, writeSheet); + + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + //关流 + excelWriter.finish(); + inputStream.close(); + outputStream.close(); + } + + // 写excel + public static void writeErr(HttpServletResponse response, + String err, + String filePathErr) throws IOException { + //输入流 + InputStream inputStream = ResourceUtils.getURL(filePathErr).openStream(); + ServletOutputStream outputStream = response.getOutputStream(); + + //设置输出流和模板信息 + ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + //准备单组和数据 + Map map = new HashMap<>(); + map.put("err", err); + + excelWriter.fill(map, writeSheet); + + + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + //关流 + excelWriter.finish(); + inputStream.close(); + outputStream.close(); + } + + public static void exportExcel(HttpServletResponse response, Map map, String filePathErr, String type) throws IOException { + ServletOutputStream outputStream = response.getOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); + + try { + for (Map.Entry entry : map.entrySet()) { + OrderDO k = entry.getKey(); + Object value = entry.getValue(); + + // 创建ExcelWriter并填充数据 + InputStream inputStream = ResourceUtils.getURL(filePathErr).openStream(); + ExcelWriter excelWriter = EasyExcel.write(outputStream) + .withTemplate(inputStream) + .excelType(ExcelTypeEnum.XLS) + .build(); + + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + // 填充订单数据 + excelWriter.fill(fillOrderData(k), writeSheet); + // 填充列表数据 + excelWriter.fill(value, fillConfig(), writeSheet); + + // 写入ZipOutputStream + ZipEntry zipEntry = new ZipEntry(type + "_" + k.getId() + ".xls"); + zipOutputStream.putNextEntry(zipEntry); + Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook(); + workbook.write(zipOutputStream); + excelWriter.finish(); // 关闭ExcelWriter + + // 关闭输入流 + inputStream.close(); + } + } finally { + // 关闭流 + zipOutputStream.close(); + outputStream.close(); + } + } + + // 填充订单数据 + private static Map fillOrderData(OrderDO order) { + Map orderMap = new HashMap<>(); + orderMap.put("customOrderNo", order.getCustomOrderNo()); + orderMap.put("customer", order.getCustomer()); + orderMap.put("address", order.getAddress()); + orderMap.put("phoneNumber", order.getPhoneNumber()); + orderMap.put("remark", order.getRemark()); + orderMap.put("splitter", order.getSplitter()); + orderMap.put("salesman", order.getSalesman()); + orderMap.put("dealerPhoneNumber", order.getDealerPhoneNumber()); + orderMap.put("dealer", order.getDealer()); + orderMap.put("deliveryDate", order.getDeliveryDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + return orderMap; + } + + // 填充配置 + private static FillConfig fillConfig() { + return FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + } + +} 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 d87f2997f..bb5de1295 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 @@ -67,7 +67,7 @@ public class ApiTypeRealize { List order = new ArrayList<>(); order.add(orderDO); // 商品信息数据 信息以全 - Map> goodsInfoChange = rawGoodsInfoChange(dataGoods, orderId); + Map> goodsInfoChange = rawGoodsInfoChange(dataGoods, orderId, dataBlocks); // System.out.println(" goodsInfoChange " + goodsInfoChange); List goodsDO = (List) goodsInfoChange.get("goodsDOS").values().stream() .collect(Collectors.toList()); @@ -230,6 +230,22 @@ public class ApiTypeRealize { } + /** + * 板材数据转换成 Map + */ + public Map getBlocksDataByGoodsID(JSONObject dataBlocks) { + Map map = new HashMap<>(); + JSONArray ordersArray = dataBlocks.getJSONArray("List"); + if (ordersArray != null && !ordersArray.isEmpty()) { + for (int i = 0; i < ordersArray.size(); i++) { + JSONObject block = ordersArray.getJSONObject(i); + map.put(block.getInteger("GoodsID"), block); + } + } + return map; + } + + /** * raw商品信息转换 和 商品信息转换 * @@ -239,7 +255,7 @@ public class ApiTypeRealize { * @author Administrator * @date 2024/4/30 */ - public Map> rawGoodsInfoChange(JSONObject dataRawGoods, Long orderId) { + public Map> rawGoodsInfoChange(JSONObject dataRawGoods, Long orderId , JSONObject dataBlocks) { Map> map = new HashMap<>(); Map rawGoodsDOS = new HashMap<>(); Map goodsDOS = new HashMap<>(); @@ -257,6 +273,7 @@ public class ApiTypeRealize { .goodsName(goods.getString("GoodsName")) .material(goods.getString("Material")) .color(goods.getString("Color")) + .texture(goods.getInteger("Wave")) .thickness(goods.getDouble("Thickness")) .price(goods.getDouble("Price")) .brand(goods.getString("Brand")) @@ -272,6 +289,7 @@ public class ApiTypeRealize { .goodsName(goods.getString("GoodsName")) .material(goods.getString("Material")) .color(goods.getString("Color")) + .texture(goods.getInteger("Wave")) .width(BigDecimal.valueOf(goods.getDouble("Width"))) .height(BigDecimal.valueOf(goods.getDouble("Height"))) .thickness(BigDecimal.valueOf(goods.getDouble("Thickness"))) 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/MultiThreadingConfig.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/MultiThreadingConfig.java index a434f0de4..1371d3016 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/MultiThreadingConfig.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/MultiThreadingConfig.java @@ -1,48 +1,48 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad; - -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurer; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * @Description: 配置类实现AsyncConfigurer接口,并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor, - * 这样我们就获得一个基于线程池TaskExecutor - * 利用@EnableAsync注解开启异步任务支持 - * @ClassName: MultiThreadingConfig - * @Author: xiaolege - */ -@Configuration -@ComponentScan("com.cf.imes.module.executor.service.order") -@EnableAsync -public class MultiThreadingConfig implements AsyncConfigurer { - - @Override - public Executor getAsyncExecutor() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - //最小线程数 - taskExecutor.setCorePoolSize(5); - //最大线程数 - taskExecutor.setMaxPoolSize(10); - //等待队列 - taskExecutor.setQueueCapacity(50); - taskExecutor.setKeepAliveSeconds(600); - //设置拒绝策略 - taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - //等待所有任务结束后再关闭线程池 -// taskExecutor.setWaitForTasksToCompleteOnShutdown(true); - taskExecutor.initialize(); - return taskExecutor; - } - - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler(); - } - -} +//package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad; +// +//import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +//import org.springframework.context.annotation.ComponentScan; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.annotation.AsyncConfigurer; +//import org.springframework.scheduling.annotation.EnableAsync; +//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +// +//import java.util.concurrent.Executor; +//import java.util.concurrent.ThreadPoolExecutor; +// +///** +// * @Description: 配置类实现AsyncConfigurer接口,并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor, +// * 这样我们就获得一个基于线程池TaskExecutor +// * 利用@EnableAsync注解开启异步任务支持 +// * @ClassName: MultiThreadingConfig +// * @Author: xiaolege +// */ +//@Configuration +//@ComponentScan("com.cf.imes.module.executor.service.order") +//@EnableAsync +//public class MultiThreadingConfig implements AsyncConfigurer { +// +// @Override +// public Executor getAsyncExecutor() { +// ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); +// //最小线程数 +// taskExecutor.setCorePoolSize(5); +// //最大线程数 +// taskExecutor.setMaxPoolSize(10); +// //等待队列 +// taskExecutor.setQueueCapacity(50); +// taskExecutor.setKeepAliveSeconds(600); +// //设置拒绝策略 +// taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); +// //等待所有任务结束后再关闭线程池 +//// taskExecutor.setWaitForTasksToCompleteOnShutdown(true); +// taskExecutor.initialize(); +// return taskExecutor; +// } +// +// @Override +// public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { +// return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler(); +// } +// +//} 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 f8735c695..703f60207 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 @@ -7,7 +7,6 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.alibaba.nacos.common.utils.DateFormatUtils; 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; @@ -15,11 +14,6 @@ import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO; import com.cf.imes.module.system.enums.DictTypeConstants; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.hssf.usermodel.HSSFDateUtil; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Component; import org.springframework.util.ResourceUtils; import org.springframework.web.multipart.MultipartFile; @@ -28,24 +22,15 @@ import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; -import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS; - @Slf4j @Component public class ExcelReadUtil { // 文件读取 - - private String value; - private Boolean index = true; private int isErr; @@ -71,7 +56,6 @@ public class ExcelReadUtil { // 文件读取 index = false; } if (index) { - System.out.println(item); orderMap.put(item.get(0), item.get(1)); orderMap.put(item.get(12), item.get(13)); } else { @@ -84,9 +68,8 @@ public class ExcelReadUtil { // 文件读取 ); index = true; map.put("order", orderMap); - System.err.println(map.get("order")); if (orderMap.size() == 0) - throw exception(ORDER_NOT_EXISTS); + isErr = -1; map.put("plate", list); return map; @@ -126,48 +109,6 @@ public class ExcelReadUtil { // 文件读取 return dateTime; } - // 写excel - public void write(HttpServletResponse response, - Map orderMap, - List list, - String filePathErr) throws IOException { - //输入流 -// InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("templates/生产单新增Excel模板.xlsx"); - InputStream inputStream = ResourceUtils.getURL(filePathErr).openStream(); - ServletOutputStream outputStream = response.getOutputStream(); - - - //设置输出流和模板信息 - ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build(); - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - - //开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true - FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); - //列表 - excelWriter.fill(list, fillConfig, writeSheet); - - //准备单组和数据 - Map map = new HashMap<>(); - map.put("customOrderNo", (String) orderMap.get("customOrderNo")); - map.put("customer", (String) orderMap.get("customer")); - map.put("address", (String) orderMap.get("address")); - map.put("phoneNumber", (String) orderMap.get("phoneNumber")); - map.put("remark", (String) orderMap.get("remark")); - map.put("splitter", (String) orderMap.get("splitter")); - map.put("salesman", (String) orderMap.get("salesman")); - map.put("dealerPhoneNumber", (String) orderMap.get("dealerPhoneNumber")); - map.put("dealer", (String) orderMap.get("dealer")); - - excelWriter.fill(map, writeSheet); - -// response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse"); - response.setContentType("application/vnd.ms-excel;charset=UTF-8"); - //关流 - excelWriter.finish(); - inputStream.close(); - outputStream.close(); - } - // 赋值单元格数据 private OrderPlateImportExcelVO changeValue(Map dataMap) { OrderPlateImportExcelVO vo = new OrderPlateImportExcelVO(); 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 eca1493dd..c436e4fec 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 @@ -41,7 +41,8 @@ public class ExcelTypeRealize { // 数据转换 + 错误验证 public Map> changeDate(List list, Long orderId) { if (list.isEmpty()){ - throw exception(FILE_UPLOAD_ERR); +// throw exception(FILE_UPLOAD_ERR); + return null; } List excelVOS = (List) list; @@ -253,12 +254,12 @@ public class ExcelTypeRealize { .goodsName(excelVO.getGoodsName()) .material(excelVO.getMaterial()) .color(excelVO.getColor()) - .texture("") .width(Double.valueOf(excelVO.getWidth())) .height(Double.valueOf(excelVO.getHeight())) .thickness(Double.valueOf(excelVO.getThickness())) .spec(excelVO.getSpec()) .brand(excelVO.getBrand()) + .texture(excelVO.getTexture()) // .organId(organId) .build(); } @@ -275,6 +276,7 @@ public class ExcelTypeRealize { .thickness(Double.valueOf(excelVO.getThickness())) .spec(excelVO.getSpec()) .brand(excelVO.getBrand()) + .texture(Integer.valueOf(excelVO.getTexture())) .build(); } 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/OrderPlateImportExcelVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java index feeb6c77f..94a35727a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java @@ -30,9 +30,8 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String ordinal; - @ExcelProperty(value = "类型", converter = DictConvert.class) + @ExcelProperty(value = "类型") @JsonIgnore - @DictFormat(DictTypeConstants.PRODUCT_TYPE) private String goodType; @ExcelProperty(value = "物料编码") @@ -86,9 +85,8 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String cabinetsName; - @ExcelProperty(value = "加工组类型", converter = DictConvert.class) + @ExcelProperty(value = "加工组类型") @JsonIgnore - @DictFormat(DictTypeConstants.SYNTHESIS_TYPE) private String synthesis; @JsonIgnore @@ -143,19 +141,16 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String sealDown; - @ExcelProperty(value = "排版面", converter = DictConvert.class) + @ExcelProperty(value = "排版面") @JsonIgnore - @DictFormat(DictTypeConstants.TYPOGRAPHY_TYPE) private String typographicFace; - @ExcelProperty(value = "纹路", converter = DictConvert.class) + @ExcelProperty(value = "纹路") @JsonIgnore - @DictFormat(DictTypeConstants.GRAIN_TYPE) private String texture; - @ExcelProperty(value = "开门方向", converter = DictConvert.class) + @ExcelProperty(value = "开门方向") @JsonIgnore - @DictFormat(DictTypeConstants.DOOR_OPENING_DIRECTIONS) private String openDoorType; @ExcelProperty(value = "上传结果") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index 401e134bf..e9fadbb12 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -14,15 +14,37 @@ - + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 863bab12c..756544005 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -307,6 +307,7 @@ left join order_goods ogs on op.goods_id = ogs.id left join order_item its on op.id = its.plate_id left join order_body bdy on bdy.id = its.body_id + left join order_goods gods on gods.id = op.goods_id where op.order_id = #{orderId} and op.organ_id = #{organId} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材明细-按房间-模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材明细-按房间-模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f465f5a156183d71f25f97d9b7cc6683d0d3d179 GIT binary patch literal 10927 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

71q2;Qwux?d8S#~r8c|ik6w}a? zDZ;Fo?b{My@Fm+y-d#3X5)O^O`^Z_lI`)3}My+uWo@dp$P=tem7LtN*=0l4}OquvA z(Qx!G+DTV9`a0;CpZBMEiOGXwo$Y&!O%wia$p_u3ZG*YUG(u`p2q(JCCk^wO4l{7b z1azY-V(s(bGO*Zt2?7+z5!&DjT`BV@lm;;@S9SRy5_={B;IQ}$@q6`GAmr}^;o&w% zO46%qPYR8fKn?Nmj?VTzFA45GkKY=FVVo)7x3ziU$;%Pe9!W#3-T7+$=w?@IwiD7l zy1wKr`kHv%s6@|eV*K?TLQZ^B^oviKiA8HaUF(JTX>KT~rV@b+@wFMB2KNhk1b^Nj zO!r?rQR=a2iEZPbz9Bus14VQy zoOTG(Aa5c%U3M}a(CRk~uHqbRue@2CH&Ml`28NniMyp9SCXz&>3EV;@Box3gxT^!j zxZ!+=Q7TR7-5aruD;SC5Y8VrvNw24bG6G6P3F)x%fY@jZ6WgMgqv{d1U*gB>~ahY1Vl=&!6k-rn6wJA7T#RCZNwt@mKK8->DNjI0+P7VhHu(UTK= zU4mEQ{{(sH_Kq+Fr?FR4f2o4Sx7^S733O(A3{~6A^Wu6x486}Me9CDp2D{5RU{RDU zs|`WGwe0&=#u{hw(6pI}2kWK0OZ?Is1nAGe0DzH=y2kZr8b)wOBW z<+oT{YKLrz16ug25w5$Xh%X-!>p!w|+^-rhqQCand{tFWXP5>+$p4{63!?wAXc)r< zxSqhDM4cVLWd7Q1>*Ck1m+_(iS=tkTxGv+4X2{5TdC%ywm4KK2;e2+7xo0x7`oOE# z)cPjB0PzFnr!Mc)PAd*Q-s^R2&@~GkV@KUte>Zzy3-(7^2`}x#eP%N!Z~j zTmfZ;;$v(T#ymj8dSU;pe;F5M-85Ci;MI$_ex5$>%Rjgm({P4;bdJjsWs5ozXo`rB z%Hxn*Lr;)v(0b`TjQ3ckz~+6YbMc?VKO__rIF|eOmgGNK_4~JfX;4;>`8&Yh8zlb< zPzyG+e`%L|PWZe{>`&64;Ks3MO=HiA|K4NsCn*HPPq3@`|L?eYj`O_n;!h-el>bcP zA8i=VQJ&XN{zUlzj+()yD*1CB{A*b99Pqhc|0f_iIM4yJm-mPW&2%3jUab^&pP%*WLdEpwr@; literal 0 HcmV?d00001 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材汇总-按房间-模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/板材汇总-按房间-模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b72c7c80ed71104ec66618f8f15422f67a8534e8 GIT binary patch literal 10404 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 j>v`qD5dH4N& z&d$u4{i*?yAs!{|%LLq=Xw=nrH!q4abH29|rQwI}8CkIDoX2mBM=F<(hpRm%& zFS&x?U|@U@U|?u}hZ#9KGI`k9W+&9hK(S(qdv*E2?Yq~ugbyYTk%iCmte3ftv@Rfz zP`o}TaH}}9{SF4r2&F@hh~*~%E7UWBvm^G44)q!t6$P3Rx=v!!WyOd+jqmv^@7=L zjGjI7k)l%dYLgi&6qp4|mU+`^VHS9bwlC%J4KbS-k2>!()h=#<`yb#s108V0i&AKkG$4?n|0O`y-?#~Y}Ba-G8ZqLkx_Yw;(p(f`i1iG!2bGubf- zdI~)xn4u?f52(o3jCI*jq>NF-3n>8EtO*avbr3nW4A{}tiJ6{;#kX$2xgdY*t|Ft` zM>)YR&zTJTZ9EZp+zDy3clZKTY5N>9-s=+Q4Qz@)0gpPvG@O)bRTmT@J&P`AXu$}o z&C+U)#ZW`qetlaJ=UnmbUdJh((bxPRVRV>QJt3P&Ok+8qm^{~SNMw&p#em9@(pEyc zd~gMwvW@aMS+PcKBSLP;nP6t{TiY`Q6KO<@LW}++f8;hlU;cZDe{$S+ zd&T_YiCe!Xo?rZfV^?Pv2fLrIbo`h?5DRYT3Dpl&xs$@eP-M7jI9nXlciisOg|>2g zadps?{f{e&`>kFN=f0ljtqwK!@#N{vuA=1_{pbPy^hI9pKT~@15h)@BTx1`#DADV8 zhwwF(AD=|xlp{ClJHkSUHe=|wa`E)X>NOqeVj5#5is&rdIxe!!_K@H@aAZ(9%Y1#+^cdI)8pDK`8B+Ydf5~HbA94E@!^H0kXP!lF+|G)pj#8o`=77>Xi%imJ zL#LlsfFD*FM3w#AcA3L7UH|SSAfM>+u>I*D{vCkw3*heHWaDgUX6EvzFF}@8f~JH8 z1EV7b1H=74*qvE&4lKnp!lNpa6>GLSZ`vQ)6W_&$yWs=n8RpS|_*pQ-Vsks9#jC@ST{&M8v)Pd{HXf1T_OfA6 z$kLtXYL-pnk!JBZcOy>JcI!xF(hwu}rI)Shy-&i6j!y;vC+p^fcLcTA4-P1O%?Y#Z zC#z--8WuR=YIkgo6T6Jr0$;IjHLyMPIA+?jx7B!dD>rC}cTi=r%wmyZD9T3;(&jE; zS-eBnb0SS9ei&}Zgh?$eHS03f4mW3PQ*ZQI}w6KItzVur0T+L^CV1oPdrHa4~q} zqTe0P?EtrJkK(3bR37x=0ceuA1dO>OLZ zc{X^~#Oc?V%0l~Srtp4k1AQ5B(e*}8kl8c|jch)_=jyF(+rdr6e0^B`t)a}7g=>WL znYU$EMkd|`Ul_Zs`l(eiv>ri`lKEP5RqORiH0->zEos2l5CBN$K%cq^9imC5YhXdS z)`?!sF@?;=+=@&J`~s#@*@dm8IVsjT?IakkQq)DL1vVz3_V!fnrlbiDF$XWSd=IjX z`dhqcQCRu7(0HA!YmH&rMrkm!UNOC|mfnwjQ}mtzC$94n9%4Sui#^a9=-|M(GZxHe zA8jcrAa13p2gGaP!dy$>fsgd^=nPJe<`weZ9GK4%gZc$mx<#{Mld_29JGV2J^{*u3 zA|*jmur(+cgay3wD4hft<7VJH)R}uMvUv0D`x|Qh&xJ#O4oWB6_zW||aCS-<|GZ5_>#9L0# z-alM|n*&d{Tqf^%;kf--4{Z5M6yTd70uM01^DB1;M11OQ&emF)on+S0bT{_wv8UKfh!Ef#nGwMC{>!F7add^GNa zx>nis0*Zg4(fpR#&PPV0cpA%D^XNiG33su4Msf$S{HjFshz7Vo^axI$o~Oe#8ADC| z`#4F8MJZ}>3_F6Ur+YF>=+e1*X6fr1p4RD>_3fMkIGCAg$7&(&Y8wV>P#RbpYT_keQq-EqmfmGRZJj9SvUmUtm#zBORAWgnYN}nUtS-Y++76A+?hS${fj}xd(ktN95y?qtY!fAd(Q2 z0GA+@K$l>ZfR`v0V~}bPvBN3=F(b-E3^jT3z`>ZtGacm*#Kgy`{TyveFu$kSdW=fD{mIzPN)1GYN=^&}1EK-pfVe;?plZI+a`#L^ z(|gWr0tfvTy3LsQ0euwOg|j~m>JmN~?07Qh`E1aFbn9QNaZQURy}9@VhcK7dm#e{|$Ehm0s=x1nW z=~L%adt0N+x*X|j7ywrPhfxj#p+|1m?Pd_<3A990z2jcTS_1Y z7xG@lY8+mdiyp?fhV5}XgvL(w?eS6g#!eXMF+7_9Mp$_at>IPxF2TqIaA@trT{AaF zf5M@WEjHWRP}K_+e%~o|3(jf`~d@8Mgk^*d>EYpM*1!e2T@HijT|AGPvr zuRg&3|LgSgZvJVVcCj?GGy7vVFH4v@z61>hMuPWi_wyI*C-~>$d!!}j@RAFy4QJ0! z^RO+!^eg!*GS~*eFH~+AVlt5grFzzB=B#(zD41%Hicf93 zJpw7bx0NWj_Mjf9>OQDdaMHt*m7WyRfHyW$y}&T^bKhuC=yInE!H1(ErYrU!d?{~( zK)RC;Xm*db90vknT;51*8%C$cKJO8srJE$nexJva zor$_)?&al<{=NZZiSEFq&Uf<;t-C2OOsML~tf>9knzhvv4g?VRCm~+%Ywfn9cOhI4 z4pnbfZA$zQt3;X~@9=$D_CzrmTVb|u`tjTK9qe4cV(SMvc{?Mol^tImFg~GJDfeBF z_3YRiTcT!CJi_Sc-CISH+0g0e960VF(}9j0(s^`1Rh7ZR&0Qbc$z@b=aa>NW z;NAAOv&|_`>gqK)#Cj+^@>g|?0ypX-Am4f|G>vyR7a3l1H=`!L;t+OOW; zUQP++2>INO?)v>W?FC=kw6yJ(r0D8yiBM?eV+g3<@0=ewOYg|&qmk(SAk2E>)^t2P z53!m>e$ahn!sl_#EftRFVRzN}g*Wq{>L5v#;Co;%EX=)2+YQ_EC|GD&gBp65``J;t5Y<@@5K^w6WK{=@ExD zR$LO&JKZSK_?h!@eV8(so{bqUU2*AcuczGyA!WFV?uok8KaODsw&Z0|6`BQPj^Gf1Yq$I$o7?Cy!_=9!l$4dExAzA(|;PH6T#N3ftz@&>$b zJPC)5Z%W)=$r^5u#n#0PWIO~9df)<)fr?i}UyB}t? z%1d9GGZ8@yZF|%!#rDLA?ChD_cqY-U*fb=xpE1GFEOC(<$(kq4yTw~F!l=c6`;H&D zL-JnZN?o&#kb#N*I!d*o2F%(_eLZ-qtGR5G>%b5~!qH9?GmK8bvkYfpX2?4;V--`j z9HQ)08Cc?PR;SvEU6ra znm6qrMaczRmu)rRXg4~^ z)3iWAwMORxzvci*ai>$0w5BmPUGdc4=|wNLnbdT$m1Gx7&(rrzds+V#efKp9Tl4^H7#%{Iq!Y|;Oz~Hl2qR9YTQWRSP zRm0}>Rco4aeWN|WHNk%6_O;!Z-KS6HTB!_;N3OQld9)qQOY^J27 zMXoA6`n7~rl7Y3gP78y_jZVbXdAN=}!nKd&Lxq}{JLQF^D+~(N<~ZEPT=u3HbJVwC z(~tM((jI6T=+3!!9IqHIuMug1J1U{t$wd)2lJdyWQncsCSL$=l8A&tv9vQj|s|OwQ zD;$L3LLnX{M?5*q&}b6tW^emAywp7gP7gJz^!fAM3E%k==QC4GyEw)4>$_Ntxe4Uz zGK9S9e!SnR)Wk0wN_3lQl#_frP)|zEuwS8L=|6uDdoQ=(-|^}J zy%edgd`MVuD4tbgfT4$h;x&PFnrKWEb8wbsudYZ7h#jF9n$1ExwLffGjq&9=zxZT6 z90jXA?gf^WMHC2cD+ypKFP6lR)1Z*tM;ouNrwN3%RNu8)5Dfhw&+V+{_PHi80BCM0 zVOLpX1_z0jGBnx3QjEuC({h2;&m)JHIE*djUChY8k>4#_8(yD&;l31t@1MmZFld*0UuHZ(+q!jUG|9>C=}oilgkS_f>X$@~?U)*(dKq z>6dgQ&CxX5Z8{?`3D*R90^1uAUkm1|)3!SFufVo@=9f&zdPDh))$oZ$1z{hNP`3ek zEbGIUzwf~=9cd0=BY~IK4d{y^?5Z)Tsh7_#>bwJ~18WGhDh_gL*jrQ~1rZzQ>2jk& znK4v!VmZ{b5NuzqDXoIo*A>dS%B+Ev$yOMQEO+E=X%sLSr2#4RGKKm|_+^z0Lzz;( z$XjzM)@}L@d+$Wchaik%5f(=gZW*Wx@EHo!16|Gf&eOJ(d*+v{7(T{Ce!wh3-K48o zK8@MxK{}P$CcoFfm~?sg*h!awxjECVYhtgDJ`(Z0JhdaSA9tez-F?h|ZZlA@1SnzDw#cnOQ2zD9`L>|n_xB19D|Ea4LWsqR!jkFqSfpMpyFD;kgo=k|JhrKZyh;*Dy|`GMulOukjawHjga zuA}!vIBMjqB-j(RyjOW#jAW%ny!#gi9BsN&^wudT)1A73UA7A~XrK2=bXtIksQa_2 zaN6i2JhUZ%5=kcvxX$eN)BLukNk2U8#4vAd#h`ee&YpHq)Dej!{k~+fNfEf|#=sX{ z&Jj4AxtTZsu>@3rSp18pGtRK>INECw_3!`*_9?f|6zH0~NmNx8Y+tAHHubyBeOG+;B4&gO((z)i8a4~Viz!fJF1E5wr{tF2yzp4 zUr6q1jVg;oQydaZhl7A-=)?{F=xZ^))aV^_+-gL}paFosQ>jTEuQ!tEh7VB$Z9(Ks ziF`TSqYX~$VU+($5I-JeS{a%*>Uf#BnQ(X>`2hw6v7kWyI=3QwN{KYoPDdO9b4CW* z3O>xU&7Ps9_4Oi1Izn{4te{$gR?XBg;nNn&WV#IxDKr}$*4h*N)z@v$Nfm9blsV=ODL}P3O?fpxjVj)(zz1uHIWdMNs=Ri@WLR|!gaR@;oq}Li z!VL<@e&b}u5@bAH{9zZ4{u<5is`*;%aA7I;6c!{t>9tRQ!9Mc{hy^t2SH;tll38%H zSR8x^y9$~ons}-n2;f9L!YB;N4NiKbiqRoj33aMq9o&c9lt5~eo$CGC7cH5!R3ML|3V`e7wh6yLETcU5oVZhXqiwAl*dr|wcmlFr zd{-CQH=wK+bvO|jMfvHhUW&+7ppL=5Sqz1GbR56H;|a0~T zDu(9dkjIFAymYyFC|;v~Bq<_o14z6kCeJQV8a7DcEZD%wjeGR<`_?kGQ9H1k>&^aS z+XACN6Ale;oQ+ER=0~(gu4%!+%{Fi&h?*5To(v(KOJRnih=fp-S|M7aECny{Vt~b zV|(2=*s@?+*`@Ru(8jVZtWA%;jz9Lc_vRub2m8szD8Frd6>5cYk@UMKQBOMt8t3nk z1E)&7IR)>}AI=uOqOQGEklubR3HNm`*N;cYM+ki=45ft8pA(B54JVX=u$pC*!$>n) zP*C7;>l!0iU#vGw`G)(npl#E_kLbsak5ux6q@Ntz?Po9X}_`+&}Hnt+7LEH+%D1QFrngBUT+Y%e2Q!%)Re zs>IPU6k6-E-7lx%LbZAb*pHH7*21J^rGB&-F=P$%d*oP?~W*!jX{a4;%ix&n55 zv|t<8-Dc88&l(ExGO^EtxahDXDh)%PT*ag?ftr-Su79&V0 zCqSo#4nkmX6S=%M1^*!Z(6gk^0+~M05l$41Ol%64=PzfiGcbR82E(QZ!C6{Dv5|jv zhTT44KIvDw$in$TiJBo8!ZC>#Jca`XXBs1&+%R4h&QgRGa{hwJFg_C2q-TJdf0)!T z>E|VbZ9jH3dU}!={X%<8SsD`*yBcbLXq=WFoQ?IZne9#bOb9Iv3pK4xyj>Pg_p&rc zSj`5op3KFmjOXcTDzFYrIl18V?mL5F8TMa@Nv{!oDK~K)4S2CE?`!+%@P_fOm*Pg? z<5#=;N*qOOxeUS%X(D{&OuO_euUb@8?(RnR)1#t?&9-c96ZbJiu7mCDyUd_U4Ds;*^?+X?2(_rfRUN?ND3u&-7Fz*-|8PafUXdcCFrR-Sqd-Zr5%3bWxlX?l` zZi$ADLr6RmA0jPa4Yf5Q&TPQ%cZ#W%d|R;5NEWE~4MoM}V5MVM@e@ORsv-^to=xsN zX9d@ry(wTxOvJ0IeEB`L%SE1AtCpbeFm}cx-KpQJ)xC_ve1+rH;ywm9@13!J_(nPto4W$Y;^a-3yJ=XwAJCRm6$6Xl)EN z>d*v5tC8KJ+}3?b`r@ss>)^ok(s`i^6KL?|6-PnzSl<}*ho=;N;Po^>k8CM{^4GEALZI4Vy zAY*RUAs4iQ0hJyjF>O^2N^3szRbkUh#@r*>Gc1 zCEsMXEK7&1L@6aIr#_-IpVKT_&0!okf*KR2C*gF2WYEi_i>9ms@viE1;xp-tLHm~c zR-T8bKtu?w6&cyx54Sh=f~%QhjXRh0ed|l0)IE#v9disWU)oT@J;#>yGEL7(rj@QU zkHjklLP45G@c%yo3G+m?fs>i-p9w%OZnxIQr~lTT65NP?VVItg6^Uaqy)0<`Kj&Dx zoI4i!f(tX*p`59Yf4c1BIMs_pt)uof5haG{kFaqWw>z0@-li=tS4i|(i(*>?U6lfb z9R}Unl}^1qG*<$pKy5RSo~n-BP%Q`N#`nQNJN(IuOcV)v-pb>z!uV*DtS0tV6@_#8 zIK+#2giOeTINR(M?LVDM^yd;O%JKKD(uI4qz`WrOX}xuDDEs<(T_6MadW?;JOEn?e z)ixe0I>;M1-+^{14g2C6V;L>AW#Nmq$n-q!7S!;mqcD^DCrnKybX zJTam<^M)=|BcS=(|p{cCmKIK z(TV?be)3(vV9y!Y|GeY>Vb{8c1*!ies4Zy1=gnjct3? zcksPdo=ci8Qf_d^3H9*OO7qDyDwVYfi=rtH4HDBG=QK<^$_XlSUbx+9LlpSaw{123 z$w>q8yjCh;x(<@|4ZLZd5s`j9)tsRNZ4@NTzAEcws(6t$>MWsM%-f{hG2ZW&{!SaE zSF6H{_tc7EZ{oKe+f3BzQP%SBk6BMs;N)WD_JnwbJSh4(X9i)gw`Idc48lBhu|fyr z^_`2-zg66fzB^;!>*n!Ee9If9gVgs9sW?4$n&f=s4Q+xgfENe1?dHw)A0h9OGi_&! zr|FOU6!v~j`0KoOuy--DcQH`)bTo6;dv*gA$;0vxteBzKRP8+lI&3PAM$txw8)l^x zUm&NiI@!Oa<^-Nz<gAAeD`#jUa}w}(sWQmY*;0qH185>N zwqS`IGdWksB?M7zmkF~lKURdX1w`asO8s{oI-J3@cA!p&2X2e6FFsfI)X`pkLOA-o zzRM`O=u@`8dfA@P(817p(RE?M`2eE`0EfW*xyb%1E&6k0o(2aD9E{}YxJUM{DE z;9vHr|1S2w)l`2{^k+rTZ|S6`SNbob|EUl9Q~b|jm*3*oPcGxP_+O9B>!Y7i}Y^}>dy!L(~~{h`NdMt-^KoqU;9(fpS!u=dSD6veQ)=t zhCidCzcqkk{L=7OjP$>e_0PV4ep>AQO11rI@z0#xZ;O|I7yF%|`%}T6o1EVYwuye) z{X1>{?V+FRcYd|!5tjTl!vCn|`RBX+XFboe?5|OC{y(z6t9ujy&_5?D`csV?>=VwP I;#uy004eqkIRF3v literal 0 HcmV?d00001 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件明细1-模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件明细1-模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0b0e00c8d381a89be7be692f939345cb7d4b1eb8 GIT binary patch literal 10993 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 literal 0 HcmV?d00001 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件汇总1-模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/配件汇总1-模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..07b3c5271d766cdb28977e0fd944e48a8f2ef6c4 GIT binary patch literal 11206 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 m*5BcOkBNVUM?Lxr{LcufricJtT>t