From bd74f59a411383e32eb17a69cc5a7ada1571023e Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 02 六月 2026 12:06:18 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' into dev_pro_山西_晋和园

---
 src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java |   28 +++++++++
 src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java               |    9 +++
 src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java               |    3 +
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java       |    4 
 src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java             |    3 +
 src/main/java/com/ruoyi/framework/config/ApplicationConfig.java               |   94 +++++++++++++++++++++----------
 src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java |   24 ++++++++
 src/main/resources/application.yml                                            |    3 +
 src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java                       |    3 
 9 files changed, 138 insertions(+), 33 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java b/src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java
index 35952a5..668bc8c 100644
--- a/src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java
+++ b/src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.approve.bean.dto;
 
 import com.ruoyi.approve.pojo.ApprovalTemplate;
+import com.ruoyi.basic.dto.StorageBlobDTO;
 import lombok.Data;
 
 import java.util.List;
@@ -9,4 +10,6 @@
 public class ApprovalTemplateDto  extends ApprovalTemplate {
 
     private List<ApprovalTemplateNodeDto> nodes;
+
+    private List<StorageBlobDTO> storageBlobDTOs;
 }
diff --git a/src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java b/src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java
index 552ed0a..41ad4e4 100644
--- a/src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java
+++ b/src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java
@@ -24,5 +24,14 @@
     @Schema(description = "涓氬姟鍚嶇О")
     private String businessName;
 
+    @Schema(description = "鎶ヤ环鍗曞彿")
+    private String quotationNo;
+
+    @Schema(description = "閲囪喘鍗曞彿")
+    private String purchaseContractNumber;
+
+    @Schema(description = "鍙戣揣鍗曞彿")
+    private String shippingNo;
+
     private List<StorageBlobVO> storageBlobVOList;
 }
diff --git a/src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java b/src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java
index 2793293..84a6904 100644
--- a/src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java
+++ b/src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java
@@ -1,6 +1,7 @@
 package com.ruoyi.approve.bean.vo;
 
 import com.ruoyi.approve.pojo.ApprovalTemplate;
+import com.ruoyi.basic.dto.StorageBlobVO;
 import lombok.Data;
 
 import java.util.List;
@@ -11,4 +12,6 @@
     private List<ApprovalTemplateNodeVo> nodes;
 
     private String createdUserName;
+
+    private List<StorageBlobVO> storageBlobDTOs;
 }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 5c5e540..5da3984 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -105,6 +105,30 @@
         }
         records.forEach(vo -> {
             vo.setBusinessName(TypeEnums.getLabelByValue(vo.getBusinessType()));
+
+            // 鏍规嵁涓氬姟绫诲瀷鏌ヨ瀵瑰簲鐨勫崟鍙�
+            if (vo.getBusinessType() != null && vo.getBusinessId() != null) {
+                if (TypeEnums.PURCHASE_APPROVAL.getCode().equals(vo.getBusinessType())) {
+                    // 閲囪喘瀹℃壒 - 鏌ヨ閲囪喘鍗曞彿
+                    PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(vo.getBusinessId());
+                    System.out.println("涓氬姟绫诲瀷锛�" + purchaseLedger.getPurchaseContractNumber());
+                    if (purchaseLedger != null) {
+                        vo.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
+                    }
+                } else if (TypeEnums.QUOTATION_APPROVAL.getCode().equals(vo.getBusinessType())) {
+                    // 鎶ヤ环瀹℃壒 - 鏌ヨ鎶ヤ环鍗曞彿
+                    SalesQuotation salesQuotation = salesQuotationMapper.selectById(vo.getBusinessId());
+                    if (salesQuotation != null) {
+                        vo.setQuotationNo(salesQuotation.getQuotationNo());
+                    }
+                } else if (TypeEnums.SHIPPING_APPROVAL.getCode().equals(vo.getBusinessType())) {
+                    // 鍙戣揣瀹℃壒 - 鏌ヨ鍙戣揣鍗曞彿
+                    ShippingInfo shippingInfo = shippingInfoMapper.selectById(vo.getBusinessId());
+                    if (shippingInfo != null) {
+                        vo.setShippingNo(shippingInfo.getShippingNo());
+                    }
+                }
+            }
         });
         Long currentUserId = SecurityUtils.getUserId();
 
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
index af5a774..a0b07d5 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
@@ -18,10 +18,15 @@
 import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover;
 import com.ruoyi.approve.service.ApprovalTemplateNodeService;
 import com.ruoyi.approve.service.ApprovalTemplateService;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
+import com.ruoyi.basic.utils.FileUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -43,6 +48,7 @@
     private final ApprovalTemplateMapper approvalTemplateMapper;
     private final ApprovalTemplateNodeService approvalTemplateNodeService;
     private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
+    private final FileUtil fileUtil;
 
     @Override
     public IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto) {
@@ -63,6 +69,11 @@
                 new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
                         .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId())
         );
+        // 淇濆瓨闄勪欢
+        List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs();
+        if (!CollectionUtils.isEmpty(storageBlobDTOs)) {
+            fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs);
+        }
         return approvalTemplateNodeService.saveApprovalTemplateNode(
                 approvalTemplateDto.getId(),
                 approvalTemplateDto.getNodes()
@@ -80,6 +91,16 @@
                 new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
                         .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId())
         );
+        // 淇濆瓨闄勪欢锛堜細鍏堝垹闄ゆ棫闄勪欢锛�
+        List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs();
+        if (!CollectionUtils.isEmpty(storageBlobDTOs)) {
+            fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs);
+        } else {
+            // 濡傛灉鍓嶇浼犵┖鏁扮粍锛屽垹闄ゆ棫闄勪欢
+            fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(
+                    ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId()
+            );
+        }
         return approvalTemplateNodeService.saveApprovalTemplateNode(
                 approvalTemplateDto.getId(),
                 approvalTemplateDto.getNodes()
@@ -107,6 +128,7 @@
                 new LambdaQueryWrapper<ApprovalTemplate>()
                         .eq(ApprovalTemplate::getDeleted, 0)
                         .eq(ApprovalTemplate::getEnabled, 1)
+                        .notIn(ApprovalTemplate::getBusinessType, List.of(5L, 6L, 7L))
                         .orderByDesc(ApprovalTemplate::getTemplateType)
                         .orderByDesc(ApprovalTemplate::getId)
         );
@@ -220,6 +242,12 @@
                 .collect(Collectors.toList());
 
         templateVo.setNodes(nodeVos);
+        // 鏌ヨ闄勪欢
+        templateVo.setStorageBlobDTOs(
+                fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(
+                        ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, template.getId()
+                )
+        );
         return templateVo;
     }
 
diff --git a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
index 506a9d8..b0c01bb 100644
--- a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -201,7 +201,8 @@
     ENTERPRISE_NEWS("enterprise_news"),
     APPROVAL_INSTANCE("approval_instance"),
     ACCOUNT_INVOICE_APPLICATION("account_invoice_application"),
-    ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice");
+    ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice"),
+    APPROVAL_TEMPLATE("approval_template");
 
     private final String type;
     RecordTypeEnum(String type) { this.type = type; }
diff --git a/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
index 66a00e7..2cc50ba 100644
--- a/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
@@ -1,30 +1,64 @@
-package com.ruoyi.framework.config;
-
-import java.util.TimeZone;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-
-/**
- * 绋嬪簭娉ㄨВ閰嶇疆
- *
- * @author ruoyi
- */
-@Configuration
-// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞�,AopContext鑳藉璁块棶
-@EnableAspectJAutoProxy(exposeProxy = true)
-// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞
-@MapperScan("com.ruoyi.**.mapper")
-public class ApplicationConfig
-{
-    /**
-     * 鏃跺尯閰嶇疆
-     */
-    @Bean
-    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
-    {
-        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
-    }
-}
+package com.ruoyi.framework.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.TimeZone;
+
+/**
+ * 绋嬪簭娉ㄨВ閰嶇疆
+ *
+ * @author ruoyi
+ */
+@Configuration
+// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞�,AopContext鑳藉璁块棶
+@EnableAspectJAutoProxy(exposeProxy = true)
+// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞
+@MapperScan("com.ruoyi.**.mapper")
+public class ApplicationConfig {
+    /**
+     * 鏃跺尯閰嶇疆
+     */
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
+        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+    }
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        // 鍏ㄥ眬蹇界暐鏈煡瀛楁
+        mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        JavaTimeModule module = new JavaTimeModule();
+        // LocalDateTime锛氭敮鎸� yyyy-MM-dd HH:mm:ss
+        DateTimeFormatter dateTimeFormatter =
+                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        module.addDeserializer(LocalDateTime.class,
+                new LocalDateTimeDeserializer(dateTimeFormatter));
+        module.addSerializer(LocalDateTime.class,
+                new LocalDateTimeSerializer(dateTimeFormatter));
+        // LocalDate锛氭敮鎸� yyyy-MM-dd
+        DateTimeFormatter dateFormatter =
+                DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        module.addDeserializer(LocalDate.class,
+                new LocalDateDeserializer(dateFormatter));
+        module.addSerializer(LocalDate.class,
+                new LocalDateSerializer(dateFormatter));
+        mapper.registerModule(module);
+        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        return mapper;
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index 15b56ea..4e6ff58 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -180,8 +180,8 @@
         boolean save = this.add(req);
         // 鍙戣揣瀹℃壒
         ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
-        approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId());
-        approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName());
+        approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId());
+        approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName());
         approvalInstance.setBusinessId(req.getId());
         approvalInstance.setBusinessType(7L);
         approvalInstance.setCurrentLevel(1);
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 91c9a5a..93f19f3 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,5 +1,8 @@
 # Spring閰嶇疆
 spring:
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
   main:
     allow-circular-references: true
   profiles:

--
Gitblit v1.9.3