hongchuangyanfa 2 anni fa
parent
commit
52c0725b21
16 ha cambiato i file con 324 aggiunte e 88 eliminazioni
  1. 47 0
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 191 0
      blade-common/src/main/java/org/springblade/common/utils/ThreadPoolMonitor.java
  3. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  4. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java
  5. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java
  6. 6 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/EVisaTaskApprovalVO.java
  7. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/EVisaConfigClient.java
  8. 10 27
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  9. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  10. 3 2
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  11. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  12. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  13. 29 45
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  14. 8 8
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  15. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java
  16. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

+ 47 - 0
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -0,0 +1,47 @@
+package org.springblade.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+import java.util.concurrent.*;
+
+@Slf4j
+@Configuration
+@EnableAsync
+public class AsyncConfigurer {
+
+    /**
+     * cpu 核心数量
+     */
+    public static final int cpuNum = Runtime.getRuntime().availableProcessors();
+
+    /**
+     * 线程池配置
+     *
+     * @return
+     */
+    @Bean("taskExecutor1")
+    public ThreadPoolExecutor getAsyncExecutor() {
+        return new ThreadPoolMonitor(cpuNum
+                , cpuNum * 2
+                , 60
+                , TimeUnit.SECONDS
+                , new LinkedBlockingQueue<>(2000)
+                , new ThreadPoolExecutor.DiscardOldestPolicy(), "manager-thread-pool");
+    }
+
+
+    /**
+     * 线程池配置
+     *
+     * @return
+     */
+    @Bean("singleExecutor")
+    public ExecutorService getSingleExecutor() {
+        log.info("线程池初始化......");
+        return Executors.newSingleThreadExecutor();
+    }
+
+}

+ 191 - 0
blade-common/src/main/java/org/springblade/common/utils/ThreadPoolMonitor.java

@@ -0,0 +1,191 @@
+package org.springblade.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class ThreadPoolMonitor extends ThreadPoolExecutor {
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * ActiveCount
+     */
+    int ac = 0;
+
+    /**
+     * 当前所有线程消耗的时间
+     */
+    private AtomicLong totalCostTime = new AtomicLong();
+
+    /**
+     * 当前执行的线程总数
+     */
+    private AtomicLong totalTasks = new AtomicLong();
+
+    /**
+     * 线程池名称
+     */
+    private String poolName;
+
+    /**
+     * 最短 执行时间
+     */
+    private long minCostTime;
+
+    /**
+     * 最长执行时间
+     */
+    private long maxCostTime;
+
+
+    /**
+     * 保存任务开始执行的时间
+     */
+    private ThreadLocal<Long> startTime = new ThreadLocal<>();
+
+    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
+                             TimeUnit unit, BlockingQueue<Runnable> workQueue, String poolName) {
+        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
+                Executors.defaultThreadFactory(), poolName);
+    }
+
+    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
+                             TimeUnit unit, BlockingQueue<Runnable> workQueue,
+                             ThreadFactory threadFactory, String poolName) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
+        this.poolName = poolName;
+    }
+
+    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler, String poolName) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
+        this.poolName = poolName;
+    }
+
+    /**
+     * 线程池延迟关闭时(等待线程池里的任务都执行完毕),统计线程池情况
+     */
+    @Override
+    public void shutdown() {
+        // 统计已执行任务、正在执行任务、未执行任务数量
+        logger.info("{} Going to shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
+                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
+        super.shutdown();
+    }
+
+    @Override
+    public List<Runnable> shutdownNow() {
+        // 统计已执行任务、正在执行任务、未执行任务数量
+        logger.info("{} Going to immediately shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
+                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
+        return super.shutdownNow();
+    }
+
+    /**
+     * 任务执行之前,记录任务开始时间
+     */
+    @Override
+    protected void beforeExecute(Thread t, Runnable r) {
+        logger.info("{}-before: " +
+                        " PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
+                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
+                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
+                this.poolName,
+                this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
+                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
+                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
+        startTime.set(System.currentTimeMillis());
+    }
+
+    /**
+     * 任务执行之后,计算任务结束时间
+     */
+    @Override
+    protected void afterExecute(Runnable r, Throwable t) {
+        long costTime = System.currentTimeMillis() - startTime.get();
+        startTime.remove();  //删除,避免占用太多内存
+        //设置最大最小执行时间
+        maxCostTime = maxCostTime > costTime ? maxCostTime : costTime;
+        if (totalTasks.get() == 0) {
+            minCostTime = costTime;
+        }
+        minCostTime = minCostTime < costTime ? minCostTime : costTime;
+        totalCostTime.addAndGet(costTime);
+        totalTasks.incrementAndGet();
+        ac = this.getActiveCount();  //获取ActiveCount的值
+
+        logger.info("{}-after: " +
+                        "Duration: {} ms, PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
+                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
+                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
+                this.poolName,
+                costTime, this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
+                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
+                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
+    }
+
+    public int getAc() {
+        return ac;
+    }
+
+    /**
+     * 线程平均耗时
+     *
+     * @return
+     */
+    public float getAverageCostTime() {
+        return totalCostTime.get() / totalTasks.get();
+    }
+
+    /**
+     * 线程最大耗时
+     */
+    public long getMaxCostTime() {
+        return maxCostTime;
+    }
+
+    /**
+     * 线程最小耗时
+     */
+    public long getMinCostTime() {
+        return minCostTime;
+    }
+
+    /**
+     * 生成线程池所用的线程,改写了线程池默认的线程工厂
+     */
+    static class EventThreadFactory implements ThreadFactory {
+        private static final AtomicInteger poolNumber = new AtomicInteger(1);
+        private final ThreadGroup group;
+        private final AtomicInteger threadNumber = new AtomicInteger(1);
+        private final String namePrefix;
+
+        /**
+         * 初始化线程工厂
+         *
+         * @param poolName 线程池名称
+         */
+        EventThreadFactory(String poolName) {
+            SecurityManager s = System.getSecurityManager();
+            group = Objects.nonNull(s) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
+            namePrefix = poolName + "-pool-" + poolNumber.getAndIncrement() + "-thread-";
+        }
+
+        @Override
+        public Thread newThread(Runnable r) {
+            Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
+
+            if (t.isDaemon()) {
+                t.setDaemon(false);
+            }
+            if (t.getPriority() != Thread.NORM_PRIORITY) {
+                t.setPriority(Thread.NORM_PRIORITY);
+            }
+            return t;
+        }
+    }
+}

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -60,4 +60,10 @@ public interface InformationQueryClient {
 
     @PostMapping(API_PREFIX + "/updateInformationQuery")
     void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);
+
+
+    // 更新redis数据
+    @PostMapping(API_PREFIX + "/AsyncWbsTree")
+    void  AsyncWbsTree(@RequestParam String primaryKeyId,@RequestParam String parentId,@RequestParam String contractId,@RequestParam String contractIdRelation,@RequestParam String classifyType);
+
 }

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -50,7 +50,7 @@ public interface TaskClient {
      * 获取当前任务绑定的表格
      */
     @PostMapping(QUERY_BUSINESS_TABLE_E_VISA_CONFIG)
-    List<JSONObject> queryBusinessTableEVisaConfig(@RequestParam String taskId,@RequestParam String isFinal);
+    List<JSONObject> queryBusinessTableEVisaConfig(@RequestParam String taskId,@RequestParam Long userId,@RequestParam String isFinal);
 
     /**
      * 获取填报人列表

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java

@@ -36,6 +36,12 @@ public class TaskApprovalVO {
     @ApiModelProperty("批量审批")
     private String taskIds;
 
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("签字人名")
+    private String nickName;
+
     @ApiModelProperty("附件信息")
     private List<ApprovalFile> approvalFileList = new ArrayList<>();
 

+ 6 - 0
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/EVisaTaskApprovalVO.java

@@ -36,6 +36,12 @@ public class EVisaTaskApprovalVO {
     @ApiModelProperty("批量审批")
     private String taskIds;
 
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("用户ID")
+    private String nickName;
+
     @ApiModelProperty("附件信息")
     private List<ApprovalFile> approvalFileList = new ArrayList<>();
 

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/EVisaConfigClient.java

@@ -22,6 +22,6 @@ public interface EVisaConfigClient {
     List<JSONObject> queryEVisaConfigAllByTableIds(@RequestBody List<String> tableIds);
 
     @PostMapping(API_PREFIX + "/queryEVisaConfigByTableIds")
-    List<JSONObject> queryEVisaConfigByTableIds(@RequestBody List<String> tableIds, @RequestParam String contractId, @RequestParam String isFinal);
+    List<JSONObject> queryEVisaConfigByTableIds(@RequestBody List<String> tableIds, @RequestParam String contractId, @RequestParam String isFinal, @RequestParam Long userId);
 
 }

+ 10 - 27
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -39,15 +39,19 @@ import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import javax.annotation.Resource;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.time.Duration;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 /**
@@ -295,7 +299,7 @@ public class TaskController extends BladeController {
             }
 
             //审批
-            this.taskService.batchCompleteApprovalTask(taskApprovalVOS, AuthUtil.getUserId());
+            this.taskService.batchCompleteApprovalTask(taskApprovalVOS);
 
             //通过WebSocket推送数量条数
             if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
@@ -581,34 +585,13 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "完成/审批任务")
     public R<Boolean> completeApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO) throws FileNotFoundException {
-        //检查当前用户是否存在等待批次
-        //System.out.println(AuthUtil.getUserId());
-        long batchCount = this.taskBatchService.count(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, AuthUtil.getUserId()));
 
-        if (batchCount > 0) {
-            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
-                    .set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
-                    .eq(TaskParallel::getParallelProcessInstanceId, taskApprovalVO.getParallelProcessInstanceId()));
+        //生成等待批次,任务完成后删除
+        List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+        taskApprovalVOS.add(taskApprovalVO);
+        this.taskService.batchCompleteApprovalTask(taskApprovalVOS);
+        return R.data(true, "提交成功");
 
-            //生成等待批次,任务完成后删除
-            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-            taskApprovalVOS.add(taskApprovalVO);
-
-            //存在批次,当前审批的追加进队列
-            TaskBatch taskBatch = new TaskBatch(taskApprovalVO.getParallelProcessInstanceId(), JSONObject.toJSONString(taskApprovalVOS));
-            taskBatch.setCreateUser(AuthUtil.getUserId());
-            taskBatch.setCreateTime(new Date());
-            this.taskBatchService.save(taskBatch);
-
-            return R.data(true, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........");
-        } else {
-            //生成等待批次,任务完成后删除
-            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-            taskApprovalVOS.add(taskApprovalVO);
-            this.taskService.batchCompleteApprovalTask(taskApprovalVOS, AuthUtil.getUserId());
-
-            return R.data(true, "提交成功");
-        }
     }
 
     /**

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -74,4 +74,9 @@ public class InformationQueryClientImpl implements InformationQueryClient {
         updateWrapper.eq(InformationQuery::getContractId, contractId);
         iInformationQueryService.update(null, updateWrapper);
     }
+
+    @Override
+    public void AsyncWbsTree(String primaryKeyId, String parentId, String contractId, String contractIdRelation, String classifyType) {
+        iInformationQueryService.AsyncWbsTree(primaryKeyId,parentId,contractId,contractIdRelation,classifyType);
+    }
 }

+ 3 - 2
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -14,6 +14,7 @@ import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.feign.EVisaConfigClient;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 import java.util.Map;
@@ -46,7 +47,7 @@ public class TaskClientImpl implements TaskClient {
     }
 
     @Override
-    public List<JSONObject> queryBusinessTableEVisaConfig(String taskId, String isFinal) {
+    public List<JSONObject> queryBusinessTableEVisaConfig(String taskId, Long userId ,String isFinal) {
         //找到任务
         Task task = this.queryTask(taskId);
         if(task != null){
@@ -54,7 +55,7 @@ public class TaskClientImpl implements TaskClient {
             List<String> privatePrimaryKeyIds = this.informationQueryService.queryBusinessTableData(task.getFormDataId(),task.getTrialSelfInspectionRecordId());
             if(privatePrimaryKeyIds != null && privatePrimaryKeyIds.size() > 0){
                 //查询这些表格的电签配置
-                return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal);
+                return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal,userId);
             }
         }
         return null;

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java

@@ -129,6 +129,6 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
     // 测试节点信息
     List<WbsTreeContractTreeVOS> queryContractTree(String parentId, String contractId, String contractIdRelation, String classifyType);
 
-    //
+    //变更节点
     void  AsyncWbsTree(String primaryKeyId,String parentId,String contractId,String contractIdRelation,String classifyType);
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -50,7 +50,7 @@ public interface ITaskService extends BaseService<Task> {
     /**
      * 批量审批
      */
-    void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS,Long userId) throws FileNotFoundException;
+    void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) throws FileNotFoundException;
 
     /**
      * 启动流程

+ 29 - 45
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -45,8 +45,11 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.io.FileNotFoundException;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -95,6 +98,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ITrialSelfInspectionRecordService iTrialSelfInspectionRecordService;
 
+    // 线程池
+    @Resource(name = "taskExecutor1")
+    private ThreadPoolExecutor executor;
+
     @Override
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
         //返回结果
@@ -121,12 +128,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public TaskApprovalVO queryBusinessDataTask(TaskApprovalVO taskApprovalVO) {
-        int foreachNumber = 0;
+        /*int foreachNumber = 0;
         do {
             //判断锁是否存在
             if (!DistributedRedisLock.getLockStatus(taskApprovalVO.getFormDataId())) {
                 //如果不存在,直接获取并上锁,由于这个查询方法是任务方面使用,所以解锁需要在对应数据使用结束后
-                DistributedRedisLock.acquire(taskApprovalVO.getFormDataId(), 20);
+                DistributedRedisLock.acquire(taskApprovalVO.getFormDataId(), 20);*/
                 switch (taskApprovalVO.getApprovalType()) {
                     case 1:
                         //填报数据
@@ -142,7 +149,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         DistributedRedisLock.release(taskApprovalVO.getFormDataId());
                         return null;
                 }
-            } else {
+            /*} else {
                 try {
                     if (foreachNumber < 10) {
                         //如果存在锁,则等待解锁
@@ -157,8 +164,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             }
         } while (true);
         //能走到这说明找不到文件或者超过锁定次数,解锁并返回
-        DistributedRedisLock.release(taskApprovalVO.getFormDataId());
-        return taskApprovalVO;
+        DistributedRedisLock.release(taskApprovalVO.getFormDataId());*/
     }
 
     @Override
@@ -407,47 +413,41 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      * 批量电签接口
      *
      * @param taskApprovalVOS
-     * @param userId
      * @throws FileNotFoundException
      */
     @Override
-    public void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS, Long userId) throws FileNotFoundException {
+    public void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) {
+        Long  userId =AuthUtil.getUserId();
+        String  nickName =AuthUtil.getNickName();
         List<String> taskIds = taskApprovalVOS.stream().map(TaskApprovalVO::getParallelProcessInstanceId).distinct().collect(Collectors.toList());
-        long batch = this.taskBatchService.count(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, userId));
-        if (batch > 0) {
-            //修改电签状态
-            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
+        this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
                     .set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
                     .in(TaskParallel::getParallelProcessInstanceId, taskIds));
             //保存批次
-            TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
+        TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
             taskBatch.setCreateUser(AuthUtil.getUserId());
             taskBatch.setCreateTime(new Date());
-            this.taskBatchService.save(taskBatch);
-        } else {
-            //修改电签状态
-            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
-                    .set(TaskParallel::getEVisaContent, "正在电签,请稍后查看........")
-                    .in(TaskParallel::getParallelProcessInstanceId, taskIds));
 
-            //保存批次
-            TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
-            taskBatch.setCreateUser(AuthUtil.getUserId());
-            taskBatch.setCreateTime(new Date());
             this.taskBatchService.save(taskBatch);
-
-            //执行电签,结束后检查在执行是否有新的等待批次
-            this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatch.getId().toString());
-        }
-
+            String taskBatchId = taskBatch.getId().toString();
+            // 添加到 线程中
+            CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                try {
+                    this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatchId,userId,nickName);
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                }
+            }, executor);
     }
 
-    private void checkIsExsitTaskBatch(List<TaskApprovalVO> taskApprovalVOS, String batchId) throws FileNotFoundException {
+    private void checkIsExsitTaskBatch(List<TaskApprovalVO> taskApprovalVOS, String batchId,Long userId,String nickName) throws FileNotFoundException {
         boolean isContinue = true;
         while (isContinue) {
             logger.info("【任务审核】当前批次开始电签。批次ID:" + batchId);
             //执行电签
             for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
+                taskApprovalVO.setUserId(userId);
+                taskApprovalVO.setNickName(nickName);
                 String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
 
                 //TODO ============== 电签成功,修改试验状态,关联工程部位信息pdf(只有电签成功,才修改) liuYc 2023-03-16 ==============
@@ -459,26 +459,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     //已废除
                     this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
                 }
-
             }
             //删除掉对应批次
             this.taskBatchService.deletedById(batchId);
-            try {
-                //查询是否还存在对应批次(时间升序)
-                List<TaskBatch> taskBatches = this.taskBatchService.list(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, AuthUtil.getUserId()).orderByAsc(TaskBatch::getCreateTime));
-                if (taskBatches != null && taskBatches.size() > 0) {
-                    TaskBatch taskBatch = taskBatches.get(0);
-                    //获取业务参数集合
-                    taskApprovalVOS = JSONArray.parseArray(JSONObject.toJSONString(taskBatch.getJsonData()), TaskApprovalVO.class);
-                    batchId = taskBatch.getId().toString();
-                } else {
-                    logger.info("【任务审核】已无等待电签批次!当前线程结束即将释放。");
-                    isContinue = false;
-                }
-            } catch (Exception e) {
-                isContinue = false;
-                e.printStackTrace();
-            }
+            isContinue = false;
         }
     }
 

+ 8 - 8
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -209,7 +209,7 @@ public class EVisaServiceImpl implements EVisaService {
     @Override
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
         //获取任务对应表格的电签配置(合同张)
-        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
+        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), task.getUserId(),"true");
         if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
             return finalPdfUrl;
@@ -315,21 +315,21 @@ public class EVisaServiceImpl implements EVisaService {
         }
 
         //获取任务对应表格的电签配置
-        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "false");
+        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(),task.getUserId(), "false");
         if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
         }
 
         //获取当前用户的证书信息
-        List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
+        List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(task.getUserId().toString(), "");
         if (userPfxList == null || userPfxList.size() <= 0) {
             //没有签章,不执行电签
             return NOT_PFX_OR_FILE;
         }
 
         //上锁
-        if (DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)) {
+        if (DistributedRedisLock.acquire(task.getUserId().toString(), batch)) {
             try {
                 //获取需要签章的数据
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
@@ -346,9 +346,9 @@ public class EVisaServiceImpl implements EVisaService {
                     for (JSONObject eVisaConfig : eVisaConfigList) {
                         //设置签章策略
                         SealStrategyVO vo = new SealStrategyVO();
-                        vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + AuthUtil.getUserId());
-                        vo.setSealPassword(AuthUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
-                        vo.setSealPerson(AuthUtil.getNickName());
+                        vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + task.getUserId());
+                        vo.setSealPassword(task.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                        vo.setSealPerson(task.getNickName());
                         //设置签字文件
                         vo.setImageUrl(userPfxList.get(0).getSignatureFileUrl());
                         vo.setSealType("3");
@@ -387,7 +387,7 @@ public class EVisaServiceImpl implements EVisaService {
             }
         }
         //释放锁
-        DistributedRedisLock.release(AuthUtil.getUserId().toString());
+        DistributedRedisLock.release(task.getUserId().toString());
 
         return resultMessage;
     }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java

@@ -38,7 +38,7 @@ public class EVisaConfigClientImpl implements EVisaConfigClient {
     }
 
     @Override
-    public List<JSONObject> queryEVisaConfigByTableIds(List<String> tableIds, String contractId, String isFinal) {
+    public List<JSONObject> queryEVisaConfigByTableIds(List<String> tableIds, String contractId, String isFinal,Long userId) {
         List<JSONObject> jsonResult = new ArrayList<>();
 
         List<TextdictInfo> configResult;
@@ -51,7 +51,7 @@ public class EVisaConfigClientImpl implements EVisaConfigClient {
             //需要获取这条任务对应合同段下当前用户的岗位
             System.out.println(AuthUtil.getUserId());
             System.out.println(SecureUtil.getUserId());
-            List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, AuthUtil.getUserId()));
+            List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, userId));
 
             List<String> userRoleList;
             if(contractUserList != null && contractUserList.size() > 0){

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -18,6 +18,7 @@ package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -71,6 +72,7 @@ import org.springblade.manager.vo.*;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@@ -122,6 +124,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     private final TrialSelfInspectionRecordClient inspectionRecordClient;
     private final TableInfoServiceImpl tableInfoService;
 
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+
     @Override
     public IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab) {
         return page.setRecords(baseMapper.selectExcelTabPage(page, excelTab));
@@ -789,6 +794,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
                 //保存操作记录
                 this.operationLogClient.saveUserOperationLog(1, "资料填报", "工序填报页面", json);
+                // 更新redis
+                informationQueryClient.AsyncWbsTree(wbsTreeContract.getParentId()+"",wbsTreeContract.getParentId()+"",wbsTreeContract.getContractId(),"","1");
             } catch (Exception e) {
                 e.printStackTrace();
                 return R.fail("操作失败");