소스 검색

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 년 전
부모
커밋
6c05800d51
32개의 변경된 파일738개의 추가작업 그리고 314개의 파일을 삭제
  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. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  8. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/EVisaConfigClient.java
  9. 4 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  10. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO4.java
  11. 10 27
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  12. 45 10
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  13. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  14. 3 2
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  15. 4 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  18. 4 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialDetectionDataService.java
  19. 29 45
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  20. 119 60
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  21. 14 10
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  22. 8 8
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  23. 31 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  24. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  25. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java
  26. 85 78
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  27. 5 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  28. 22 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  29. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  30. 65 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  31. 4 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  32. 6 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.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<>();
 

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -211,5 +211,10 @@ public class WbsTreePrivate extends BaseEntity {
     @ApiModelProperty(value = "表单是否上传附件1否 2是")
     private Integer tabFileType;
 
+    /**
+     * 试验表关联的合同段id
+     */
+    @ApiModelProperty(value = "试验表关联的合同段id")
+    private Long trialTabContractId;
 
 }

+ 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);
 
 }

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

@@ -40,7 +40,7 @@ public interface WbsTreePrivateClient {
     List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
 
     @PostMapping(API_PREFIX + "/copyBussTab")
-    boolean copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id);
+    boolean copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id, @RequestParam Long contractId);
 
     @PostMapping(API_PREFIX + "/removeBussTabInfoById")
     boolean removeBussTabInfoById(@RequestParam Long pKeyId);
@@ -60,4 +60,7 @@ public interface WbsTreePrivateClient {
     @PostMapping(API_PREFIX + "/getTrialDataInfo")
     List<Map<String, Object>> getTrialDataInfo(@RequestParam String pKeyId, @RequestParam Long id);
 
+    @PostMapping(API_PREFIX + "/saveObj")
+    void saveObj(@RequestBody WbsTreePrivate wbsTreePrivate);
+
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO4.java

@@ -51,4 +51,7 @@ public class WbsTreePrivateVO4 implements Serializable {
 
     private Integer isLinkTable;
 
+    //是否是复制的表 0=否 1=是 (复制表可以删除)
+    private Integer isCopyTab;
+
 }

+ 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, "提交成功");
-        }
     }
 
     /**

+ 45 - 10
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -42,9 +42,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.validation.Valid;
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -203,12 +201,41 @@ public class TrialDetectionController extends BladeController {
 
     @GetMapping("/self/copy-buss-tab")
     @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "自检表单复制", notes = "传入节点pKeyId,当前记录id")
-    public R<Object> copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id) {
-        return R.status(wbsTreePrivateClient.copyBussTab(pKeyId, id));
+    @ApiOperation(value = "自检表单复制", notes = "传入节点pKeyId,当前记录id,合同段id")
+    public R<Object> copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id, @RequestParam Long contractId) {
+        if (ObjectUtils.isEmpty(id)) {
+            //新增复制 复制空表
+            WbsTreePrivate wbsTreePrivate = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + pKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
+            if (wbsTreePrivate != null) {
+                List<WbsTreePrivate> wbsTreePrivateList = jdbcTemplate.query("select * from m_wbs_tree_private where is_deleted = 0 and status = 1 and id =" + wbsTreePrivate.getId() + " and wbs_id =" + wbsTreePrivate.getWbsId() + " and wbs_type =" + wbsTreePrivate.getWbsType() + " and project_id = " + wbsTreePrivate.getProjectId() + " and parent_id = " + wbsTreePrivate.getParentId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateList.stream().sorted(Comparator.comparing(WbsTreePrivate::getCreateTime).reversed()).collect(Collectors.toList());
+                wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                wbsTreePrivate.setCreateTime(new Date());
+                String nodeName = wbsTreePrivates.get(0).getNodeName();
+                if (nodeName.contains("__")) {
+                    String[] oldName = nodeName.split("__");
+                    nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
+                } else {
+                    nodeName = nodeName + "__" + 1;
+                }
+                wbsTreePrivate.setNodeName(nodeName);
+                wbsTreePrivate.setTrialTabContractId(contractId); //试验表绑定当前合同段
+
+                //新增
+                wbsTreePrivateClient.saveObj(wbsTreePrivate);
+                return R.success("复制成功");
+            }
+        } else {
+            //编辑复制 复制数据 附件文件
+            if (wbsTreePrivateClient.copyBussTab(pKeyId, id, contractId)) {
+                return R.success("复制成功");
+            }
+        }
+
+        return R.fail("复制失败");
     }
 
-    @PostMapping("/self/remove-buss-tabInfo")
+    @PostMapping("/self/remove-buss-tab")
     @ApiOperationSupport(order = 16)
     @ApiOperation(value = "自检删除复制的表", notes = "传入节点pKeyId")
     public R<Object> removeBussTabInfo(@RequestParam Long pKeyId) {
@@ -348,10 +375,18 @@ public class TrialDetectionController extends BladeController {
     }
 
     @PostMapping("/self/record-sample/getData")
+    @ApiOperationSupport(order = 26)
+    @ApiOperation(value = "获取关联取样当前节点下所有表中对应的Data与Key", notes = "传入试验树节点nodePKeyId、合同段contractId、样品sampleIds")
+    public R<List<Map<String, String>>> getRecordSampleData(String nodePKeyId, String contractId, String sampleIds) {
+        List<Map<String, String>> result = iTrialDetectionDataService.getRecordSampleData(nodePKeyId, contractId, sampleIds);
+        return R.data(result);
+    }
+
+    @PostMapping("/self/record-projectPosition/getData")
     @ApiOperationSupport(order = 27)
-    @ApiOperation(value = "获取关联取样信息对应在表中的Data与Key", notes = "传入tabPKeyId、样品sampleIds")
-    public R<Map<String, String>> getRecordSampleData(String tabPKeyId, String sampleIds) {
-        Map<String, String> result = iTrialDetectionDataService.getRecordSampleData(tabPKeyId, sampleIds);
+    @ApiOperation(value = "获取工程部位信息当前节点下所有表中对应的Data与Key", notes = "传入试验树节点nodePKeyId、合同段contractId、工程部位信息的工序节点projectPositionIds")
+    public R<List<Map<String, String>>> getProjectPositionData(String nodePKeyId, String contractId, String projectPositionIds) {
+        List<Map<String, String>> result = iTrialDetectionDataService.getProjectPositionData(nodePKeyId, contractId, projectPositionIds);
         return R.data(result);
     }
 

+ 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;

+ 4 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -148,6 +148,8 @@
                    ELSE 1 END AS colorStatus
         from (
                  SELECT
+                     wtc.sort,
+                     wtc.create_time,
                      wtc.is_concealed_works_node AS "isConcealedWorksNode",
                      wtc.p_key_id AS primaryKeyId,
                      wtc.id,
@@ -178,8 +180,8 @@
         AND wtc.node_type != 111
         AND wtc.parent_id = #{parentId}
         AND wtc.contract_id = #{contractId}
-        ORDER BY wtc.sort,wtc.create_time
-		) c
+        -- ORDER BY wtc.sort,wtc.create_time
+		) c ORDER BY c.sort,c.create_time
     </select>
 
 

+ 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;
 
     /**
      * 启动流程

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

@@ -7,6 +7,7 @@ import org.springblade.business.entity.TrialDetectionData;
 import org.springblade.business.vo.TrialDetectionDataVO;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.List;
 import java.util.Map;
 
 public interface ITrialDetectionDataService extends BaseService<TrialDetectionData> {
@@ -19,6 +20,8 @@ public interface ITrialDetectionDataService extends BaseService<TrialDetectionDa
 
     boolean dataCopy(TrialDetectionDataDTO dto);
 
-    Map<String, String> getRecordSampleData(String tabPKeyId,String sampleIds);
+    List<Map<String, String>> getRecordSampleData(String nodePKeyId, String contractId, String sampleIds);
+
+    List<Map<String, String>> getProjectPositionData(String nodePKeyId, String contractId, String projectPositionIds);
 
 }

+ 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;
         }
     }
 

+ 119 - 60
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -25,6 +25,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.utils.PageUtil;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -32,10 +33,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -156,78 +154,139 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
     }
 
     @Override
-    public Map<String, String> getRecordSampleData(String tabPKeyId, String sampleIds) {
-        Map<String, String> resultMap = new HashMap<>();
-        //获取表中的数据信息Data、以及对应的Key值
-        WbsTreePrivate wbsTreePrivate = jdbcTemplate.query("select init_table_name,html_url,p_key_id from m_wbs_tree_private where p_key_id =" + tabPKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
-        if (wbsTreePrivate == null) {
-            return null;
-        }
-        if (wbsTreePrivate.getHtmlUrl() == null) {
+    public List<Map<String, String>> getRecordSampleData(String nodePKeyId, String contractId, String sampleIds) {
+        if (StringUtils.isEmpty(sampleIds)) {
             return null;
         }
+        //获取关联的样品信息
+        List<TrialSampleInfo> trialSampleInfoList = jdbcTemplate.query("select material_name,specification_number,sample_description,material_count from u_trial_sample_info where id in(" + sampleIds + ")", new BeanPropertyRowMapper<>(TrialSampleInfo.class));
+        List<String> names = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialName).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<String> numbers = trialSampleInfoList.stream().map(TrialSampleInfo::getSpecificationNumber).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<String> descriptions = trialSampleInfoList.stream().map(TrialSampleInfo::getSampleDescription).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<Integer> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+
+        List<Map<String, String>> resultMapList = new ArrayList<>();
 
-        // 匹配关联
-        try {
-            File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-            String htmlString = IoUtil.readToString(new FileInputStream(file1));
-            Document doc = Jsoup.parse(htmlString);
-            Elements ypName = doc.select("el-input[placeholder~=样品名称.*]");
-            Elements ypNumber = doc.select("el-input[placeholder~=样品编号.*]");
-            Elements ypCount = doc.select("el-input[placeholder~=样品数量.*]");
-            Elements ypMs = doc.select("el-input[placeholder~=样品描述.*]");
-
-            //获取样品信息
-            if (StringUtils.isNotEmpty(sampleIds)) {
-                List<TrialSampleInfo> trialSampleInfoList = jdbcTemplate.query("select material_name,specification_number,sample_description,material_count from u_trial_sample_info where id in(" + sampleIds + ")", new BeanPropertyRowMapper<>(TrialSampleInfo.class));
-                List<String> names = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialName).collect(Collectors.toList());
-                List<String> numbers = trialSampleInfoList.stream().map(TrialSampleInfo::getSpecificationNumber).collect(Collectors.toList());
-                List<String> descriptions = trialSampleInfoList.stream().map(TrialSampleInfo::getSampleDescription).collect(Collectors.toList());
-                List<Integer> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).collect(Collectors.toList());
-
-                //样品名称
-                if (ypName.size() >= 1) {
-                    for (Element element : ypName) {
-                        int trIndex = Integer.parseInt(element.attr("trindex"));
-                        if (trIndex <= 6) {
-                            resultMap.put(element.attr("keyName"), ObjectUtils.isNotEmpty(names) ? StringUtils.join(names, "、") : "");
+        //获取当前合同段下的试验节点下的表
+        WbsTreePrivate trialNode = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + nodePKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
+        if (trialNode != null) {
+            List<WbsTreePrivate> trialNodeTabs = jdbcTemplate.query("select p_key_id,html_url from m_wbs_tree_private where html_url is not null and is_deleted = 0 and status = 1 and type = 2 and parent_id =" + trialNode.getId() + " and project_id =" + trialNode.getProjectId() + " and wbs_id = " + trialNode.getWbsId() + " and wbs_type = " + trialNode.getWbsType() + " and (trial_tab_contract_id is null OR (trial_tab_contract_id = " + contractId + "))", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            for (WbsTreePrivate trialNodeTab : trialNodeTabs) {
+                // 匹配关联
+                try {
+                    Map<String, String> map = new HashMap<>();
+                    File file1 = ResourceUtil.getFile(trialNodeTab.getHtmlUrl());
+                    String htmlString = IoUtil.readToString(new FileInputStream(file1));
+                    Document doc = Jsoup.parse(htmlString);
+                    Elements ypName = doc.select("el-input[placeholder~=样品名称.*]");
+                    Elements ypNumber = doc.select("el-input[placeholder~=样品编号.*]");
+                    Elements ypCount = doc.select("el-input[placeholder~=样品数量.*]");
+                    Elements ypMs = doc.select("el-input[placeholder~=样品描述.*]");
+
+                    //样品名称
+                    if (ypName.size() >= 1) {
+                        for (Element element : ypName) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(names) ? StringUtils.join(names, "、") : "");
+                            }
                         }
                     }
-                }
-                //样品编号
-                if (ypNumber.size() >= 1) {
-                    for (Element element : ypNumber) {
-                        int trIndex = Integer.parseInt(element.attr("trindex"));
-                        if (trIndex <= 6) {
-                            resultMap.put(element.attr("keyName"), ObjectUtils.isNotEmpty(numbers) ? StringUtils.join(numbers, "、") : "");
+                    //样品编号
+                    if (ypNumber.size() >= 1) {
+                        for (Element element : ypNumber) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(numbers) ? StringUtils.join(numbers, "、") : "");
+                            }
                         }
                     }
+                    //样品数量
+                    if (ypCount.size() >= 1) {
+                        for (Element element : ypCount) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().reduce(Integer::sum).orElse(0).toString() : "");
+                            }
+                        }
+                    }
+                    //样品描述
+                    if (ypMs.size() >= 1) {
+                        for (Element element : ypMs) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(descriptions) ? StringUtils.join(descriptions, "、") : "");
+                            }
+                        }
+                    }
+
+                    map.put("tabPKeyId", trialNodeTab.getPKeyId().toString());
+                    if (map.size() > 1) {
+                        resultMapList.add(map);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
-                //样品数量
-                if (ypCount.size() >= 1) {
-                    for (Element element : ypCount) {
-                        int trIndex = Integer.parseInt(element.attr("trindex"));
-                        if (trIndex <= 6) {
-                            resultMap.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().reduce(Integer::sum).orElse(0).toString() : "");
+            }
+        }
+        return resultMapList;
+    }
+
+    @Override
+    public List<Map<String, String>> getProjectPositionData(String nodePKeyId, String contractId, String projectPositionIds) {
+        if (StringUtils.isEmpty(projectPositionIds)) {
+            return null;
+        }
+        //拼接工程部位names 单位、分部、分项
+        List<WbsTreeContract> query = jdbcTemplate.query("select node_name,node_type,id,ancestors from m_wbs_tree_contract where node_type is not null and p_key_id in(" + projectPositionIds + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        List<WbsTreeContract> dw = query.stream().filter(f -> f.getNodeType().equals(1)).collect(Collectors.toList());
+        List<WbsTreeContract> fb = query.stream().filter(f -> f.getNodeType().equals(2)).collect(Collectors.toList());
+        List<WbsTreeContract> fx = query.stream().filter(f -> f.getNodeType().equals(4)).collect(Collectors.toList());
+        Set<String> set = new HashSet<>();
+        for (WbsTreeContract fxNode : fx) {
+            for (WbsTreeContract fbNode : fb) {
+                if (fxNode.getAncestors().contains(fbNode.getId().toString())) {
+                    for (WbsTreeContract dwNode : dw) {
+                        if (fbNode.getAncestors().contains(dwNode.getId().toString())) {
+                            set.add(dwNode.getNodeName() + "/" + fbNode.getNodeName() + "/" + fxNode.getNodeName());
                         }
                     }
                 }
-                //样品描述
-                if (ypMs.size() >= 1) {
-                    for (Element element : ypMs) {
-                        int trIndex = Integer.parseInt(element.attr("trindex"));
-                        if (trIndex <= 6) {
-                            resultMap.put(element.attr("keyName"), ObjectUtils.isNotEmpty(descriptions) ? StringUtils.join(descriptions, "、") : "");
+            }
+        }
+        if (set.size() > 0) {
+            List<Map<String, String>> resultMapList = new ArrayList<>();
+            //获取当前合同段下的试验节点下的表
+            WbsTreePrivate trialNode = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + nodePKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
+            if (trialNode != null) {
+                List<WbsTreePrivate> trialNodeTabs = jdbcTemplate.query("select p_key_id,html_url from m_wbs_tree_private where html_url is not null and is_deleted = 0 and status = 1 and type = 2 and parent_id =" + trialNode.getId() + " and project_id =" + trialNode.getProjectId() + " and wbs_id = " + trialNode.getWbsId() + " and wbs_type = " + trialNode.getWbsType() + " and (trial_tab_contract_id is null OR (trial_tab_contract_id = " + contractId + "))", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+                for (WbsTreePrivate trialNodeTab : trialNodeTabs) {
+                    //匹配关联
+                    try {
+                        Map<String, String> map = new HashMap<>();
+                        File file1 = ResourceUtil.getFile(trialNodeTab.getHtmlUrl());
+                        String htmlString = IoUtil.readToString(new FileInputStream(file1));
+                        Document doc = Jsoup.parse(htmlString);
+                        Elements ppName = doc.select("el-input[placeholder~=工程部位.*]");
+                        //工程部位
+                        if (ppName.size() >= 1) {
+                            for (Element element : ppName) {
+                                int trIndex = Integer.parseInt(element.attr("trindex"));
+                                if (trIndex <= 6) {
+                                    map.put("tabPKeyId", trialNodeTab.getPKeyId().toString());
+                                    map.put(element.attr("keyName"), StringUtils.join(set, "、"));
+                                    resultMapList.add(map);
+                                }
+                            }
                         }
+                    } catch (Exception e) {
+                        e.printStackTrace();
                     }
                 }
-
             }
-        } catch (Exception e) {
-            e.printStackTrace();
+            return resultMapList;
         }
-
-        return resultMap;
+        return null;
     }
 
 }

+ 14 - 10
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -934,33 +934,37 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                     .isNotNull(TrialSampleInfo::getSpecificationModel)
                     .in(TrialSampleInfo::getId, ids));
             List<String> samplingLocations = trialSampleInfos.stream().map(TrialSampleInfo::getSamplingLocation).collect(Collectors.toList());
-            String samplingLocation = samplingLocations.stream().findAny().orElse(null);
+            /*String samplingLocation = samplingLocations.stream().findAny().orElse(null);
             if (samplingLocations.size() > 1 && StringUtils.isNotEmpty(samplingLocation)) {
                 samplingLocation = samplingLocation + "等" + samplingLocations.size() + "个取样地点";
-            }
+            }*/
+            String samplingLocation = org.apache.commons.lang.StringUtils.join(samplingLocations, "、");
 
-            List<String> supplierUnits = trialSampleInfos.stream().map(TrialSampleInfo::getSupplierUnit).collect(Collectors.toList());
-            String supplierUnit = supplierUnits.stream().findAny().orElse(null);
+            List<String> calculationUnits = trialSampleInfos.stream().map(TrialSampleInfo::getCalculationUnit).collect(Collectors.toList());
+            /*String supplierUnit = supplierUnits.stream().findAny().orElse(null);
             if (supplierUnits.size() > 1 && StringUtils.isNotEmpty(supplierUnit)) {
                 supplierUnit = supplierUnit + "等" + supplierUnits.size() + "个单位";
-            }
+            }*/
+            String calculationUnit = org.apache.commons.lang.StringUtils.join(calculationUnits, "、");
 
             List<String> specificationNumbers = trialSampleInfos.stream().map(TrialSampleInfo::getSpecificationNumber).collect(Collectors.toList());
-            String specificationNumber = supplierUnits.stream().findAny().orElse(null);
+            /*String specificationNumber = supplierUnits.stream().findAny().orElse(null);
             if (specificationNumbers.size() > 1 && StringUtils.isNotEmpty(specificationNumber)) {
                 specificationNumber = specificationNumber + "等" + specificationNumbers.size() + "个样品编号";
-            }
+            }*/
+            String specificationNumber = org.apache.commons.lang.StringUtils.join(specificationNumbers, "、");
 
             List<String> specificationModels = trialSampleInfos.stream().map(TrialSampleInfo::getSpecificationModel).collect(Collectors.toList());
-            String specificationModel = supplierUnits.stream().findAny().orElse(null);
+            /*String specificationModel = supplierUnits.stream().findAny().orElse(null);
             if (specificationModels.size() > 1 && StringUtils.isNotEmpty(specificationModel)) {
                 specificationModel = specificationModel + "等" + specificationModels.size() + "个规格类型";
-            }
+            }*/
+            String specificationModel = org.apache.commons.lang.StringUtils.join(specificationModels, "、");
 
             //更新
             this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
                     .set(TrialSelfInspectionRecord::getSamplingLocation, samplingLocation)
-                    .set(TrialSelfInspectionRecord::getCompany, supplierUnit)
+                    .set(TrialSelfInspectionRecord::getCompany, calculationUnit)
                     .set(TrialSelfInspectionRecord::getSpecificationNumber, specificationNumber)
                     .set(TrialSelfInspectionRecord::getSpecificationModel, specificationModel)
                     .eq(TrialSelfInspectionRecord::getId, dto.getId())

+ 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;
     }

+ 31 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1348,7 +1348,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
     })
     public R getBussDataInfo(Long pkeyId) throws FileNotFoundException {
-        return excelTabService.getBussDataInfo(pkeyId,0);
+        return excelTabService.getBussDataInfo(pkeyId, 0);
     }
 
 
@@ -1384,7 +1384,7 @@ public class ExcelTabController extends BladeController {
 
         long newPkId = SnowFlakeUtil.getId();
         WbsTreeContract wbsTreeContract = new WbsTreeContract();
-        BeanUtil.copy(wbsInfo,wbsTreeContract);
+        BeanUtil.copy(wbsInfo, wbsTreeContract);
         wbsTreeContract.setPKeyId(newPkId);
         wbsTreeContract.setCreateTime(new Date());
         wbsTreeContract.setTabGroupId(tabGroupId);
@@ -1414,7 +1414,7 @@ public class ExcelTabController extends BladeController {
         String querySql = "insert into " + tabName + " (id,p_key_id," + colkeys + ") select '" + newPkId + "','" + newPkId + "'," + colkeys + " from " + tabName + " where p_key_id=" + pkeyId;
         jdbcTemplate.execute(querySql);
         wbsTreeContractService.save(wbsTreeContract);
-        for(WbsTreeContract wbsTreeCont:wbsTreeContractList2){
+        for (WbsTreeContract wbsTreeCont : wbsTreeContractList2) {
 
             UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
             updateWrapper.in("p_key_id", wbsTreeCont.getPKeyId() + "");
@@ -1646,25 +1646,32 @@ public class ExcelTabController extends BladeController {
        */
         /*全加载,或者可以优化成依赖加载*/
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
-        if(tableInfoList!=null){
+        if (tableInfoList != null) {
             List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeid, "1", contractId, projectId);
-            List<Long> tableAllIds=tableAll.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
-            if(tableAll.size()>tableInfoList.size()){
-                List<Long> exclude=tableInfoList.stream().map(TableInfo::getPkeyId).map(Long::parseLong).collect(Collectors.toList());
-                JSONArray extra =new JSONArray();
-                for(Long pk:tableAllIds){
-                    if(!exclude.contains(pk)) {
+            List<Long> tableAllIds = tableAll.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
+            if (tableAll.size() > tableInfoList.size()) {
+                List<Long> exclude = tableInfoList.stream().map(TableInfo::getPkeyId).map(Long::parseLong).collect(Collectors.toList());
+                JSONArray extra = new JSONArray();
+                for (Long pk : tableAllIds) {
+                    if (!exclude.contains(pk)) {
                         R bussDataInfo = this.excelTabService.getBussDataInfo(pk, 1);
-                        Map<String, Object>  jo = (Map<String, Object>) bussDataInfo.getData();
-                        jo.put("pkeyId",pk);
+                        Map<String, Object> jo = (Map<String, Object>) bussDataInfo.getData();
+                        jo.put("pkeyId", pk);
                         extra.add(jo);
                     }
                 }
                 List<TableInfo> tableInfoExtra = this.excelTabService.getTableInfoList(extra);
                 /*默认额外加载的默认不更新,除非有元素数据变动*/
-                tableInfoExtra.removeIf(e->e.getPkeyId()==null);
-                TableInfo example=tableInfoList.get(0);
-                tableInfoExtra.forEach(e->{e.setToBeUpdated(false);e.setBusinessId(null);e.setContractId(example.getContractId());e.setClassify(example.getClassify());e.setProjectId(example.getProjectId());e.setGroupId(example.getGroupId());});
+                tableInfoExtra.removeIf(e -> e.getPkeyId() == null);
+                TableInfo example = tableInfoList.get(0);
+                tableInfoExtra.forEach(e -> {
+                    e.setToBeUpdated(false);
+                    e.setBusinessId(null);
+                    e.setContractId(example.getContractId());
+                    e.setClassify(example.getClassify());
+                    e.setProjectId(example.getProjectId());
+                    e.setGroupId(example.getGroupId());
+                });
                 tableInfoList.addAll(tableInfoExtra);
                 tableInfoList.sort(Comparator.comparingInt(a -> tableAllIds.indexOf(Long.parseLong(a.getPkeyId()))));
             }
@@ -1718,7 +1725,7 @@ public class ExcelTabController extends BladeController {
     }
 
     /**
-     *  删除模板
+     * 删除模板
      */
     @PostMapping("/delete-template")
     @ApiOperationSupport(order = 5)
@@ -1729,13 +1736,13 @@ public class ExcelTabController extends BladeController {
             return R.fail("请上传清表");
         }
         return R.status(excelTabService.update(new LambdaUpdateWrapper<ExcelTab>()
-                .set(ExcelTab::getTemplateExtension,null)
-                .set(ExcelTab::getTemplateFileUrl,null)
-                .eq(ExcelTab::getId,excelTab.getId())));
+                .set(ExcelTab::getTemplateExtension, null)
+                .set(ExcelTab::getTemplateFileUrl, null)
+                .eq(ExcelTab::getId, excelTab.getId())));
     }
 
     /**
-     *  模版下载
+     * 模版下载
      */
     @GetMapping("/down-template-file")
     @ApiOperationSupport(order = 31)
@@ -2855,10 +2862,11 @@ public class ExcelTabController extends BladeController {
     @ApiOperation(value = "获取试验用户保存数据", notes = "获取试验用户保存数据")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "pkeyId", value = "表id", required = true),
-            @ApiImplicitParam(name = "id", value = "记录id-当做groupId", required = true)
+            @ApiImplicitParam(name = "id", value = "记录id-当做groupId", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段id", required = true)
     })
-    public R<List<Map<String, Object>>> getBussDataInfoTrial(Long id, Long pkeyId) {
-        List<Map<String, Object>> bussDataInfoTrial = excelTabService.getBussDataInfoTrial(id, pkeyId);
+    public R<List<Map<String, Object>>> getBussDataInfoTrial(Long id, Long pkeyId, Long contractId) {
+        List<Map<String, Object>> bussDataInfoTrial = excelTabService.getBussDataInfoTrial(id, pkeyId, contractId);
         return R.data(bussDataInfoTrial);
     }
 

+ 4 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -629,13 +629,13 @@ public class WbsTreePrivateController extends BladeController {
             if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {
                 //按钮状态
                 treePrivate.setPdfUrl(null);
-                //treePrivate.setIsBussShow(1); //新增时通过项目wbs表的isBussShow字段单独控制
+                treePrivate.setIsBussShow(ObjectUtil.isNotEmpty(treePrivate.getIsBussShow()) ? treePrivate.getIsBussShow() : 1); //新增时通过项目wbs表的isBussShow字段单独控制
                 treePrivate.setIsTabPdf(1);
                 treePrivate.setTabFileType(1);
             }
 
             //试验编辑
-            if (ObjectUtil.isNotEmpty(id)) {
+            else if (ObjectUtil.isNotEmpty(id)) {
                 //获取当前试验记录信息中表的按钮状态
                 String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + id;
                 Map<Long, TrialSelfDataRecord> map = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class)).stream().collect(Collectors.toMap(TrialSelfDataRecord::getTabId, Function.identity()));
@@ -648,13 +648,13 @@ public class WbsTreePrivateController extends BladeController {
                     treePrivate.setTabFileType(record.getIsTabFileType());
                 } else {
                     treePrivate.setPdfUrl(null);
-                    //treePrivate.setIsBussShow(1); //没有记录的就根据项目wbs表的isBussShow字段单独控制
+                    treePrivate.setIsBussShow(ObjectUtil.isNotEmpty(treePrivate.getIsBussShow()) ? treePrivate.getIsBussShow() : 1); //没有记录的就根据项目wbs表的isBussShow字段单独控制
                     treePrivate.setIsTabPdf(1);
                     treePrivate.setTabFileType(1);
                 }
 
                 //表单数据
-                List<Map<String, Object>> bussDataInfoTrial = iExcelTabService.getBussDataInfoTrial(id, treePrivate.getPKeyId());
+                List<Map<String, Object>> bussDataInfoTrial = iExcelTabService.getBussDataInfoTrial(id, treePrivate.getPKeyId(), Long.parseLong(contractId));
                 if (bussDataInfoTrial != null && bussDataInfoTrial.size() > 0) {
                     bussDataInfoTrial.get(0).remove("group_id");
                     treePrivate.setBussDataInfoTrial(bussDataInfoTrial.get(0));

+ 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){

+ 85 - 78
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -9,6 +9,7 @@ import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
@@ -70,96 +71,97 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
 
     @Override
-    public boolean copyBussTab(Long pKeyId, Long id) {
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pKeyId));
-        List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getId, wbsTreePrivate.getId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getWbsType, wbsTreePrivate.getWbsType()).eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getParentId, wbsTreePrivate.getParentId()));
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateList.stream().sorted(Comparator.comparing(WbsTreePrivate::getCreateTime).reversed()).collect(Collectors.toList());
-        long newPkId = SnowFlakeUtil.getId();
-        wbsTreePrivate.setPKeyId(newPkId);
-        wbsTreePrivate.setCreateTime(new Date());
-        String nodeName = wbsTreePrivates.get(0).getNodeName();
-        if (nodeName.contains("__")) {
-            String[] oldName = nodeName.split("__");
-            nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
-        } else {
-            nodeName = nodeName + "__" + 1;
-        }
-        wbsTreePrivate.setNodeName(nodeName);
-        String tabName = wbsTreePrivate.getInitTableName();
-
-        //字段查询 并去掉公式字段
-        /*String colkeys = "SELECT GROUP_CONCAT(e_key) as colkeys from m_wbs_tree a ,m_wbs_form_element b WHERE a.init_table_name = '" + tabName + "' and a.id=b.f_id and b.id not in(SELECT element_id from m_formula c where c.is_deleted=0) ";
-        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
-        colkeys = stringObjectMap.get("colkeys") + "";*/
-
-        //查询字段
-        String sql = "select COLUMN_NAME from information_schema.`COLUMNS` WHERE table_name = '" + tabName + "'";
-        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
-        List<Object> filed = new ArrayList<>();
-        for (Map<String, Object> map : maps) {
-            Object column_name = map.get("COLUMN_NAME");
-            if (!(("id").equals(column_name) || ("group_id").equals(column_name) || ("p_key_id").equals(column_name))) {
-                filed.add(column_name);
+    public boolean copyBussTab(Long pKeyId, Long id, Long contractId) {
+        if (ObjectUtils.isNotEmpty(id)) {
+            //编辑复制 复制数据 附件文件
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pKeyId));
+            List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getId, wbsTreePrivate.getId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getWbsType, wbsTreePrivate.getWbsType()).eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getParentId, wbsTreePrivate.getParentId()));
+            List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateList.stream().sorted(Comparator.comparing(WbsTreePrivate::getCreateTime).reversed()).collect(Collectors.toList());
+            long newPkId = SnowFlakeUtil.getId();
+            wbsTreePrivate.setPKeyId(newPkId);
+            wbsTreePrivate.setCreateTime(new Date());
+            String nodeName = wbsTreePrivates.get(0).getNodeName();
+            if (nodeName.contains("__")) {
+                String[] oldName = nodeName.split("__");
+                nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
+            } else {
+                nodeName = nodeName + "__" + 1;
             }
-        }
-
-        //复制表数据
-        String querySql = "select " + org.apache.commons.lang3.StringUtils.join(filed, ",") + " from " + tabName + " where p_key_id=" + pKeyId + " and group_id = " + id;
-        List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
-        if (dataList.size() >= 1) {
-            Map<String, Object> dataMap2 = dataList.get(0);
-
-            dataMap2.remove("id");
-            dataMap2.remove("p_key_id");
-            dataMap2.remove("group_id");
-
-            //sql组装
-            String sqlInfo = "";
-
-            sqlInfo = "INSERT INTO " + tabName + " ( ";
-
-            StringBuilder keyStr = new StringBuilder("id,p_key_id,group_id,");
-            StringBuilder valStr = new StringBuilder(SnowFlakeUtil.getId() + "," + wbsTreePrivate.getPKeyId() + "," + id + ",");
-
-            for (String keys : dataMap2.keySet()) {
-                if (!(dataMap2.get(keys) + "").equals("null")) {
-                    keyStr.append(keys).append(",");
-                    valStr.append("'").append(dataMap2.get(keys)).append("',");
+            wbsTreePrivate.setNodeName(nodeName);
+            wbsTreePrivate.setTrialTabContractId(contractId); //试验表绑定当前合同段
+
+            String tabName = wbsTreePrivate.getInitTableName();
+
+            //查询字段
+            String sql = "select COLUMN_NAME from information_schema.`COLUMNS` WHERE table_name = '" + tabName + "'";
+            List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+            List<Object> filed = new ArrayList<>();
+            for (Map<String, Object> map : maps) {
+                Object column_name = map.get("COLUMN_NAME");
+                if (!(("id").equals(column_name) || ("group_id").equals(column_name) || ("p_key_id").equals(column_name))) {
+                    filed.add(column_name);
                 }
             }
-            keyStr = new StringBuilder(keyStr.substring(0, keyStr.lastIndexOf(",")));
-            valStr = new StringBuilder(valStr.substring(0, valStr.lastIndexOf(",")));
 
-            sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+            //复制表数据
+            String querySql = "select " + org.apache.commons.lang3.StringUtils.join(filed, ",") + " from " + tabName + " where p_key_id=" + pKeyId + " and group_id = " + id;
+            List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
+            if (dataList.size() >= 1) {
+                Map<String, Object> dataMap2 = dataList.get(0);
+
+                dataMap2.remove("id");
+                dataMap2.remove("p_key_id");
+                dataMap2.remove("group_id");
+
+                //sql组装
+                String sqlInfo = "";
+                sqlInfo = "INSERT INTO " + tabName + " ( ";
+                StringBuilder keyStr = new StringBuilder("id,p_key_id,group_id,");
+                StringBuilder valStr = new StringBuilder(SnowFlakeUtil.getId() + "," + wbsTreePrivate.getPKeyId() + "," + id + ",");
+                for (String keys : dataMap2.keySet()) {
+                    if (!(dataMap2.get(keys) + "").equals("null")) {
+                        keyStr.append(keys).append(",");
+                        valStr.append("'").append(dataMap2.get(keys)).append("',");
+                    }
+                }
+                keyStr = new StringBuilder(keyStr.substring(0, keyStr.lastIndexOf(",")));
+                valStr = new StringBuilder(valStr.substring(0, valStr.lastIndexOf(",")));
+                sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
 
-            jdbcTemplate.execute(sqlInfo);
-        }
+                jdbcTemplate.execute(sqlInfo);
+            }
 
-        //复制附件文件
-        List<TableFile> oldFiles = jdbcTemplate.query("select domain_url,name,extension,type,is_deleted,domain_pdf_url,status from m_table_file where is_deleted = 0 and tab_id = '" + pKeyId + "' and trial_record_id = " + id, new BeanPropertyRowMapper<>(TableFile.class));
-        List<TableFile> newFiles = new ArrayList<>();
-        for (TableFile oldFile : oldFiles) {
-            TableFile obj = BeanUtil.copyProperties(oldFile, TableFile.class);
-            if (obj != null) {
-                obj.setId(SnowFlakeUtil.getId());
-                obj.setTabId(newPkId + ""); //新表pKeyId
-                obj.setTrialRecordId(id);
-                newFiles.add(obj);
+            //复制附件文件
+            List<TableFile> oldFiles = jdbcTemplate.query("select domain_url,name,extension,type,is_deleted,domain_pdf_url,status from m_table_file where is_deleted = 0 and tab_id = '" + pKeyId + "' and trial_record_id = " + id, new BeanPropertyRowMapper<>(TableFile.class));
+            List<TableFile> newFiles = new ArrayList<>();
+            for (TableFile oldFile : oldFiles) {
+                TableFile obj = BeanUtil.copyProperties(oldFile, TableFile.class);
+                if (obj != null) {
+                    obj.setId(SnowFlakeUtil.getId());
+                    obj.setTabId(newPkId + ""); //新表pKeyId
+                    obj.setTrialRecordId(id);
+                    newFiles.add(obj);
+                }
+            }
+            boolean result = tableFileClient.saveBatch(newFiles);
+            if (result) {
+                wbsTreePrivateService.save(wbsTreePrivate);
+                return true;
             }
-        }
-        boolean result = tableFileClient.saveBatch(newFiles);
-        if (result) {
-            wbsTreePrivateService.save(wbsTreePrivate);
-            return true;
         }
         return false;
     }
 
     @Override
     public boolean removeBussTabInfoById(Long pKeyId) {
-        String sql = "delete from m_wbs_tree_private where p_key_id = '" + pKeyId + "'";
-        jdbcTemplate.execute(sql);
-        return true;
+        //查询当前表是否已经填报
+        List<TrialSelfDataRecord> query = jdbcTemplate.query("select id from u_trial_self_data_record where tab_id = " + pKeyId, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+        if (query.size() > 0) {
+            throw new ServiceException("当前表在试验记录中有填报数据,删除失败");
+        } else {
+            jdbcTemplate.execute("delete from m_wbs_tree_private where p_key_id = " + pKeyId);
+            return true;
+        }
     }
 
     @Override
@@ -211,7 +213,12 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
     @Override
     public List<Map<String, Object>> getTrialDataInfo(String pKeyId, Long id) {
-        return excelTabServiceImpl.getBussDataInfoTrial(id, Long.parseLong(pKeyId));
+        return excelTabServiceImpl.getBussDataInfoTrial(id, Long.parseLong(pKeyId), null);
+    }
+
+    @Override
+    public void saveObj(WbsTreePrivate wbsTreePrivate) {
+        wbsTreePrivateService.save(wbsTreePrivate);
     }
 
     private void foreachSetChildList(List<WbsTreeContractTreeVOS> vosResult, List<WbsTreePrivateVO> voList) {

+ 5 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -16,7 +16,9 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<WbsTreePrivate> selectAll(Integer wbsType);
 
     List<WbsTreePrivateVO> tree(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("wbsType") Integer wbsType);
+
     List<WbsTreeVO2> tree2(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("wbsType") Integer wbsType);
+
     List<WbsTreePrivate> selectByCondition(@Param("id") String id, @Param("wbsId") String wbsId, @Param("projectId") String projectId);
 
     void deleteByCondition(String id, String wbsId, String projectId);
@@ -81,14 +83,14 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     List<WbsNodeTableVO> selectNodeTabAndParamList(String id, String wbsId, String projectId);
 
-    void delTabProjectById(String pKeyId,String projectId);
+    void delTabProjectById(String pKeyId, String projectId);
 
-    List<WbsTreePrivateVO4> selectWbsTreeContractList(List<String> roleAndTabOwners, String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
+    List<WbsTreePrivateVO4> selectWbsTreeTrialTabList(List<String> roleAndTabOwners, String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList, String contractId);
 
     //删除表单信息
     void delTableById(String pKeyId);
 
     List<TableInfo> selectTabInfoAll();
 
-    void updateBatchByPKeyId(@Param("list")List<WbsTreePrivate> wbsTreePrivateList);
+    void updateBatchByPKeyId(@Param("list") List<WbsTreePrivate> wbsTreePrivateList);
 }

+ 22 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -36,6 +36,7 @@
         <result column="is_link_table" property="isLinkTable"/>
         <result column="import_matching_info" property="importMatchingInfo"/>
         <result column="tab_file_type" property="tabFileType"/>
+        <result column="trial_tab_contract_id" property="trialTabContractId"/>
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreePrivateVO2">
@@ -478,6 +479,7 @@
           AND wt.parent_id = #{id}
           AND wt.wbs_id = #{wbsId}
           AND wt.project_id = #{projectId}
+          AND wt.trial_tab_contract_id is null
         ORDER BY wt.sort, wt.node_name, wt.create_time
     </select>
     <select id="getByCondition" resultType="org.springblade.manager.entity.WbsTreePrivate">
@@ -693,7 +695,7 @@
 
     </select>
 
-    <select id="selectWbsTreeContractList" resultType="org.springblade.manager.vo.WbsTreePrivateVO4">
+    <select id="selectWbsTreeTrialTabList" resultType="org.springblade.manager.vo.WbsTreePrivateVO4">
         SELECT
             p_key_id,
             node_name,
@@ -715,26 +717,36 @@
             fill_rate,
             pdf_url,
             sort,
-            create_time
+            create_time,
+            (CASE WHEN locate('__',node_name) > 0 THEN 1 ELSE 0 END) AS isCopyTab
         FROM
-        m_wbs_tree_private
+            m_wbs_tree_private
         WHERE project_id = #{projectId}
-        AND wbs_id = #{wbsId}
-        AND parent_id = #{parentId}
-        AND table_type = #{tableType}
-        AND table_owner in
+            AND wbs_id = #{wbsId}
+            AND parent_id = #{parentId}
+            AND table_type = #{tableType}
+            AND table_owner in
         <foreach item="roleAndTabOwners" collection="roleAndTabOwners" open="(" close=")" separator=",">
             #{roleAndTabOwners}
         </foreach>
-        AND type = 2
-        AND status = 1
-        AND is_deleted = 0
+            AND type = 2
+            AND status = 1
+            AND is_deleted = 0
         <if test="tableOwnerList != null and tableOwnerList!= ''">
             AND table_owner in
             <foreach item="tableOwnerList" collection="tableOwnerList" open="(" close=")" separator=",">
                 #{tableOwnerList}
             </foreach>
         </if>
+        /*解决不同合同段中复制表问题*/
+        <if test="contractId == null">
+            -- 后管加载原始表
+            and trial_tab_contract_id is null
+        </if>
+        <if test="contractId != null and contractId != ''">
+            -- 客户端加载当前合同段表+原始表
+            and (trial_tab_contract_id is null OR (trial_tab_contract_id = #{contractId}))
+        </if>
         ORDER BY sort,node_name,create_time
     </select>
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -129,7 +129,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 获取试验用户端 单个表单接口数据
      */
-    List<Map<String, Object>> getBussDataInfoTrial(Long id, Long pkeyId);
+    List<Map<String, Object>> getBussDataInfoTrial(Long id, Long pkeyId,Long contractId);
 
     /**
      * 获取试验用户端 单个表单接口数据 - 关联施工

+ 65 - 10
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));
@@ -336,7 +341,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
             List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), "1", tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId());
             StopWatch stopWatch = new StopWatch();
-            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(),String.valueOf(nodeId));
+            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(), String.valueOf(nodeId));
             if (Func.isNotEmpty(keyMappers)) {
                 Map<String, Map<String, String>> coordinateMap = new HashMap<>(keyMappers.size() * 2);
                 keyMappers.forEach(e -> {
@@ -390,7 +395,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 } else {
                     currentNode.setRelateId(wtc.getId());
                 }
-                List<Long> privateIds = this.jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id=" + id + " and  project_id=" + wtc.getProjectId()+" and wbs_id="+wtc.getWbsId(), Long.class);
+                List<Long> privateIds = this.jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id=" + id + " and  project_id=" + wtc.getProjectId() + " and wbs_id=" + wtc.getWbsId(), Long.class);
                 if (Func.isNotEmpty(privateIds)) {
                     currentNode.setPrivateId(privateIds.get(0));
                     return currentNode;
@@ -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("操作失败");
@@ -857,7 +864,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public R getBussDataInfo(Long pkeyId,int type) {
+    public R getBussDataInfo(Long pkeyId, int type) {
 
         Map<String, Object> reData = new HashMap<>();
 
@@ -1059,7 +1066,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         // 移除Id 和 p_key_id
-        if(type==0){
+        if (type == 0) {
             reData.remove("id");
             reData.remove("p_key_id");
             reData.remove("classify");
@@ -1067,8 +1074,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             reData.remove("pkeyId");
             reData.remove("projectId");
         }
-        if(type==1){
-            reData.put("pkeyId",reData.get("p_key_id"));
+        if (type == 1) {
+            reData.put("pkeyId", reData.get("p_key_id"));
         }
         reData.put("tabGroupId", wbsTreeContract.getTabGroupId());
         return R.data(reData);
@@ -1102,7 +1109,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             return R.fail("失败");
         }
 
-        Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId,0).getData();
+        Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId, 0).getData();
 
         // 获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
@@ -1286,7 +1293,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Elements tdsx = ytzData.select("td");
                                 if (Integer.parseInt(trtd[1]) < tdsx.size()) {
                                     Element data = ytzData.select("td").get(Integer.parseInt(trtd[1]));
-                                    if(data.html().indexOf("el-tooltip") >= 0){
+                                    if (data.html().indexOf("el-tooltip") >= 0) {
                                         data = data.children().get(0);
                                     }
 
@@ -1517,7 +1524,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      * 试验 获取填报信息
      */
     @Override
-    public List<Map<String, Object>> getBussDataInfoTrial(Long groupId, Long pkeyId) {
+    public List<Map<String, Object>> getBussDataInfoTrial(Long groupId, Long pkeyId, Long contractId) {
         List<Map<String, Object>> list = new ArrayList<>();
         Map<String, Object> reData = new HashMap<>();
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
@@ -1550,6 +1557,54 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             //匹配
             Elements bgHB = doc.select("el-input[placeholder~=报告编号.*]");
             Elements jlBH = doc.select("el-input[placeholder~=记录编号.*]");
+            Elements gcName = doc.select("el-input[placeholder~=工程名称.*]");
+            Elements sgName = doc.select("el-input[placeholder~=施工单位.*]");
+            Elements wtName = doc.select("el-input[placeholder~=委托单位.*]");
+            Elements htdName = doc.select("el-input[placeholder~=合同段/工区.*]");
+
+            ContractInfo contractInfo = jdbcTemplate.query("select construction_unit_name,supervision_unit_name,contract_name from m_contract_info where id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+            if (contractInfo != null) {
+                //施工单位
+                if (sgName.size() >= 1) {
+                    for (Element element : sgName) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(contractInfo.getConstructionUnitName()) ? contractInfo.getConstructionUnitName() : "");
+                        }
+                    }
+                }
+                //委托单位
+                if (wtName.size() >= 1) {
+                    for (Element element : wtName) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(contractInfo.getSupervisionUnitName()) ? contractInfo.getSupervisionUnitName() : "");
+                        }
+                    }
+                }
+                //合同段/工区
+                if (htdName.size() >= 1) {
+                    for (Element element : htdName) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(contractInfo.getContractName()) ? contractInfo.getContractName() : "");
+                        }
+                    }
+                }
+            }
+
+            ProjectInfo projectInfo = jdbcTemplate.query("select project_name from m_project_info where id = " + wbsTreePrivate.getProjectId(), new BeanPropertyRowMapper<>(ProjectInfo.class)).stream().findAny().orElse(null);
+            if (projectInfo != null) {
+                //工程名称
+                if (gcName.size() >= 1) {
+                    for (Element element : gcName) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            reData.put(element.attr("keyName"), ObjectUtils.isNotEmpty(projectInfo.getProjectName()) ? projectInfo.getProjectName() : "");
+                        }
+                    }
+                }
+            }
 
             TrialSelfInspectionRecord record = jdbcTemplate.query("select record_no,report_no from u_trial_self_inspection_record where id = " + groupId, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
             if (record != null) {
@@ -1847,7 +1902,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         //获取数据信息info
-        List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId);
+        List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId, Long.parseLong(contractId));
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
 
         //获取excel流 和 html流

+ 4 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
-import com.mysql.cj.x.protobuf.MysqlxDatatypes;
 import lombok.AllArgsConstructor;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
@@ -17,6 +16,7 @@ import org.jsoup.select.Elements;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.ThreadPoolMonitor;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -43,12 +43,9 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Future;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -71,7 +68,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private final TextdictInfoServiceImpl textDictInfoService;
 
     @Resource(name = "taskExecutor1")
-    private ThreadPoolExecutor executor;
+    private final ThreadPoolExecutor executor;
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -782,7 +779,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
                 }
                 if (insertList.size() > 0) {
-                    //异步新增
+
                     List<List<WbsParam>> partition1 = Lists.partition(insertList, 1000);
                     CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
                             CompletableFuture.runAsync(() -> {
@@ -1405,7 +1402,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     jdbcTemplate.execute(delSql);
                 }
 
-                //异步新增
                 List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
                 CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
                         CompletableFuture.runAsync(() -> {
@@ -1803,7 +1799,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             tableOwnerList = Func.toStrList(tableOwners);
         }
 
-        return baseMapper.selectWbsTreeContractList(roleAndTabOwners, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList);
+        return baseMapper.selectWbsTreeTrialTabList(roleAndTabOwners, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList,contractId);
     }
 
     @Override

+ 6 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -1,7 +1,6 @@
 package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
@@ -64,7 +63,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final ITableInfoService tableInfoService;
 
     @Resource(name = "taskExecutor1")
-    private ThreadPoolExecutor executor;
+    private final ThreadPoolExecutor executor;
 
     @Override
     public IPage<WbsTreeVO> selectWbsTreePage(IPage<WbsTreeVO> page, WbsTreeVO wbsTree) {
@@ -787,7 +786,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     if (pawDTO.getReferenceType().equals("public")) {
-                        //异步新增
+
                         List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
                         CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
                                 CompletableFuture.runAsync(() -> {
@@ -804,15 +803,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         }
 
                     } else if (pawDTO.getReferenceType().equals("private")) {
-                        //异步新增
+
                         List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
                         CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
                                 CompletableFuture.runAsync(() -> {
                                     wbsTreePrivateService.insertBatch(addList, 1000);
                                 }, executor)).toArray(CompletableFuture[]::new));
                         handle.join();
-                        //异步修改htmlUrl ,数据都在inserData2里
+
+                        //异步修改htmlUrl ,数据都在insertData2里
                         wbsTreePrivateService.batchResetHtmlUrl(insertData2);
+
                         //修改状态
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");