From 1cdccaf0a06161fcc2a5797e617508c8a7e1f300 Mon Sep 17 00:00:00 2001
From: p-honggang.li <p-honggang.li@pcitc.com>
Date: 星期六, 06 九月 2025 03:14:53 +0800
Subject: [PATCH] 修改订单创建,发起工作流调用,采用后端处理,增加事务,修改审核同通过和驳回处理,修改根据用户id获取工作流代办信息,再根据代办ids查询订单信息

---
 src/main/java/com/webmanage/config/WorkflowProperties.java          |   93 +++++++++
 src/main/java/com/webmanage/dto/CreateOrderDTO.java                 |    2 
 src/main/java/com/webmanage/entity/OrderInfo.java                   |    7 
 src/main/resources/mapper/OrderInfoMapper.xml                       |   16 +
 src/main/java/com/webmanage/dto/OrderApprovalDTO.java               |    4 
 src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java  |  398 +++++++++++++++++++++++++++++++++++++++
 src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java |    9 
 src/main/java/com/webmanage/config/RestTemplateConfig.java          |   30 +++
 src/main/java/com/webmanage/mapper/OrderInfoMapper.java             |    5 
 src/main/java/com/webmanage/controller/FileController.java          |    4 
 src/main/java/com/webmanage/dto/OrderQueryDTO.java                  |    8 
 src/main/resources/application.yml                                  |   23 ++
 12 files changed, 582 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/webmanage/config/RestTemplateConfig.java b/src/main/java/com/webmanage/config/RestTemplateConfig.java
new file mode 100644
index 0000000..fcd4df6
--- /dev/null
+++ b/src/main/java/com/webmanage/config/RestTemplateConfig.java
@@ -0,0 +1,30 @@
+package com.webmanage.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * RestTemplate閰嶇疆绫�
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Autowired
+    private WorkflowProperties workflowProperties;
+
+    @Bean
+    public RestTemplate restTemplate() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        
+        // 璁剧疆杩炴帴瓒呮椂鏃堕棿
+        factory.setConnectTimeout(workflowProperties.getRestTemplate().getConnectTimeout());
+        
+        // 璁剧疆璇诲彇瓒呮椂鏃堕棿
+        factory.setReadTimeout(workflowProperties.getRestTemplate().getReadTimeout());
+        
+        return new RestTemplate(factory);
+    }
+}
diff --git a/src/main/java/com/webmanage/config/WorkflowProperties.java b/src/main/java/com/webmanage/config/WorkflowProperties.java
new file mode 100644
index 0000000..19ac786
--- /dev/null
+++ b/src/main/java/com/webmanage/config/WorkflowProperties.java
@@ -0,0 +1,93 @@
+package com.webmanage.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 宸ヤ綔娴侀厤缃睘鎬�
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "workflow")
+public class WorkflowProperties {
+
+    /**
+     * 瀹℃壒鏈嶅姟閰嶇疆
+     */
+    private Approval approval = new Approval();
+
+    /**
+     * 宸ヤ綔娴佹湇鍔¢厤缃�
+     */
+    private Process process = new Process();
+
+    /**
+     * RestTemplate瓒呮椂閰嶇疆
+     */
+    private RestTemplate restTemplate = new RestTemplate();
+
+    @Data
+    public static class Approval {
+        /**
+         * 瀹℃壒鏈嶅姟鍩虹URL
+         */
+        private String baseUrl;
+
+        /**
+         * 妯℃澘鍏崇郴鏌ヨURL
+         */
+        private String templateRelationUrl;
+
+        /**
+         * 鍗曚綅ID
+         */
+        private String unitId;
+    }
+
+    @Data
+    public static class Process {
+        /**
+         * 宸ヤ綔娴佹湇鍔″熀纭�URL
+         */
+        private String baseUrl;
+
+        /**
+         * 鍚姩娴佺▼URL
+         */
+        private String startProcessUrl;
+
+        /**
+         * 鏌ヨ浠e姙URL
+         */
+        private String findTodoUrl;
+
+        /**
+         * 鏌ヨ宸插姙URL
+         */
+        private String findDoneUrl;
+
+        /**
+         * 鎻愪氦娴佺▼URL
+         */
+        private String completeUrl;
+
+        /**
+         * 椹冲洖娴佺▼URL
+         */
+        private String rejectUrl;
+    }
+
+    @Data
+    public static class RestTemplate {
+        /**
+         * 杩炴帴瓒呮椂鏃堕棿锛堟绉掞級
+         */
+        private int connectTimeout = 5000;
+
+        /**
+         * 璇诲彇瓒呮椂鏃堕棿锛堟绉掞級
+         */
+        private int readTimeout = 10000;
+    }
+}
diff --git a/src/main/java/com/webmanage/controller/FileController.java b/src/main/java/com/webmanage/controller/FileController.java
index 429b28b..359011c 100644
--- a/src/main/java/com/webmanage/controller/FileController.java
+++ b/src/main/java/com/webmanage/controller/FileController.java
@@ -48,8 +48,8 @@
             }
             
             // 妫�鏌ユ枃浠跺ぇ灏忥紙闄愬埗涓�100MB锛�
-            if (file.getSize() > 100 * 1024 * 1024) {
-                return Result.error("鏂囦欢澶у皬涓嶈兘瓒呰繃100MB");
+            if (file.getSize() > 500 * 1024 * 1024) {
+                return Result.error("鏂囦欢澶у皬涓嶈兘瓒呰繃500MB");
             }
             
             String fileName = minioService.uploadFile(file, folder);
diff --git a/src/main/java/com/webmanage/dto/CreateOrderDTO.java b/src/main/java/com/webmanage/dto/CreateOrderDTO.java
index 18f8b32..d520ea1 100644
--- a/src/main/java/com/webmanage/dto/CreateOrderDTO.java
+++ b/src/main/java/com/webmanage/dto/CreateOrderDTO.java
@@ -47,4 +47,6 @@
     @Valid
     @NotEmpty(message = "璁㈠崟鏄庣粏涓嶈兘涓虹┖")
     private List<CreateOrderItemDTO> items;
+
+    private String processdefId;
 }
diff --git a/src/main/java/com/webmanage/dto/OrderApprovalDTO.java b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java
index 3846aba..d7ae141 100644
--- a/src/main/java/com/webmanage/dto/OrderApprovalDTO.java
+++ b/src/main/java/com/webmanage/dto/OrderApprovalDTO.java
@@ -6,6 +6,7 @@
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Data
 @ApiModel("璁㈠崟瀹℃壒DTO")
@@ -34,4 +35,7 @@
     @ApiModelProperty("瀹℃壒缁撴灉锛氶�氳繃/椹冲洖")
     @NotBlank(message = "瀹℃壒缁撴灉涓嶈兘涓虹┖")
     private String approvalResult;
+
+    @ApiModelProperty("璁㈠崟璇︽儏鍒楄〃")
+    private List<UpdateOrderDetailDTO.UpdateOrderDetailItemDTO> orderDetails;
 }
diff --git a/src/main/java/com/webmanage/dto/OrderQueryDTO.java b/src/main/java/com/webmanage/dto/OrderQueryDTO.java
index 0300db9..99e896e 100644
--- a/src/main/java/com/webmanage/dto/OrderQueryDTO.java
+++ b/src/main/java/com/webmanage/dto/OrderQueryDTO.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 璁㈠崟鏌ヨ鏉′欢DTO
@@ -75,5 +76,10 @@
     
     @ApiModelProperty("浜у搧绫诲瀷瀛愮骇ID")
     private String productSubTypeId;
-    
+    //宸ヤ綔娴佺被鍨� 0 浠e姙 1 宸插姙
+    private Integer workFlowType;
+    // 娴佺▼瀹炰緥涓氬姟绫诲瀷
+    private String businessType;
+    // 閮ㄩ棬id
+    private String departmentId;
 }
diff --git a/src/main/java/com/webmanage/entity/OrderInfo.java b/src/main/java/com/webmanage/entity/OrderInfo.java
index edf4937..cfc28bc 100644
--- a/src/main/java/com/webmanage/entity/OrderInfo.java
+++ b/src/main/java/com/webmanage/entity/OrderInfo.java
@@ -147,5 +147,10 @@
      */
     @TableField("is_evaluate")
     private String isEvaluate;
-    
+
+    /**
+     * 宸ヤ綔娴佷换鍔d
+     */
+    @TableField("task_id")
+    private String taskId;
 }
diff --git a/src/main/java/com/webmanage/mapper/OrderInfoMapper.java b/src/main/java/com/webmanage/mapper/OrderInfoMapper.java
index 1785bdc..89a80cd 100644
--- a/src/main/java/com/webmanage/mapper/OrderInfoMapper.java
+++ b/src/main/java/com/webmanage/mapper/OrderInfoMapper.java
@@ -42,7 +42,7 @@
                                                    @Param("productName") String productName, @Param("providerName") String providerName,
                                                    @Param("orderId") String orderId, @Param("applyTimeStart") String applyTimeStart,
                                                    @Param("applyTimeEnd") String applyTimeEnd, @Param("orderBy") String orderBy,
-                                                   @Param("orderDirection") String orderDirection);
+                                                   @Param("orderDirection") String orderDirection, @Param("workFlowIds") java.util.List<String> workFlowIds);
 
     /**
      * 鍒嗛〉鏌ヨ寰呭鎵硅鍗曞垪琛紙鏀寔浜у搧鏉′欢锛�
@@ -51,7 +51,8 @@
                                                    @Param("productName") String productName, @Param("providerName") String providerName,
                                                    @Param("orderId") String orderId, @Param("applyTimeStart") String applyTimeStart,
                                                    @Param("applyTimeEnd") String applyTimeEnd, @Param("orderBy") String orderBy,
-                                                   @Param("orderDirection") String orderDirection, @Param("productIds") java.util.List<String> productIds);
+                                                   @Param("orderDirection") String orderDirection, @Param("productIds") java.util.List<String> productIds,
+                                                   @Param("workFlowIds") java.util.List<String> workFlowIds);
 
     /**
      * 鍒嗛〉鏌ヨ涔板璁㈠崟鍒楄〃锛堟敮鎸佷骇鍝佹潯浠讹級
diff --git a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
index 72522e1..7655559 100644
--- a/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/OrderInfoServiceImpl.java
@@ -26,23 +26,35 @@
 import com.webmanage.service.OrderInfoService;
 import com.webmanage.service.OrderNoService;
 import com.webmanage.service.MinioService;
+import com.webmanage.config.WorkflowProperties;
 import com.webmanage.vo.OrderAttachmentVO;
 import com.webmanage.vo.OrderDetailItemVO;
 import com.webmanage.vo.OrderDetailVO;
 import com.webmanage.vo.OrderEvaluationVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.http.ResponseEntity;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.MediaType;
+import org.springframework.http.HttpHeaders;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.stream.Collectors;
+import java.util.Objects;
 
 /**
  * 璁㈠崟淇℃伅Service瀹炵幇绫�
@@ -71,6 +83,12 @@
 
     @Resource
     private ReportResultSubmissionMapper reportResultSubmissionMapper;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private WorkflowProperties workflowProperties;
 
     @Override
     public PageResult<OrderDetailVO> getBuyerOrderPage(OrderQueryDTO queryDTO) {
@@ -167,13 +185,34 @@
         // 鍒涘缓鍒嗛〉瀵硅薄
         Page<OrderInfo> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());
 
+        // 鍩轰簬workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎
+        List<String> workFlowIds = fetchWorkflowProcessInstanceIds(
+            queryDTO.getWorkFlowType(),
+            queryDTO.getUserId(),
+            queryDTO.getDepartmentId(),
+            queryDTO.getBusinessType(),
+            queryDTO.getPageNum(),
+            queryDTO.getPageSize()
+        );
+
+        // 濡傛灉娌℃湁浠讳綍娴佺▼ID锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
+        if (workFlowIds == null || workFlowIds.isEmpty()) {
+            return new PageResult<OrderDetailVO>(
+                java.util.Collections.emptyList(),
+                0L,
+                queryDTO.getPageNum().longValue(),
+                queryDTO.getPageSize().longValue(),
+                0L
+            );
+        }
+
         // 鎵ц鍒嗛〉鏌ヨ
         IPage<OrderInfo> result = baseMapper.selectPendingApprovalOrderPage(
             page, queryDTO.getOrderStatus(), queryDTO.getProductName(), queryDTO.getProviderName(),
             queryDTO.getOrderId(),
             queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null,
             queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null,
-            queryDTO.getOrderBy(), queryDTO.getOrderDirection()
+            queryDTO.getOrderBy(), queryDTO.getOrderDirection(), workFlowIds
         );
 
         // 灏嗚鍗曚笌璇︽儏鑱旇〃灏佽鍒癡O
@@ -227,12 +266,33 @@
         Page<OrderInfo> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());
 
         // 鎵ц鍒嗛〉鏌ヨ
+        // 鍩轰簬workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎
+        List<String> workFlowIds = fetchWorkflowProcessInstanceIds(
+            queryDTO.getWorkFlowType(),
+            queryDTO.getUserId(),
+            queryDTO.getDepartmentId(),
+            queryDTO.getBusinessType(),
+            queryDTO.getPageNum(),
+            queryDTO.getPageSize()
+        );
+
+        // 濡傛灉娌℃湁浠讳綍娴佺▼ID锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
+        if (workFlowIds == null || workFlowIds.isEmpty()) {
+            return new PageResult<OrderInfo>(
+                java.util.Collections.emptyList(),
+                0L,
+                queryDTO.getPageNum().longValue(),
+                queryDTO.getPageSize().longValue(),
+                0L
+            );
+        }
+
         IPage<OrderInfo> result = baseMapper.selectPendingApprovalOrderPageWithProductConditions(
             page, queryDTO.getOrderStatus(), queryDTO.getProductName(), queryDTO.getProviderName(),
             queryDTO.getOrderId(),
             queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null,
             queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null,
-            queryDTO.getOrderBy(), queryDTO.getOrderDirection(), productIds
+            queryDTO.getOrderBy(), queryDTO.getOrderDirection(), productIds, workFlowIds
         );
 
         // 鏋勫缓杩斿洖缁撴灉
@@ -432,6 +492,34 @@
         }
         // 鐢熸垚璁㈠崟缂栧彿
         String orderId = orderNoService.generateOrderNo();
+        
+        // 鍏堣皟鐢ㄥ伐浣滄祦鎺ュ彛锛岃幏鍙栧伐浣滄祦ID
+        String workflowId = null;
+        String taskId = null;
+        try {
+            // 妫�鏌ユ槸鍚︽湁浠锋牸绫诲瀷涓�"鍗忚"鐨勬槑缁嗛」
+            boolean hasAgreementPrice = createOrderDTO.getItems().stream()
+                    .anyMatch(item -> "鍗忚".equals(item.getPriceType()));
+            
+            // 鏍规嵁鏄惁鍖呭惈鍗忚纭畾type鍊�
+            String type = hasAgreementPrice ? "trade_agreement" : "trade_point";
+            
+            // 璋冪敤鑾峰彇娴佺▼妯℃澘ID鐨勬帴鍙�
+            // String processTemplateId = getProcessTemplateId(type);
+            
+            if (createOrderDTO.getProcessdefId() != null) {
+                // 璋冪敤鍙戣捣宸ヤ綔娴佺殑鎺ュ彛
+                Map<String,Object> resMap = startWorkflowProcess(createOrderDTO.getProcessdefId(), createOrderDTO.getUserId(), type);
+                workflowId = resMap.get("processinstId").toString();
+                taskId = resMap.get("taskId").toString();
+            } else {
+                throw new BusinessException("娴佺▼瀹氫箟Id涓虹┖!");
+            }
+        } catch (Exception e) {
+            log.error("璋冪敤宸ヤ綔娴佹帴鍙eけ璐ワ紝璁㈠崟ID: {}", orderId, e);
+            // 宸ヤ綔娴佽皟鐢ㄥけ璐ワ紝鎶涘嚭寮傚父瑙﹀彂浜嬪姟鍥炴粴
+            throw new BusinessException("宸ヤ綔娴佽皟鐢ㄥけ璐�: " + e.getMessage());
+        }
 
         // 璁$畻鎬婚噾棰�
         BigDecimal totalAmount = BigDecimal.ZERO;
@@ -465,6 +553,8 @@
         orderInfo.setPaymentStatus("鏈敮浠�");
         orderInfo.setBuyerRemarks(createOrderDTO.getBuyerRemarks());
         orderInfo.setIsEvaluate("鏈瘎浠�");
+        orderInfo.setWorkflowId(workflowId); // 璁剧疆宸ヤ綔娴両D
+        orderInfo.setTaskId(taskId);
         orderInfo.setCreatedAt(LocalDateTime.now());
         orderInfo.setUpdatedAt(LocalDateTime.now());
 
@@ -827,6 +917,58 @@
             throw new BusinessException("鎻掑叆瀹℃壒璁板綍澶辫触");
         }
 
+        // 鏇存柊浜ゆ槗淇℃伅澶囨敞锛堝彧鏇存柊remarks锛屼笉鏇存柊璁㈠崟鐘舵�侊級
+        // 鍙洿鏂拌鍗曡鎯呭娉紝涓嶆洿鏂拌鍗曠姸鎬�
+        if(orderApprovalDTO.getOrderDetails() != null) {
+            for (UpdateOrderDetailDTO.UpdateOrderDetailItemDTO itemDTO : orderApprovalDTO.getOrderDetails()) {
+                if (itemDTO.getId() == null) {
+                    continue;
+                }
+
+                OrderDetail orderDetail = orderDetailMapper.selectById(itemDTO.getId());
+                if (orderDetail == null) {
+                    log.warn("璁㈠崟璇︽儏涓嶅瓨鍦紝ID: {}", itemDTO.getId());
+                    continue;
+                }
+
+                // 鏇存柊澶囨敞
+                orderDetail.setRemarks(itemDTO.getRemarks());
+                orderDetail.setUpdatedAt(LocalDateTime.now());
+
+                int detailUpdated = orderDetailMapper.updateById(orderDetail);
+                if (detailUpdated <= 0) {
+                    log.warn("鏇存柊璁㈠崟璇︽儏澶辫触锛孖D: {}", itemDTO.getId());
+                }
+            }
+        }
+
+        // 鏇存柊璁㈠崟鐘舵�侊紙閫氳繃 -> 涓嬩竴涓紱椹冲洖 -> 涓婁竴涓級
+        String currentStatus = orderInfo.getOrderStatus();
+        if (!StringUtils.hasText(currentStatus)) {
+            throw new BusinessException("璁㈠崟褰撳墠鐘舵�佷负绌�");
+        }
+        boolean isReject = orderApprovalDTO.getApprovalResult().contains("椹冲洖");
+        String targetStatus = isReject ? getPreviousOrderStatus(currentStatus) : getNextOrderStatus(currentStatus);
+        if (targetStatus == null) {
+            throw new BusinessException((isReject ? "宸叉槸鍒濆鐘舵�侊紝鏃犳硶鍥為��" : "宸叉槸鏈�缁堢姸鎬侊紝鏃犳硶缁х画娴佽浆"));
+        }
+        orderInfo.setOrderStatus(targetStatus);
+        orderInfo.setUpdatedAt(LocalDateTime.now());
+
+        int updated = this.baseMapper.updateById(orderInfo);
+        if (updated <= 0) {
+            throw new BusinessException("鏇存柊璁㈠崟鐘舵�佸け璐�");
+        }
+
+        log.info("璁㈠崟鐘舵�佹洿鏂版垚鍔燂紝璁㈠崟ID: {}, 浠� {} 鏇存柊涓� {}", orderInfo.getOrderId(), currentStatus, targetStatus);
+        // 鏍规嵁瀹℃壒缁撴灉璋冪敤鎻愪氦鎴栭┏鍥炴帴鍙�
+        String comment = orderApprovalDTO.getApprovalResult().contains("椹冲洖") ? "瀹℃牳椹冲洖" : "瀹℃牳閫氳繃";
+        if ("瀹℃牳椹冲洖".equals(comment)) {
+            rejectWorkflowTask(orderInfo.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment);
+        } else {
+            completeWorkflowTask(orderInfo.getTaskId(), String.valueOf(orderApprovalDTO.getApproverId()), comment);
+        }
+
         log.info("瀹℃壒璁板綍娣诲姞鎴愬姛锛岃鍗旾D: {}, 瀹℃壒绫诲瀷: {}, 瀹℃壒缁撴灉: {}, 瀹℃壒浜�: {}, 瀹℃壒鎰忚: {}", 
                 orderApprovalDTO.getOrderId(),
                 orderApprovalDTO.getApprovalType(),
@@ -940,9 +1082,10 @@
     private String getNextOrderStatus(String currentStatus) {
         switch (currentStatus) {
             case "寰呬笂浼犳枃浠�":
-                return "寰呮巿鏉�";
+                return "寰呭鎵规巿鏉�";
+            case "寰呭鎵规巿鏉�":
             case "寰呮巿鏉�":
-                return "寰呬氦鏄撶‘璁�";
+                return  "寰呬氦鏄撶‘璁�";
             case "寰呬氦鏄撶‘璁�":
                 return "宸插畬鎴�";
             case "宸插畬鎴�":
@@ -963,7 +1106,7 @@
         switch (currentStatus) {
             case "寰呬笂浼犳枃浠�":
                 return null; // 鍒濆鐘舵��
-            case "寰呮巿鏉�":
+            case "寰呭鎵规巿鏉�":
                 return "寰呬笂浼犳枃浠�";
             case "寰呬氦鏄撶‘璁�":
                 return "寰呮巿鏉�";
@@ -1213,4 +1356,249 @@
         orderInfo.setIsEvaluate("宸茶瘎浠�");
         return this.updateById(orderInfo);
     }
+
+    /**
+     * 鑾峰彇娴佺▼妯℃澘ID
+     * @param type 绫诲瀷鍙傛暟
+     * @return 娴佺▼妯℃澘ID
+     */
+    private String getProcessTemplateId(String type) {
+        try {
+            String url = workflowProperties.getApproval().getBaseUrl() + workflowProperties.getApproval().getTemplateRelationUrl();
+            
+            // 鏋勫缓璇锋眰鍙傛暟
+            Map<String, Object> params = new HashMap<>();
+            params.put("type", type);
+            params.put("unitId", workflowProperties.getApproval().getUnitId());
+            
+            // 鍙戦�丳OST璇锋眰
+            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
+                url, 
+                HttpMethod.POST, 
+                new HttpEntity<>(params), 
+                new ParameterizedTypeReference<Map<String, Object>>() {}
+            );
+            
+            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
+                Map<String, Object> responseBody = response.getBody();
+                return (String) responseBody.get("processTemplateId");
+            } else {
+                log.warn("鑾峰彇娴佺▼妯℃澘ID澶辫触锛屽搷搴旂姸鎬�: {}", response.getStatusCode());
+                return null;
+            }
+        } catch (Exception e) {
+            log.error("璋冪敤鑾峰彇娴佺▼妯℃澘ID鎺ュ彛澶辫触", e);
+            throw new BusinessException("鑾峰彇娴佺▼妯℃澘ID澶辫触: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍚姩宸ヤ綔娴佹祦绋�
+     * @param processTemplateId 娴佺▼妯℃澘ID
+     * @param userId 鐢ㄦ埛ID
+     * @param businessKey 涓氬姟閿紙璁㈠崟ID锛�
+     * @return 娴佺▼瀹炰緥ID
+     */
+    private Map<String,Object> startWorkflowProcess(String processTemplateId, String userId, String businessKey) {
+        try {
+            String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getStartProcessUrl();
+            
+            // 鏋勫缓璇锋眰鍙傛暟
+            Map<String, Object> params = new HashMap<>();
+            params.put("processdefId", processTemplateId);
+            params.put("userid", userId);
+            params.put("businessKey", businessKey);
+            
+            // 鍙戦�丳OST璇锋眰
+            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
+                url, 
+                HttpMethod.POST, 
+                new HttpEntity<>(params), 
+                new ParameterizedTypeReference<Map<String, Object>>() {}
+            );
+            
+            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
+                Object code = response.getBody().get("code");
+                boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code));
+                if (!ok) {
+                    throw new BusinessException("宸ヤ綔娴佸惎鍔ㄤ换鍔″け璐ワ紝杩斿洖鐮�: " + code);
+                }
+                Map<String, Object> data = (Map<String, Object>) response.getBody().get("data");
+                if (data == null) {
+                    throw new BusinessException("宸ヤ綔娴佸惎鍔ㄤ换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖");
+                }
+                return  data;
+            } else {
+                throw new BusinessException("鍚姩宸ヤ綔娴佸け璐ワ紝鍝嶅簲鐘舵��:"+response.getStatusCode());
+            }
+        } catch (Exception e) {
+            log.error("璋冪敤鍚姩宸ヤ綔娴佹帴鍙eけ璐�", e);
+            throw new BusinessException("鍚姩宸ヤ綔娴佸け璐�: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鎻愪氦娴佺▼浠诲姟
+     * @param taskId 浠诲姟ID锛堜娇鐢ㄨ鍗曠殑workflowId锛�
+     * @param userId 鐢ㄦ埛ID
+     * @param comment 瀹℃壒鎰忚锛堝锛氬鏍搁�氳繃锛�
+     */
+    private void completeWorkflowTask(String taskId, String userId, String comment) {
+        try {
+            String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getCompleteUrl();
+            Map<String, Object> params = new HashMap<>();
+            params.put("taskId", taskId);
+            params.put("userid", userId);
+            params.put("commponet", comment);
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers);
+
+            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
+                url,
+                HttpMethod.POST,
+                entity,
+                new ParameterizedTypeReference<Map<String, Object>>() {}
+            );
+
+            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
+                Object code = response.getBody().get("code");
+                boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code));
+                if (!ok) {
+                    throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔″け璐ワ紝杩斿洖鐮�: " + code);
+                }
+                Map<?, ?> data = (Map<?, ?>) response.getBody().get("data");
+                if (data == null) {
+                    throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖");
+                }
+                log.info("瀹屾垚宸ヤ綔娴佷换鍔℃垚鍔燂紝processinstId: {}", data.get("processinstId"));
+            } else {
+                throw new BusinessException("宸ヤ綔娴佸畬鎴愪换鍔℃帴鍙h皟鐢ㄥけ璐ワ紝HTTP鐘舵��: " + response.getStatusCode());
+            }
+        } catch (Exception e) {
+            log.error("鎻愪氦宸ヤ綔娴佸け璐�", e);
+            throw new BusinessException("鎻愪氦宸ヤ綔娴佸け璐�: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 椹冲洖娴佺▼浠诲姟
+     */
+    private void rejectWorkflowTask(String taskId, String userId, String comment) {
+        try {
+            String url = workflowProperties.getProcess().getBaseUrl() + workflowProperties.getProcess().getRejectUrl();
+            Map<String, Object> params = new HashMap<>();
+            params.put("taskId", taskId);
+            params.put("userid", userId);
+            params.put("commponet", comment);
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers);
+
+            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
+                url,
+                HttpMethod.POST,
+                entity,
+                new ParameterizedTypeReference<Map<String, Object>>() {}
+            );
+
+            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
+                Object code = response.getBody().get("code");
+                boolean ok = (code instanceof Number && ((Number) code).intValue() == 200) || "200".equals(String.valueOf(code));
+                if (!ok) {
+                    throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔″け璐ワ紝杩斿洖鐮�: " + code);
+                }
+                Map<?, ?> data = (Map<?, ?>) response.getBody().get("data");
+                if (data == null) {
+                    throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔″け璐ワ紝杩斿洖鏁版嵁涓虹┖");
+                }
+                log.info("椹冲洖宸ヤ綔娴佷换鍔℃垚鍔燂紝processinstId: {}", data.get("processinstId"));
+            } else {
+                throw new BusinessException("宸ヤ綔娴侀┏鍥炰换鍔℃帴鍙h皟鐢ㄥけ璐ワ紝HTTP鐘舵��: " + response.getStatusCode());
+            }
+        } catch (Exception e) {
+            log.error("椹冲洖宸ヤ綔娴佸け璐�", e);
+            throw new BusinessException("椹冲洖宸ヤ綔娴佸け璐�: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鎸夌収workFlowType鏌ヨ娴佺▼瀹炰緥ID闆嗗悎
+     * workFlowType: 0=浠e姙锛�1=宸插姙
+     */
+    private List<String> fetchWorkflowProcessInstanceIds(Integer workFlowType, String userId, String depId,String businessKey,Integer pageIndex, Integer pageSize) {
+        try {
+            if (workFlowType == null) {
+                return java.util.Collections.emptyList();
+            }
+
+            String base = workflowProperties.getProcess().getBaseUrl();
+
+            Map<String, Object> params = new HashMap<>();
+            params.put("userid", userId);
+            params.put("businessKey", businessKey);
+            params.put("pageIndex", pageIndex != null ? pageIndex : 1);
+            params.put("pageSize", pageSize != null ? pageSize : 10);
+
+            String url;
+            if (workFlowType != null && workFlowType == 0) {
+                // 浠e姙
+                url = base + workflowProperties.getProcess().getFindTodoUrl();
+                params.put("depid", depId);
+            } else {
+                // 宸插姙
+                url = base + workflowProperties.getProcess().getFindDoneUrl();
+            }
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers);
+
+            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
+                url,
+                HttpMethod.POST,
+                entity,
+                new ParameterizedTypeReference<Map<String, Object>>() {}
+            );
+
+            if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) {
+                return java.util.Collections.emptyList();
+            }
+            Object dataObj = response.getBody().get("data");
+
+            if (workFlowType != null && workFlowType == 0) {
+                if (!(dataObj instanceof java.util.List)) {
+                    return java.util.Collections.emptyList();
+                }
+                java.util.List<?> list = (java.util.List<?>) dataObj;
+                return list.stream()
+                        .filter(item -> item instanceof Map)
+                        .map(item -> (Map<?, ?>) item)
+                        .map(m -> m.get("processInstanceId"))
+                        .filter(Objects::nonNull)
+                        .map(Object::toString)
+                        .collect(Collectors.toList());
+            }else {
+                if (!(dataObj instanceof Map)) {
+                    return java.util.Collections.emptyList();
+                }
+                Map<?,?> map = (Map<?,?>) dataObj;
+                Object dataObj1 = ((Map<?, ?>) dataObj).get("list");
+                java.util.List<?> list = (java.util.List<?>) dataObj1;
+                return list.stream()
+                        .filter(item -> item instanceof Map)
+                        .map(item -> (Map<?, ?>) item)
+                        .map(m -> m.get("processInstanceId"))
+                        .filter(Objects::nonNull)
+                        .map(Object::toString)
+                        .collect(Collectors.toList());
+            }
+
+        } catch (Exception e) {
+            log.error("鏌ヨ宸ヤ綔娴佸疄渚婭D澶辫触", e);
+            return java.util.Collections.emptyList();
+        }
+    }
 }
diff --git a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
index 00d5dfd..a75f266 100644
--- a/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
+++ b/src/main/java/com/webmanage/service/impl/PointsFlowServiceImpl.java
@@ -182,10 +182,10 @@
         }
 
         // 姣忔棩涓婇檺鏍¢獙锛堝垎鍒牎楠岋級
-        if (applyUser && userRule.getIsLimit() != null && userRule.getIsLimit() == 0) {
+        if (applyUser && userRule.getIsLimit() != null && userRule.getIsLimit() == 1) {
             checkDailyLimitByRule(userId, unitId, userRule, userPointsChange);
         }
-        if (applyProvider && providerRule.getIsLimit() != null && providerRule.getIsLimit() == 0) {
+        if (applyProvider && providerRule.getIsLimit() != null && providerRule.getIsLimit() == 1) {
             checkDailyLimitByRule(providerId, providerId, providerRule, providerPointsChange);
         }
 
@@ -357,11 +357,14 @@
         QueryWrapper<PointsFlow> wrapper = new QueryWrapper<>();
         wrapper.eq("deleted", 0)
                .eq("user_id", userId)
-               .eq("unit_id", unitId)
 //               .eq("data_category", pointsRule.getRuleName())
                 .eq("rule_id",pointsRule.getId())
+                .eq("data_type", 0)
                .ge("flow_time", startOfDay)
                .le("flow_time", endOfDay);
+        if(StringUtils.hasText(unitId)){
+            wrapper.eq("unit_id", unitId);
+        }
 
         List<PointsFlow> todayFlows = list(wrapper);
         
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 405988c..06f1cb3 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -7,7 +7,7 @@
   application:
     name: trade-back
   profiles:
-    active: test
+    active: prod
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss
     time-zone: GMT+8
@@ -70,3 +70,24 @@
       thread-name-prefix: async-cart-
       wait-for-tasks-to-complete-on-shutdown: true
       await-termination-seconds: 30
+
+# 宸ヤ綔娴侀厤缃�
+workflow:
+  # 瀹℃壒鏈嶅姟閰嶇疆
+  approval:
+    base-url: http://192.168.20.51:7098
+    template-relation-url: /approval/templateRelation/relationByType
+    unit-id: "1"
+  # 宸ヤ綔娴佹湇鍔¢厤缃�
+  process:
+    base-url: http://192.168.20.51:7098
+    # base-url: http://36.133.126.111:7098
+    start-process-url: /app/workflow/startProcessAndComplete
+    find-todo-url: /app/workflow/findToList
+    find-done-url: /app/workflow/findHistoryByPage
+    complete-url: /app/workflow/complete
+    reject-url: /app/workflow/rejectStartNode
+  # RestTemplate瓒呮椂閰嶇疆
+  rest-template:
+    connect-timeout: 5000  # 杩炴帴瓒呮椂鏃堕棿锛堟绉掞級
+    read-timeout: 10000    # 璇诲彇瓒呮椂鏃堕棿锛堟绉掞級
\ No newline at end of file
diff --git a/src/main/resources/mapper/OrderInfoMapper.xml b/src/main/resources/mapper/OrderInfoMapper.xml
index c527c0e..9eceefb 100644
--- a/src/main/resources/mapper/OrderInfoMapper.xml
+++ b/src/main/resources/mapper/OrderInfoMapper.xml
@@ -153,7 +153,7 @@
         <include refid="Base_Column_List"/>
         FROM tb_order_info
         WHERE deleted = 0
-        AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸茶瘎浠�')
+        AND order_status IN ('寰呬笂浼犳枃浠�', '寰呭鎵规巿鏉�','寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸插彇娑�')
         <if test="orderStatus != null and orderStatus != ''">
             AND order_status = #{orderStatus}
         </if>
@@ -171,6 +171,12 @@
         </if>
         <if test="applyTimeEnd != null and applyTimeEnd != ''">
             AND apply_time &lt;= #{applyTimeEnd}::timestamp
+        </if>
+        <if test="workFlowIds != null and workFlowIds.size() > 0">
+            AND workflow_id IN
+            <foreach collection="workFlowIds" item="workFlowId" open="(" separator="," close=")">
+                #{workFlowId}
+            </foreach>
         </if>
         ORDER BY
         <choose>
@@ -197,7 +203,7 @@
         <include refid="Base_Column_List"/>
         FROM tb_order_info
         WHERE deleted = 0
-        AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸茶瘎浠�')
+        AND order_status IN ('寰呬笂浼犳枃浠�', '寰呮巿鏉�', '寰呭鎵规巿鏉�', '寰呬氦鏄撶‘璁�', '宸插畬鎴�', '宸插彇娑�')
         <if test="orderStatus != null and orderStatus != ''">
             AND order_status = #{orderStatus}
         </if>
@@ -222,6 +228,12 @@
                 #{productId}
             </foreach>
         </if>
+        <if test="workFlowIds != null and workFlowIds.size() > 0">
+            AND workflow_id IN
+            <foreach collection="workFlowIds" item="workFlowId" open="(" separator="," close=")">
+                #{workFlowId}
+            </foreach>
+        </if>
         ORDER BY
         <choose>
             <when test="orderBy != null and orderBy != ''">

--
Gitblit v1.8.0