From d5a75728b9ba874172c64e3bd71aac22d508fddf Mon Sep 17 00:00:00 2001 From: tzy Date: Tue, 16 Sep 2025 17:41:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A8=E9=80=81=E8=87=B3=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=9B=B4=E6=96=B020250916?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 2 +- .../controller/BomDetailsController.java | 12 +- .../KingdeeWorkCenterDataController.java | 98 +++++++++--- .../controller/ProcessOrderProController.java | 2 + .../controller/ProcessRouteController.java | 2 +- .../domain/dto/ProcessRouteExcelDTO.java | 141 ++++++++++++++++++ .../domain/dto/PurchaseRequestExcelDTO.java | 10 ++ .../system/domain/vo/EleMaterialsVo.java | 10 +- .../system/domain/vo/ProductionOrderVo.java | 4 +- .../java/com/ruoyi/system/runner/JdUtil.java | 6 +- .../com/ruoyi/system/runner/PDFGenerator.java | 2 +- .../service/IProcessOrderProService.java | 4 + .../impl/ProcessOrderProServiceImpl.java | 25 +++- .../EXCEL模板/生产及工艺计划模版.xlsx | Bin 18631 -> 18742 bytes .../resources/EXCEL模板/采购订单模板1.xlsx | Bin 11288 -> 11394 bytes 15 files changed, 284 insertions(+), 34 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 8f9c2ec..9a185d9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -79,7 +79,7 @@ public class ExcelUtil { } public static ExcelResult importExcelSheet2(InputStream is, Class clazz, boolean isValidate) { DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); - EasyExcel.read(is, clazz, listener).sheet(2).doRead(); + EasyExcel.read(is, clazz, listener).sheet(0).headRowNumber(2).doRead(); return listener.getExcelResult(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java index 289ed5e..e3d79d2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java @@ -29,6 +29,7 @@ import com.ruoyi.system.domain.dto.JdValidateBomDTO; import com.ruoyi.system.domain.dto.JdChildDTO; import com.ruoyi.system.domain.vo.BomDetailsVo; import com.ruoyi.system.mapper.FigureSaveMapper; +import com.ruoyi.system.mapper.ProcessOrderProMapper; import com.ruoyi.system.runner.JdUtil; import com.ruoyi.system.service.*; import lombok.RequiredArgsConstructor; @@ -76,7 +77,7 @@ public class BomDetailsController extends BaseController { private final IProcessOrderProService iProcessOrderProService; private final IFigureSaveService iFigureSaveService; - + private final ProcessOrderProMapper processOrderProMapper; /** * 查询bom明细列表 */ @@ -355,11 +356,11 @@ public class BomDetailsController extends BaseController { List bomDetailsList = new ArrayList<>(); Set processedMaterials = new HashSet<>(); // 用于跟踪已处理的物料编码 List failedMaterials = new ArrayList<>(); // 用于跟踪处理失败的物料 - + String totalWeight = ""; // 遍历前端传来的数据 for (Map param : bomDetailParams) { String fnumber = param.get("fnumber"); // 物料编码 - String totalWeight = param.get("totalWeight"); // 生产令号 + totalWeight = param.get("totalWeight"); // 生产令号 // 根据物料编码和生产令号查询 List bomDetails = iBomDetailsService.selectByFNumberAndTotalWeight(fnumber, totalWeight); @@ -414,7 +415,10 @@ public class BomDetailsController extends BaseController { bomDetailsList.addAll(bomDetails); } } - + //更新项目进度 + ProcessOrderProBo processOrderProBo = iProcessOrderProService.selectByProjectNumber(totalWeight); + processOrderProBo.setBomStatus(2L); + processOrderProMapper.selectById(processOrderProBo); // 返回处理结果 return R.ok("成功", bomDetailsList); 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 fc39732..14297c0 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 @@ -4,22 +4,11 @@ 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; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.CellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; -import com.alibaba.excel.write.builder.ExcelWriterBuilder; -import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -28,16 +17,12 @@ import com.google.gson.JsonObject; import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.ruoyi.common.utils.HttpRequestUtil; import com.ruoyi.common.utils.WxRobotUtil; -import com.ruoyi.common.utils.file.SmbUtil; import com.ruoyi.common.poi.ExcelTemplateProc; import com.ruoyi.common.poi.DynamicDataMapping; -import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.domain.SafetyStock; import com.ruoyi.system.domain.WlStockData; import com.ruoyi.system.domain.dto.*; -import com.ruoyi.system.domain.vo.SafetyStockVo; import com.ruoyi.system.domain.vo.WlStockDataVo; -import com.ruoyi.system.mapper.SafetyStockMapper; import com.ruoyi.system.mapper.WlStockDataMapper; import com.ruoyi.system.runner.JdUtil; import com.ruoyi.system.service.ISafetyStockService; @@ -947,7 +932,8 @@ public class KingdeeWorkCenterDataController extends BaseController { Map map = new HashMap<>(); map.put("index", index); map.put("FBillNo", item.getFBillNo()); - map.put("FBillTypeID", item.getFBillTypeID()); + map.put("FDocumentStatus", item.getFDocumentStatus()); + map.put("FCloseStatus", item.getFCloseStatus()); map.put("FSuggestPurDate", item.getFSuggestPurDate()); map.put("FSuggestSupplierIdFName", item.getFSuggestSupplierIdFName()); map.put("FMaterialIdFNumber", item.getFMaterialIdFNumber()); @@ -1025,7 +1011,12 @@ public class KingdeeWorkCenterDataController extends BaseController { for (PurchaseRequestExcelDTO allOrder : allOrders) { String productionOrderNo = allOrder.getFUCHNText(); String deliveryDate = allOrder.getFArrivalDate(); - + if (allOrder.getFCloseStatus().equals("A")){ + allOrder.setFCloseStatus("未关闭"); + } + if (allOrder.getFDocumentStatus().equals("C")){ + allOrder.setFDocumentStatus("已审核"); + } // 条件3: 交货日期不能为空,并且必须早于今天 @@ -1057,5 +1048,78 @@ public class KingdeeWorkCenterDataController extends BaseController { log.info("过滤完成,剩余数量: {}", filteredOrders.size()); return filteredOrders; } + @Log(title = "采购订单和采购申请单临期数据") + @XxlJob("getPurchaseOrder2") + @PostMapping("/getPurchaseOrder2") + public R getPurchaseOrder2() { + try { + // String robotId = "4d2f037d-0cee-493a-a4ff-1758f67b8069"; + 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") + .append("更新时间:").append(currentTime).append("\n\n") + .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"); + + // 生成Excel文件使用采购模板 + String fileName = String.format("采购订单和申请数据_%s.xlsx", + DateUtil.format(new Date(), "yyyyMMddHHmmss")); + String filePath = FileUtils.getTempDirectoryPath() + File.separator + fileName; + + // 准备模板数据 + Map staticDataMap = new HashMap<>(); + staticDataMap.put("currentTime", DateUtil.format(new Date(), "yyyy年MM月dd日 HH:mm:ss")); + staticDataMap.put("purchaseOrderCount", purchaseOrderList.size()); + staticDataMap.put("purchaseRequestCount", purchaseRequestList.size()); + + List dynamicDataMappingList = new ArrayList<>(); + + // 添加采购订单数据 + if (!purchaseOrderList.isEmpty()) { + List> orderDataList = convertPurchaseOrderToMapList(purchaseOrderList); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseOrderExcelDTO", orderDataList)); + } + + // 添加采购申请数据 + if (!purchaseRequestList.isEmpty()) { + List> requestDataList = convertPurchaseRequestToMapList(purchaseRequestList); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("PurchaseRequestExcelDTO", requestDataList)); + } + + // 使用采购模板生成Excel + String templatePath = "EXCEL模板/采购订单模板1.xlsx"; + ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, filePath, staticDataMap, dynamicDataMappingList); + + // 发送Excel文件 + File excelFile = new File(filePath); + if (excelFile.exists()) { + wxRobotUtil.sendFileToWeChatGroup(excelFile, robotId); + FileUtils.deleteQuietly(excelFile); + } + + + msg.append("\n详细数据请查看发送的Excel文件!"); + wxRobotUtil.sendMsgToWeChatGroup(msg.toString(), robotId, true); // @所有人 + + return R.ok(); + + } catch (Exception e) { + log.error("发送工段数据失败", e); + return R.fail("发送工段数据失败:" + e.getMessage()); + } + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java index 1fcd672..20806f2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java @@ -14,6 +14,7 @@ import com.ruoyi.common.poi.ExcelTemplateProc; import com.ruoyi.common.poi.DynamicDataMapping; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.bo.FigureSaveBo; +import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO; import com.ruoyi.system.domain.vo.*; import com.ruoyi.system.domain.vo.BomDataVO; import com.ruoyi.system.mapper.ProcessOrderProMapper; @@ -490,6 +491,7 @@ public class ProcessOrderProController extends BaseController { if (!found) { processDataList.add(item); } + List excelDTOList = iProcessOrderProService.getRouteAndBomDetail( processDataList,orderPro); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java index ac69e6c..c852fb9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java @@ -379,7 +379,7 @@ public class ProcessRouteController extends BaseController { ExcelResult result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class, true); List list1 = result.getList(); // 读取总装部分sheet - ExcelResult result1 = ExcelUtil.importExcelSheet2(file.getInputStream(), ProductionOrderVo.class, true); + ExcelResult result1 = ExcelUtil.importExcelSheet1(file.getInputStream(), ProductionOrderVo.class, true); List list = result1.getList(); String productionOrderNo = list1.get(0).getRouteDescription(); List bomDetails = iBomDetailsService.selectByProjectNumber(list1.get(0).getRouteDescription()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java new file mode 100644 index 0000000..b3d5e5f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java @@ -0,0 +1,141 @@ +package com.ruoyi.system.domain.dto; + +import lombok.Data; + +import java.util.Date; +@Data +public class ProcessRouteExcelDTO { + + + + private Long id; + + /** + * 生产令号 + */ + private String routeDescription; + + /** + * 物料编码 + */ + + private String materialCode; + + /** + * 物料名称 + */ + + private String materialName; + /** + * 材质 + */ + + private String material; + + /** + * 单重KG + */ + private Double discWeight; + /** + * 材料BOM物料编码 + */ + private String rawMaterialCode; + + + + /** + * 材料BOM物料名称 + */ + private String rawMaterialName; + /** + * bom材质 + */ + private String bomMaterial; + /** + * 材料BOM单位 + */ + private Double bomDanZhong; + + /** + * 材料BOM用量 + */ + private Double discUsage; + /** + * 材料BOM单位 + */ + private String bomUnit; + + /** + * 工序号 + */ + private Long processNo; + + /** + * 工作中心(加工车间) + */ + private String workCenter; + + /** + * 工序名称 + */ + private String processName; + + /** + * 工序说明(序描述) + */ + private String processDescription; + + /** + * 工序控制 + */ + private String processControl; + + /** + * 活动时长 + */ + private Double activityDuration; + + /** + * 活动单位 + */ + private String activityUnit; + + /** + * 单台数量 + */ + private Long unitQuantity; + + /** + * 本批数量 + */ + + private Long batchQuantity; + + /** + * 首批数量 + */ + + private Double firstBatchQuantity; + /** + * 计划开始时间 + */ + + private Date planStartTime; + + /** + * 计划结束时间 + */ + + private Date planEndTime; + + /** + * 序开始时间 + */ + private Date xuStartTime; + + /** + * 序结束时间 + */ + private Date xuEndTime; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PurchaseRequestExcelDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PurchaseRequestExcelDTO.java index af71639..316bb92 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PurchaseRequestExcelDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PurchaseRequestExcelDTO.java @@ -28,6 +28,16 @@ public class PurchaseRequestExcelDTO { */ @JsonProperty("FSuggestSupplierId.FName") private String FSuggestSupplierIdFName; + /** + * 审核状态 + */ + @JsonProperty("FDocumentStatus") + private String FDocumentStatus; + /** + * 关闭状态 + */ + @JsonProperty("FCloseStatus") + private String FCloseStatus; /** * 物料编码 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/EleMaterialsVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/EleMaterialsVo.java index 75f5e64..0755bec 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/EleMaterialsVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/EleMaterialsVo.java @@ -44,31 +44,31 @@ public class EleMaterialsVo { /** * 型号 */ - //@ExcelProperty(value = "型号") + @ExcelProperty(value = "型号") private String model; /** * 材质 */ - //@ExcelProperty(value = "类别") + @ExcelProperty(value = "类别") private String materialType; /** * 单位 */ - // @ExcelProperty(value = "单位") + @ExcelProperty(value = "单位") private String unit; /** * 品牌 */ - //@ExcelProperty(value = "品牌") + @ExcelProperty(value = "品牌") private String brand; /** * 备注 */ - // @ExcelProperty(value = "备注") + @ExcelProperty(value = "备注") private String remarks; /** * 物料值 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ProductionOrderVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ProductionOrderVo.java index 775bf11..7caefdc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ProductionOrderVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ProductionOrderVo.java @@ -20,13 +20,13 @@ public class ProductionOrderVo { /** * ID */ - @ExcelProperty(value = "序号") + private Long id; /** * 生产令号 */ - + @ExcelProperty(value = "生产令号") private String productionOrderNo; /** 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 5f8f345..ec40e3b 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 @@ -2578,12 +2578,16 @@ public class JdUtil { return purcs; // 返回结果 } + /** + * 采购申请单 + * @return List + */ public static List getPurchaseRequestOrder() { K3CloudApi client = new K3CloudApi(); // 请求参数,要求为json字符串 JsonObject json = new JsonObject(); json.addProperty("FormId", "PUR_Requisition"); - json.addProperty("FieldKeys", "FBillNo,FBillTypeID,FSuggestPurDate,FSuggestSupplierId.FName,FMaterialId.FNumber,FMaterialName,FPriceUnitId.FName,FReqQty,FArrivalDate,FApplicationDate,F_UCHN_Text,FCreatorId.FName"); + json.addProperty("FieldKeys", "FBillNo,FBillTypeID,FDocumentStatus,FCloseStatus,FSuggestPurDate,FSuggestSupplierId.FName,FMaterialId.FNumber,FMaterialName,FPriceUnitId.FName,FReqQty,FArrivalDate,FApplicationDate,F_UCHN_Text,FCreatorId.FName"); // 创建过滤条件 JsonObject filterObject = new JsonObject(); JsonArray filterString = new JsonArray(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/runner/PDFGenerator.java b/ruoyi-system/src/main/java/com/ruoyi/system/runner/PDFGenerator.java index b76c268..11a53c9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/runner/PDFGenerator.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/runner/PDFGenerator.java @@ -167,7 +167,7 @@ public class PDFGenerator { // 获取当前时间的毫秒时间戳 long timestamp = System.currentTimeMillis(); String pdfPath = departmentFolder.getAbsolutePath() + "\\" + fDepartmentName + "_" - + materialCode1.replace("/", "_") + "_" + timestamp + ".pdf"; + + materialCode1.replace("/", "_") + "_" + productionOrderNumber + ".pdf"; try { // 创建 PDF 文件并写入内容 PDDocument document = new PDDocument(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessOrderProService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessOrderProService.java index 64ff860..29861f8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessOrderProService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessOrderProService.java @@ -4,11 +4,13 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.domain.ProcessOrderPro; import com.ruoyi.system.domain.ProcessRoute; import com.ruoyi.system.domain.bo.FigureSaveBo; +import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO; import com.ruoyi.system.domain.vo.OverdueProjectVo; import com.ruoyi.system.domain.vo.ProcessOrderProVo; import com.ruoyi.system.domain.bo.ProcessOrderProBo; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.system.domain.vo.ProductionOrderVo; import org.springframework.web.multipart.MultipartFile; import java.util.Collection; @@ -75,4 +77,6 @@ public interface IProcessOrderProService { String uploadContractPDF(Integer id, String originalFilename, MultipartFile filePath); List getOverdueProjects(); + + List getRouteAndBomDetail(List processDataList,ProcessOrderPro orderPro); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java index ead9cc7..aa2e4d8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java @@ -19,13 +19,16 @@ import com.ruoyi.common.utils.file.PDFDocHelper; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.bo.FigureSaveBo; +import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO; import com.ruoyi.system.domain.dto.excuteDrawing.DataInfo; import com.ruoyi.system.domain.dto.excuteDrawing.ProductInfo; import com.ruoyi.system.domain.dto.excuteDrawing.PwProductionBill; import com.ruoyi.system.domain.vo.OverdueProjectVo; +import com.ruoyi.system.domain.vo.ProductionOrderVo; import com.ruoyi.system.listener.FileToZip; import com.ruoyi.system.listener.SmbUtils; import com.ruoyi.system.mapper.FigureSaveMapper; +import com.ruoyi.system.mapper.MaterialBomMapper; import com.ruoyi.system.mapper.ProcessRouteMapper; import com.ruoyi.system.service.*; import lombok.RequiredArgsConstructor; @@ -64,6 +67,7 @@ import java.time.LocalDate; @Slf4j public class ProcessOrderProServiceImpl implements IProcessOrderProService { private final FigureSaveMapper figureSaveMapper; + private final IMaterialBomService materialBomService; private final ProcessOrderProMapper baseMapper; @Autowired @@ -554,7 +558,7 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { if ("idle".equals(currentStatus) && processState == 4) { ProcessOrderPro processOrderPro = new ProcessOrderPro(); BeanUtils.copyProperties(orderPro,processOrderPro); - //To do + processOrderPro.setBomStatus(1L);// baseMapper.updateById(processOrderPro); log.info("图纸处理完成!"); @@ -616,7 +620,7 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { return R.fail("清空目标文件夹失败: " + e.getMessage()); } } - + // 6. 下载FTP文件到本地 log.info("开始从FTP下载文件..."); for (FigureSave figureSave : fiseList) { @@ -1089,6 +1093,7 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { return projects; } + // 辅助方法:将 java.util.Date 转换为 LocalDate private LocalDate convertToLocalDate(Date date) { if (date != null) { @@ -1123,5 +1128,21 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { } } } + /** + * 将工艺部分 材料BOM部分 合并成ProcessRouteExcelDTO + * @return + */ + @Override + public List getRouteAndBomDetail(List processDataList,ProcessOrderPro orderPro) { + String proRoot = orderPro.getProductionOrderNo(); + //工艺部分 + List processRoutes = iProcessRouteService.selectByProjectNumber(proRoot); + List materialBoms = materialBomService.selectByProCode(proRoot); + for (ProductionOrderVo productionOrderVo : processDataList) { + ProcessRouteExcelDTO processRouteExcelDTO = new ProcessRouteExcelDTO(); + } + + return Collections.emptyList(); + } } diff --git a/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx b/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx index 95f5e4c48a334c0bb6b592174dd8217c329fed2e..b0ff69259ff635fcaa869f9a4da5f45108532c02 100644 GIT binary patch delta 11689 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 delta 11579 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 delta 2783 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 W6aPIAJpWJP1uRsQIcw$rmi-GuSQf7U