From 2e1c673be21fb14e41fc1a49fad8c0da35b4bdfa Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Tue, 11 Jun 2024 10:04:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=99=E6=96=99=E5=BA=93=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/enums/OrderStatusEnum.java | 24 +++++++ .../admin/order/OrderController.java | 23 +++++-- .../admin/orderParts/vo/PartGoodsRespVO.java | 3 + .../executor/dal/mysql/order/OrderMapper.java | 9 +++ .../executor/service/order/OrderService.java | 9 ++- .../service/order/OrderServiceImpl.java | 64 ++++++++++++++---- .../process/OrderProcessServiceImpl.java | 2 +- .../module/executor/util/ExcelWriterUtil.java | 42 +++++++++++- .../main/resources/mapper/plan/PlanMapper.xml | 2 +- .../type/生产单Excel导入错误导出模板.xlsx | Bin 24511 -> 24257 bytes .../main/resources/type/配件明细1-模板.xlsx | Bin 10993 -> 12218 bytes .../main/resources/type/配件汇总1-模板.xlsx | Bin 11206 -> 11220 bytes .../manage/enums/RemainPlateUseTypeEnum.java | 24 +++++++ .../admin/plate/RemainPlateController.java | 35 +++++----- .../plate/vo/remain/RemainPlatePageReqVO.java | 3 + .../plate/vo/remain/RemainPlateSaveReqVO.java | 12 ++-- .../plate/vo/remain/RemainPlateUptReqVO.java | 23 +++++++ .../remainplaten/RemainPlateService.java | 8 +++ .../remainplaten/RemainPlateServiceImpl.java | 24 +++++-- .../system/enums/ErrorCodeConstants.java | 1 + 20 files changed, 254 insertions(+), 54 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/OrderStatusEnum.java create mode 100644 cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/RemainPlateUseTypeEnum.java create mode 100644 cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/OrderStatusEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/OrderStatusEnum.java new file mode 100644 index 000000000..a931da8f2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/OrderStatusEnum.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrderStatusEnum { + EMPTY(0, "空生产单"), + NEW_ORDER(1, "新单"), + IN_PRODUCTION(2, "生产中"), + FINISH_PRODUCTION(3, "生产完成"); + + private final Integer status; + private String description; + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + public boolean equals(OrderStatusEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } +} 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 7ca0def77..4c44ec833 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 @@ -302,13 +302,26 @@ public class OrderController { return success(orderService.importTemplate(file,type)); } - @GetMapping("/printing") - @Operation(summary = "打印/导出") + @GetMapping("/printingZip") + @Operation(summary = "打印/导出(多文件)") @Parameter(name = "type", description = "文件类型", required = true, example = "0") @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); + public void getOrderPrintingZip(@Valid OrderPageReqVO pageReqVO, + @RequestParam("type") String type, + HttpServletResponse response) throws IOException { + orderService.getPrintDataZip(pageReqVO,type,response); + } + + @GetMapping("/printing") + @Operation(summary = "打印/导出(单文件)") + @Parameter(name = "type", description = "文件类型", required = true, example = "0") + @PreAuthorize("@ss.hasPermission('executor:order:query')") + @OperateLog(type = EXPORT) + public void getOrderPrinting( +// @RequestParam("orderId") Long orderId, + @RequestParam("type") String type, + HttpServletResponse response) throws IOException { + orderService.getPrintData(1797937673478864896L,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/orderParts/vo/PartGoodsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/orderParts/vo/PartGoodsRespVO.java index 00ecd8ed2..ea6002ac2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/orderParts/vo/PartGoodsRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/orderParts/vo/PartGoodsRespVO.java @@ -74,4 +74,7 @@ public class PartGoodsRespVO { @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "29507") private Double num; + + @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "29507") + private Double totalPrice; } 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 e2b6eea0e..c9e79cedb 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 @@ -114,4 +114,13 @@ public interface OrderMapper extends BaseMapperX { .eq(OrderDO::getDeleted, 0) .eq(OrderDO::getOrganId, organId)); } + + // 查询单个生产单 + default OrderDO selectOrderOne(Long id,Long organId) { + return selectOne(new LambdaQueryWrapper() + .select(OrderDO::getStatus) + .eq(OrderDO::getId, id) + .eq(OrderDO::getDeleted, 0) + .eq(OrderDO::getOrganId, organId)); + } } 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 23d6caeb8..1b7473ecc 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 @@ -155,9 +155,14 @@ public interface OrderService { void exportTemplate(HttpServletResponse response, String value); /** - * 打印/导出数据获取 + * 打印/导出数据获取 (多文件) */ - void getPrintData(OrderPageReqVO orderPageReqVO, String type,HttpServletResponse response) throws IOException; + void getPrintDataZip(OrderPageReqVO orderPageReqVO, String type,HttpServletResponse response) throws IOException; + + /** + * 打印/导出数据获取 (单文件) + */ + void getPrintData(Long orderId, 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 a9093cc00..4114db3e4 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,11 +35,13 @@ 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.enums.OrderStatusEnum; 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.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; 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; @@ -275,13 +277,14 @@ public class OrderServiceImpl implements OrderService { public void deleteBodyByOrder(Long orderId, Collection bodyIds) { validateOrderExists(orderId); // 校验生产单的状态 1 为新单状态,才可以修改 - if (orderMapper.selectOne(new LambdaQueryWrapper().eq(OrderDO::getId, orderId).eq(OrderDO::getStatus, 1)).getStatus() == 1) { + if (orderMapper.selectOrderOne(orderId, OrganContextHolder.getOrganId()).getStatus() != + OrderStatusEnum.NEW_ORDER.getStatus()) { throw exception(ORDER_STATUS_ERROR); } if (CollectionUtils.isNotEmpty(bodyIds)) { bodyIds.forEach(bodyId -> { // 校验存在 - validateOrderBodyExists(orderId, bodyId); + validateOrderBodyExists(orderId, bodyId, OrganContextHolder.getOrganId()); // 删除 orderBodyMapper.deleteAllByOrderId(orderId, bodyId); }); @@ -444,11 +447,9 @@ 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); @@ -458,15 +459,16 @@ public class OrderServiceImpl implements OrderService { return map; } - private void validateOrderBodyExists(Long orderId, Long bodyId) { - if (orderBodyMapper.selectCount(new LambdaQueryWrapper().eq(OrderBodyDO::getOrderId, orderId).eq(OrderBodyDO::getId, bodyId)) == 0) { + private void validateOrderBodyExists(Long orderId, Long bodyId, Long organId) { + if (orderBodyMapper.selectCount(new LambdaQueryWrapper() + .eq(OrderBodyDO::getOrderId, orderId) + .eq(OrderBodyDO::getId, bodyId) + .eq(OrderBodyDO::getOrganId, organId)) == 0) { throw exception(ORDER_BODY_NOT_EXISTS); } } private LocalDateTime getAfterDate(LocalDateTime date) { - // 获取当前日期类型 2024-03-06 16:50:15 - // 获取当前日期,明确指定时区为业务所在时区,例如Asia/Shanghai ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC")); LocalDateTime localDateTime = now.toLocalDateTime(); @@ -474,12 +476,10 @@ public class OrderServiceImpl implements OrderService { // 添加30天 LocalDateTime futureDate = localDateTime.plusDays(DEFAULT_DAYS_TO_ADD); try { - // 考虑到异常处理,使用try-catch块 return futureDate; } catch (DateTimeParseException e) { // 在实际应用中应该有更详细的错误处理逻辑 System.err.println("Error parsing future date: " + e.getMessage()); - // 根据业务需求,这里可以选择记录日志、抛出自定义异常或进行其他处理 } } return date; @@ -630,7 +630,7 @@ public class OrderServiceImpl implements OrderService { } @Override - public void getPrintData(OrderPageReqVO orderPageReqVO, String type, HttpServletResponse response) throws IOException { + public void getPrintDataZip(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(); @@ -642,7 +642,19 @@ public class OrderServiceImpl implements OrderService { for (OrderDO orderDO : orderDOList) { map.putAll(getDataByOrderIdAndType(orderDO, type)); } - ExcelWriterUtil.exportExcel(response, map, getSavePath() + "\\" + type, type); + ExcelWriterUtil.exportExcelZip(response, map, getSavePath() + "\\" + type, type); + } + + @Override + public void getPrintData(Long orderId, String type, HttpServletResponse response) throws IOException { + // 查询生产单 + OrderDO orderDO = orderMapper.selectById(orderId); + if (orderDO == null) { + ExcelWriterUtil.writeErr(response, "生产单查找结果为空", getSavePath() + "\\" + "错误文件.xlsx"); + } + + Map map = getDataByOrderIdAndType(orderId, type); + ExcelWriterUtil.exportExcel(response, orderDO, (List) map.get(orderDO.getId()), getSavePath(), type); } // 根据ype 与 orderId获取相关信息 @@ -673,6 +685,34 @@ public class OrderServiceImpl implements OrderService { return map; } + // 根据ype 与 orderId获取相关信息 + public Map getDataByOrderIdAndType(Long orderId, String type) { + Map map = new HashMap<>(); + switch (type) { + case "配件明细1-模板.xlsx":// 配件明细 + map.put(orderId, orderPartsMapper.selectPartDetail(orderId, SecurityFrameworkUtils.getLoginUser().getOrganId())); + break; + case "配件汇总1-模板.xlsx":// 配件汇总 + map.put(orderId, orderPartsMapper.selectPartAll(orderId, SecurityFrameworkUtils.getLoginUser().getOrganId())); + break; + case "板材明细-按房间-模板.xlsx": + break; + case "板材明细-按板材-模板.xlsx": + map.put(orderId, plateMapper.selectPlateGoodsList(orderId, SecurityFrameworkUtils.getLoginUser().getOrganId())); + + break; + case "板材汇总-按房间-模板.xlsx": + break; + case "板材汇总-按板材-模板.xlsx": + map.put(orderId, plateMapper.selectPlateGoodsList(orderId, SecurityFrameworkUtils.getLoginUser().getOrganId())); + break; + default: + // 处理默认情况,可以选择忽略或者做其他处理 + break; + } + return map; + } + public String getRandomNumber(int length) { StringBuilder sb = new StringBuilder(); Random random = new Random(); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java index 928a6777f..6a6490176 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java @@ -69,7 +69,7 @@ public class OrderProcessServiceImpl implements OrderProcessService { private OrderBodyMapper orderBodyMapper; @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Long createOrderProcess(OrderProcessSaveReqVO createReqVO) { // 当生产不为删除时,校验生产单存在 if (orderMapper.selectOrder(createReqVO.getOrderId(), SecurityFrameworkUtils.getLoginUser().getOrganId()).isEmpty()) { 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 0b8de12aa..e10e047f0 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 @@ -15,6 +15,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; +import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; @@ -97,7 +98,7 @@ public class ExcelWriterUtil { outputStream.close(); } - public static void exportExcel(HttpServletResponse response, Map map, String filePathErr, String type) throws IOException { + public static void exportExcelZip(HttpServletResponse response, Map map, String filePathErr, String type) throws IOException { ServletOutputStream outputStream = response.getOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); @@ -136,10 +137,49 @@ public class ExcelWriterUtil { } } + public static void exportExcel(HttpServletResponse response, + OrderDO orderDO, + List list, + String filePathErr, + String type) throws IOException { + //输入流 + InputStream inputStream = ResourceUtils.getURL(filePathErr+ "\\" + type).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 mapOrder = fillOrderData(orderDO); + + excelWriter.fill(mapOrder, writeSheet); + + //列表 + excelWriter.fill(list, fillConfig, writeSheet); + + //设置文件名的编码格式,防止文件名乱码 + String fileName = URLEncoder.encode(type.replace("模板",String.valueOf(orderDO.getId())), "UTF-8"); + //固定写法,设置响应头 + response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx"); + + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + //关流 + excelWriter.finish(); + inputStream.close(); + outputStream.close(); + } + // 填充订单数据 private static Map fillOrderData(OrderDO order) { Map orderMap = new HashMap<>(); orderMap.put("customOrderNo", order.getCustomOrderNo()); + orderMap.put("orderId", order.getId().toString()); + orderMap.put("orderData", order.getOrderDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); orderMap.put("customer", order.getCustomer()); orderMap.put("address", order.getAddress()); orderMap.put("phoneNumber", order.getPhoneNumber()); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index 3dc647fc5..23c6fe39c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -113,7 +113,7 @@ from order_goods a left join order_plate b on a.goods_id = b.goods_id left join order_item c on c.order_id = b.order_id - left join order_remain_plate d on a.goods_id = d.goods_id and d.plan_id = c.plan_id + left join order_remain_plate d on a.goods_id = d.goods_id and d.plan_id = c.plan_id where c.plan_id = #{planId} GROUP BY a.id, d.id diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单Excel导入错误导出模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单Excel导入错误导出模板.xlsx index 8f98befc8fd244b173e3c077a8527d4da5054556..ad259bfdcb62f88c73120a347d1c0fe33b040206 100644 GIT binary patch delta 9607 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 P!{$1{kI6ay+4=tfE{yBi 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 index 0b0e00c8d381a89be7be692f939345cb7d4b1eb8..3921cec10aff239bd5ae73d09f8b30092afd7aae 100644 GIT binary patch delta 6604 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 z z4;1u08y#4K)ndb|Y{eo=Ge&m2E9AX%x7ewos>Tz6~U-^3u2P)E++(|jV$94QKtn#iNVyi{O&cd{I2H@kFz(mbu zGhXR7<0&F`ZT}Kf)3k=`wt~1uG0>_Vezmo~yaHH6yGodgzfE@{Zz>JVWDiX@#=gbu zwbaYZ&Rh;gQP}-Xb+8*a>HRtebnh314x(kgpna!kb_}*bH+!&$6ch5z1QY%$k}n`1 zJZ>yGm6}GwWisVi9*)_L!9lX9{HcA&GUykobmM34!{Q15FaD#oR&p~GG))$7-0$ZR zJ;$vhyBQJAuV9f%%b!&j(k0erVBFD*uR^|1Wf?B}R5Wci8N-#Mrk{U0s+{#}-^x>x zIePY}0vRY@(!UOIk6Fk#x;TMGgPxXN`+M$|<$lfugM2=GudUk8UD?oqtRE^s7Q=g5pyQ=>kg`b8k50_N6kX;6B*lAv#05(xM+zdL3(N zXfNch@ocW)XyXq%>yY!3MlUV;X50>4f#k?LQ6iWN0KC;7GNxTzSD!gx9C8drBVquCWD_WEM@v6YIU(LGB+W%of1CJds_gB%H?`U(m zW5tSqsY}IG$n&uiieb7^Xp%CSlQYuP-9wp-U4H zN+mvnaoD7Of4G>i>>~s($3VqAwUPCJbP{kC8ZT=JpY}av|C2hy~v(ug{LI?jHlXvXY$K5?!Z@=$l44tBqq@|kF3 zUgTIox0=VItgtFPxP_`gwIhaVB`cX_8i=4%Ss@Us=cc97;eS3Accfu?kGA*nl_V=i@^6zx zbDl#HH07onEyOk6c%Rvw;2Ec zF#nVLGa*Ge3O~TFp+~(H=4Jc;-sE3oB@1d_n3L`Qi`Kt@c6OAY$St-%Wgv6y2NkcC qjrQN{_3SkmMJK9&Pr{9Yh|1$H@uHGM*{LZ26o9U4D2V?L_P+oN3;!+v 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 index 07b3c5271d766cdb28977e0fd944e48a8f2ef6c4..980f1ad9034c1142f94c090412aaa21221ea19e5 100644 GIT binary patch delta 4218 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 delta 4196 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 WGI4?n|2;A&p@^TGN)7!_!T$hh*1?+q diff --git a/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/RemainPlateUseTypeEnum.java b/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/RemainPlateUseTypeEnum.java new file mode 100644 index 000000000..76d11d931 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/RemainPlateUseTypeEnum.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.manage.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RemainPlateUseTypeEnum { + + TYPE_ONE(0, "核销"), + TYPE_TWO(1, "排单"), + TYPE_THREE(2, "补板"); + + private final Integer status; + private String description; + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + public boolean equals(RemainPlateUseTypeEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java index 2dcba5a0c..e2a61cf88 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java @@ -3,6 +3,7 @@ package com.cf.imes.module.manage.controller.admin.plate; import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlatePageReqVO; import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateRespVO; import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateSaveReqVO; +import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateUptReqVO; import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.manage.service.remainplaten.RemainPlateService; import io.swagger.v3.oas.annotations.Parameters; @@ -41,12 +42,19 @@ public class RemainPlateController { private RemainPlateService remainPlateService; @PostMapping("/create") - @Operation(summary = "创建生产单余料板表") + @Operation(summary = "创建生产单余料板表(单个)") @PreAuthorize("@ss.hasPermission('manage:remain-plate:create')") public CommonResult createRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO createReqVO) { return success(remainPlateService.createRemainPlate(createReqVO)); } + @PostMapping("/createMultiple") + @Operation(summary = "创建生产单余料板表(多个)") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:create')") + public CommonResult createRemainPlateMultiple(@Valid @RequestBody Set createReqVOS) { + return success(remainPlateService.createRemainPlateMultiple(createReqVOS)); + } + @PutMapping("/update") @Operation(summary = "更新生产单余料板表") @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") @@ -57,31 +65,20 @@ public class RemainPlateController { @PutMapping("/updateStatus") @Operation(summary = "余料板批量核销") - @Parameters({ - @Parameter(name = "id", description = "余料板id集", required = true), - @Parameter(name = "status", description = "修改的状态", required = true , example = "1"), - @Parameter(name = "useType", description = "使用类型,0核销,1排单,2补板", required = true , example = "1"), - @Parameter(name = "planId", description = "排单 ID", example = "1") - }) @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") - public CommonResult updateRemainPlate(@RequestParam("id") Set ids, - @RequestParam("status") Integer status, - @RequestParam("useType") Integer useType, - @RequestParam("planId") Long planId) { - remainPlateService.updateRemainPlateStatus(ids,status,useType,planId); + public CommonResult updateRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { + remainPlateService.updateRemainPlateStatus(updateReqVO.getIds(), + updateReqVO.getStatus(), + updateReqVO.getUseType(), + updateReqVO.getPlanId()); return success(true); } @PutMapping("/revertUpdate") @Operation(summary = "余料板批量释放") - @Parameters({ - @Parameter(name = "id", description = "余料板id集", required = true), - @Parameter(name = "status", description = "修改的状态", required = true , example = "1") - }) @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") - public CommonResult updateRemainPlate(@RequestParam("id") Set ids, - @RequestParam("status") Integer status) { - remainPlateService.revertRemainPlateStatus(ids,status); + public CommonResult revertRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { + remainPlateService.revertRemainPlateStatus(updateReqVO.getIds(),updateReqVO.getStatus()); return success(true); } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlatePageReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlatePageReqVO.java index 04ba05ee4..3d9fb2019 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlatePageReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlatePageReqVO.java @@ -16,6 +16,9 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @ToString(callSuper = true) public class RemainPlatePageReqVO extends PageParam { + @Schema(description = "ID", example = "16628") + private Long id; + @Schema(description = "排单 ID", example = "16628") private Long planId; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateSaveReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateSaveReqVO.java index ddd6083b0..981fa1339 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateSaveReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateSaveReqVO.java @@ -23,8 +23,7 @@ public class RemainPlateSaveReqVO { @Schema(description = "初始排单 ID") private Long initPlanId; - @Schema(description = "余料板状态,0未使用,1使用中,2已使用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "余料板状态,0未使用,1使用中,2已使用不能为空") + @Schema(description = "余料板状态,0未使用,1使用中,2已使用", example = "1") private Integer status; @Schema(description = "是否为开料添加,0否,1是", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @@ -34,12 +33,10 @@ public class RemainPlateSaveReqVO { @Schema(description = "使用类型,0核销,1排单,2补板", example = "0") private Integer useType; - @Schema(description = "商品 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7425") - @NotEmpty(message = "商品 ID不能为空") + @Schema(description = "商品 ID", example = "7425") private String goodsId; - @Schema(description = "商品名", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") - @NotEmpty(message = "商品名不能为空") + @Schema(description = "商品名", example = "晨丰") private String name; @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) @@ -78,8 +75,7 @@ public class RemainPlateSaveReqVO { @Schema(description = "备注", example = "随便") private String remark; - @Schema(description = "轮廊数据,Json 串", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "轮廊数据,Json 串不能为空") + @Schema(description = "轮廊数据,Json 串") private String outLineJson; } \ No newline at end of file diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java new file mode 100644 index 000000000..45081e13f --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.manage.controller.admin.plate.vo.remain; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Set; + +@Schema(description = "管理后台 - 生产单余料板表 order_remain_plate_{N} Response VO") +@Data +public class RemainPlateUptReqVO { + + @Schema(description = "余料板集", requiredMode = Schema.RequiredMode.REQUIRED, example = "16470") + private Set ids; + + @Schema(description = "余料板状态,0未使用,1使用中", example = "1") + private Integer status; + + @Schema(description = "使用类型,0核销,1排单,2补板", example = "0") + private Integer useType; + + @Schema(description = "排单 ID", example = "6628") + private Long planId; +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java index 99546599e..d6ece6124 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java @@ -23,6 +23,14 @@ public interface RemainPlateService { */ Long createRemainPlate(@Valid RemainPlateSaveReqVO createReqVO); + /** + * 创建生产单余料板表 + * + * @param createReqVOS 创建信息 + * @return 编号 + */ + Boolean createRemainPlateMultiple(@Valid Set createReqVOS); + /** * 批量核销 * diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java index 298f310a1..977fbcae7 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java @@ -6,6 +6,7 @@ import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateSav import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.manage.dal.mysql.remainplaten.RemainPlateMapper; import com.cf.imes.module.manage.enums.RemainPlateStatusEnum; +import com.cf.imes.module.manage.enums.RemainPlateUseTypeEnum; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import com.cf.imes.framework.common.pojo.PageResult; @@ -15,6 +16,7 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import javax.annotation.Resource; +import java.util.Collections; import java.util.Set; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -41,19 +43,31 @@ public class RemainPlateServiceImpl implements RemainPlateService { return remainPlate.getId(); } + @Override + public Boolean createRemainPlateMultiple(Set createReqVOS) { + // 批量插入 + return remainPlateMapper.insertBatch(Collections.singleton(BeanUtils.toBean(createReqVOS, RemainPlateDO.class))); + } + @Override public void updateRemainPlateStatus(Set ids, Integer status, Integer useType,Long planId) { //判断是否符合核销标准 - validateRemainPlateStatus(ids,RemainPlateStatusEnum.UNUSED.getStatus()); + validateRemainPlateStatus(ids,RemainPlateStatusEnum.IN_USE.getStatus()); //以id为条件批量修改余料库中的状态 remainPlateMapper.updateRemainPlateStatus(ids, status, useType, OrganContextHolder.getOrganId(),planId); } @Override public void revertRemainPlateStatus(Set ids, Integer status) { - // 判断余料的状态 为使用中 - validateRemainPlateStatus(ids,RemainPlateStatusEnum.IN_USE.getStatus()); - remainPlateMapper.updateRemainPlateStatus(ids, status, null, OrganContextHolder.getOrganId(),null); + // 判断余料的状态是否存在使用中 + validateRemainPlateStatus(ids,RemainPlateStatusEnum.UNUSED.getStatus()); + // 判断使用类型是否为核销 + for (Long id : ids) { + if (validateRemainPlateUseType(id) != RemainPlateUseTypeEnum.TYPE_ONE.getStatus()) { + throw exception(REMAIN_PLATE_USR_TYPE); + } + } + remainPlateMapper.updateRemainPlateStatus(ids, status, null, OrganContextHolder.getOrganId(),0L); } @Override @@ -77,7 +91,7 @@ public class RemainPlateServiceImpl implements RemainPlateService { @Override public void deleteRemainPlate(Set ids) { - // 判断余料的状态 为使用中 + // 判断余料的状态是否存在使用中 validateRemainPlateStatus(ids,RemainPlateStatusEnum.IN_USE.getStatus()); // 删除 remainPlateMapper.deleteBatchIds(ids); diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index f52d99d21..97fcb6bb4 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -259,4 +259,5 @@ public interface ErrorCodeConstants { ErrorCode REMAIN_PLATE_STATUS_USED = new ErrorCode(1_002_038_001, "余料板正在使用中,禁止修改"); ErrorCode REMAIN_PLATE_STATUS_NO_USED = new ErrorCode(1_002_038_001, "余料板未使用"); + ErrorCode REMAIN_PLATE_USR_TYPE = new ErrorCode(1_002_038_001, "余料板使用类型为不可核销类型"); }