From 73a9939d0ba08902d58c400aa2f4a60206b8f6b1 Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Mon, 15 Sep 2025 01:18:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=20?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E7=94=B3=E8=AF=B7=E5=8D=95=20=E5=BB=B6?= =?UTF-8?q?=E6=9C=9F=E6=8F=90=E9=86=92=20=E6=8F=90=E5=89=8D=E6=8F=90?= =?UTF-8?q?=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KingdeeWorkCenterDataController.java | 195 +++++++++++++++++- .../java/com/ruoyi/system/runner/JdUtil.java | 20 +- .../resources/EXCEL模板/采购订单模板1.xlsx | Bin 0 -> 11101 bytes 3 files changed, 196 insertions(+), 19 deletions(-) create mode 100644 ruoyi-system/src/main/resources/EXCEL模板/采购订单模板1.xlsx diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/KingdeeWorkCenterDataController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/KingdeeWorkCenterDataController.java index 2f08bca..a6d6e4d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/KingdeeWorkCenterDataController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/KingdeeWorkCenterDataController.java @@ -1,11 +1,15 @@ package com.ruoyi.system.controller; import java.io.File; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; @@ -838,11 +842,12 @@ public class KingdeeWorkCenterDataController extends BaseController { @Log(title = "采购订单和采购申请单") @XxlJob("getPurchaseOrder") + @PostMapping("/getPurchaseOrder") public R getPurchaseOrder() { try { // String robotId = "4d2f037d-0cee-493a-a4ff-1758f67b8069"; - String robotId = "483489b2-b219-468c-851f-f56a34a62d91"; - + //String robotId = "483489b2-b219-468c-851f-f56a34a62d91"; + String robotId = "8af8abea-3f21-4ca7-ad0a-5b7a2cf4d78e"; String currentTime = DateUtil.format(new Date(), "yyyy年MM月dd日 HH:mm:ss"); StringBuilder msg = new StringBuilder(); msg.append("🏭 采购订单和采购申请更新\n\n") @@ -850,11 +855,17 @@ public class KingdeeWorkCenterDataController extends BaseController { .append("🔧 订单数据统计:\n"); // 获取采购订单和采购申请数据 - List purchaseOrderList = JdUtil.getPurchaseOrder(); - List purchaseRequestList = JdUtil.getPurchaseRequestOrder(); - - msg.append("- 采购订单:").append(purchaseOrderList.size()).append("条\n"); + List allPurchaseOrderList = JdUtil.getPurchaseOrder(); + List allpurchaseRequestList = JdUtil.getPurchaseRequestOrder(); + + // 过滤采购订单数据 + List purchaseOrderList = filterPurchaseOrders(allPurchaseOrderList); + // 过滤采购申请单数据 + List purchaseRequestList = filterReqPurchaseOrders(allpurchaseRequestList); + + msg.append("- 采购订单(已过滤):").append(purchaseOrderList.size()).append("条\n"); msg.append("- 采购申请:").append(purchaseRequestList.size()).append("条\n"); + msg.append("- 过滤条件:生产令号0259/240605开头,交货日期小于当前时间\n"); // 生成Excel文件使用采购模板 String fileName = String.format("采购订单和申请数据_%s.xlsx", @@ -872,17 +883,17 @@ public class KingdeeWorkCenterDataController extends BaseController { // 添加采购订单数据 if (!purchaseOrderList.isEmpty()) { List> orderDataList = convertPurchaseOrderToMapList(purchaseOrderList); - dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseOrder", orderDataList)); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseOrderExcelDTO", orderDataList)); } // 添加采购申请数据 if (!purchaseRequestList.isEmpty()) { List> requestDataList = convertPurchaseRequestToMapList(purchaseRequestList); - dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseRequest", requestDataList)); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseRequestExcelDTO", requestDataList)); } // 使用采购模板生成Excel - String templatePath = "EXCEL模板/采购订单模板.xlsx"; + String templatePath = "EXCEL模板/采购订单模板1.xlsx"; ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, filePath, staticDataMap, dynamicDataMappingList); // 发送Excel文件 @@ -952,5 +963,171 @@ public class KingdeeWorkCenterDataController extends BaseController { } return mapList; } + /** + * 过滤采购订单数据 + */ + /* private List filterPurchaseOrders(List allOrders) { + String currentTime = DateUtil.format(new Date(), "yyyy-MM-dd"); + + return allOrders.stream() + .filter(order -> { + String productionOrderNo = order.getFUCHNText2(); + String deliveryDate = order.getFDeliveryDate(); + + // 过滤条件1: FUCHNText2 不为空 + if (productionOrderNo == null || productionOrderNo.trim().isEmpty()) { + return false; + } + + // 过滤条件2: 生产令号以NO开头 + if (!productionOrderNo.startsWith("NO")) { + return false; + } + + // 过滤条件3: 生产令号以0259开头或240605开头 + if (!productionOrderNo.startsWith("0259") && !productionOrderNo.startsWith("240605")) { + return false; + } + + // 过滤条件4: 交货日期小于当前时间 + if (deliveryDate != null && !deliveryDate.trim().isEmpty()) { + try { + // 处理日期格式 2024-02-22T00:00:00 + String dateStr = deliveryDate.split("T")[0]; // 提取日期部分 + if (dateStr.compareTo(currentTime) >= 0) { + return false; // 交货日期大于等于当前时间,过滤掉 + } + } catch (Exception e) { + log.warn("解析交货日期失败: {}", deliveryDate, e); + return false; + } + } + + return true; + }) + .collect(java.util.stream.Collectors.toList()); + }*/ + /** + * 过滤采购订单数据 + */ + + /** + * 过滤采购订单数据 + */ + private List filterPurchaseOrders(List allOrders) { + LocalDate today = LocalDate.now(); + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + + log.info("开始过滤采购订单,总数: {}, 当前日期: {}", allOrders.size(), today.format(outputFormatter)); + List filteredOrders = new ArrayList<>(); + + for (PurchaseOrderExcelDTO allOrder : allOrders) { + String productionOrderNo = allOrder.getFUCHNText2(); + String deliveryDate = allOrder.getFDeliveryDate(); + + // 条件1: 生产令号不能为空 + if (productionOrderNo == null || productionOrderNo.trim().isEmpty()) { + log.debug("过滤掉: 生产令号为空"); + continue; + } + + // 条件2: 不能以 NO / GMJ / GSC 开头 + if (productionOrderNo.startsWith("NO") + || productionOrderNo.startsWith("GMJ") + || productionOrderNo.startsWith("GSC")) { + log.debug("过滤掉: 生产令号不符合前缀条件: {}", productionOrderNo); + continue; + } + + // 条件3: 交货日期不能为空,并且必须早于今天 + if (deliveryDate == null || deliveryDate.trim().isEmpty()) { + log.debug("过滤掉: 交货日期为空"); + continue; + } + + try { + String dateStr = deliveryDate.split("T")[0]; // 取 yyyy-MM-dd 部分 + LocalDate delivery = LocalDate.parse(dateStr, inputFormatter); + + // 转换格式 + String formatted = delivery.format(outputFormatter); + allOrder.setFDeliveryDate(formatted); + + if (!delivery.isBefore(today)) { + log.debug("过滤掉: 交货日期未过期: {}", formatted); + continue; + } + } catch (Exception e) { + log.warn("解析交货日期失败: {}", deliveryDate, e); + continue; + } + + filteredOrders.add(allOrder); + } + + log.info("过滤完成,剩余数量: {}", filteredOrders.size()); + return filteredOrders; + } + + + /** + * 过滤采购申请订单数据 + */ + private List filterReqPurchaseOrders(List allOrders) { + LocalDate today = LocalDate.now(); + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + + log.info("开始过滤采购申请订单,总数: {}, 当前日期: {}", allOrders.size(), today.format(outputFormatter)); + List filteredOrders = new ArrayList<>(); + + for (PurchaseRequestExcelDTO allOrder : allOrders) { + String productionOrderNo = allOrder.getFUCHNText(); + String deliveryDate = allOrder.getFArrivalDate(); + + // 条件1: 生产令号不能为空 + if (productionOrderNo == null || productionOrderNo.trim().isEmpty()) { + log.debug("过滤掉: 生产令号为空"); + continue; + } + + // 条件2: 不能以 NO / 0259 / 240605 开头 + if (productionOrderNo.startsWith("NO") + || productionOrderNo.startsWith("0259") + || productionOrderNo.startsWith("240605")) { + log.debug("过滤掉: 生产令号不符合前缀条件: {}", productionOrderNo); + continue; + } + + // 条件3: 交货日期不能为空,并且必须早于今天 + if (deliveryDate == null || deliveryDate.trim().isEmpty()) { + log.debug("过滤掉: 交货日期为空"); + continue; + } + + try { + String dateStr = deliveryDate.split("T")[0]; // 取 yyyy-MM-dd 部分 + LocalDate delivery = LocalDate.parse(dateStr, inputFormatter); + + // 转换格式 + String formatted = delivery.format(outputFormatter); + allOrder.setFArrivalDate(formatted); + + if (!delivery.isBefore(today)) { + log.debug("过滤掉: 交货日期未过期: {}", formatted); + continue; + } + } catch (Exception e) { + log.warn("解析交货日期失败: {}", deliveryDate, e); + continue; + } + + filteredOrders.add(allOrder); + } + + log.info("过滤完成,剩余数量: {}", filteredOrders.size()); + return filteredOrders; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java index 0d9f18b..035fe56 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java @@ -2528,8 +2528,8 @@ public class JdUtil { JsonObject filterObject = new JsonObject(); JsonArray filterString = new JsonArray(); filterObject.addProperty("FieldName", "FCloseStatus"); - filterObject.addProperty("Compare", "67"); - filterObject.addProperty("Value", 105); + filterObject.addProperty("Compare", "105"); + filterObject.addProperty("Value", "A"); filterObject.addProperty("Left", ""); filterObject.addProperty("Right", ""); filterObject.addProperty("Logic", 0); @@ -2537,8 +2537,8 @@ public class JdUtil { JsonObject filterObject1 = new JsonObject(); filterObject1.addProperty("FieldName", "FMRPCloseStatus"); - filterObject1.addProperty("Compare", "67"); - filterObject1.addProperty("Value", 105); + filterObject1.addProperty("Compare", "105"); + filterObject1.addProperty("Value", "A"); filterObject1.addProperty("Left", ""); filterObject1.addProperty("Right", ""); filterObject1.addProperty("Logic", 0); @@ -2546,8 +2546,8 @@ public class JdUtil { JsonObject filterObject2 = new JsonObject(); filterObject2.addProperty("FieldName", "FDocumentStatus"); - filterObject2.addProperty("Compare", "67"); - filterObject2.addProperty("Value", 105); + filterObject2.addProperty("Compare", "105"); + filterObject2.addProperty("Value", "C"); filterObject2.addProperty("Left", ""); filterObject2.addProperty("Right", ""); filterObject2.addProperty("Logic", 0); @@ -2588,8 +2588,8 @@ public class JdUtil { JsonObject filterObject = new JsonObject(); JsonArray filterString = new JsonArray(); filterObject.addProperty("FieldName", "FDocumentStatus"); - filterObject.addProperty("Compare", "67"); - filterObject.addProperty("Value", 105); + filterObject.addProperty("Compare", "105"); + filterObject.addProperty("Value", "C"); filterObject.addProperty("Left", ""); filterObject.addProperty("Right", ""); filterObject.addProperty("Logic", 0); @@ -2597,8 +2597,8 @@ public class JdUtil { JsonObject filterObject1 = new JsonObject(); filterObject1.addProperty("FieldName", "FCloseStatus"); - filterObject1.addProperty("Compare", "67"); - filterObject1.addProperty("Value", 105); + filterObject1.addProperty("Compare", "105"); + filterObject1.addProperty("Value", "A"); filterObject1.addProperty("Left", ""); filterObject1.addProperty("Right", ""); filterObject1.addProperty("Logic", 0); diff --git a/ruoyi-system/src/main/resources/EXCEL模板/采购订单模板1.xlsx b/ruoyi-system/src/main/resources/EXCEL模板/采购订单模板1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7f941c1753cb7526c4b75a72e093143717e7e683 GIT binary patch literal 11101 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 literal 0 HcmV?d00001