浏览代码

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into cr-test

# Conflicts:
#	blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/RebateIncentiveAdvPay.java
#	blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
#	blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
cr 1 月之前
父节点
当前提交
17a125f1e1
共有 73 个文件被更改,包括 2023 次插入1081 次删除
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 1 0
      blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/EntrustInfo.java
  4. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  5. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java
  6. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/EntrustDataInfoVO.java
  7. 13 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSampleInfoVO.java
  8. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java
  9. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java
  10. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  11. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java
  12. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncTrialVO.java
  13. 12 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/RebateIncentiveAdvPay.java
  14. 25 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/TokenVerifyResult.java
  15. 2 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  16. 12 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EntrustInfoController.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  18. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  19. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  20. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  21. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ImageClassificationFileClientImpl.java
  22. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  23. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  24. 4 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/WbsTreeContractStatisticsMapper.xml
  25. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  26. 462 462
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled01.java
  27. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java
  28. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  29. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  30. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  31. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  32. 57 17
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  33. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ChekSignData.java
  34. 2 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  35. 3 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  36. 210 359
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java
  37. 21 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  38. 43 20
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  39. 317 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  40. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  41. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  42. 11 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java
  43. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  44. 61 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  45. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java
  46. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  47. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  48. 19 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  49. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java
  50. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  51. 4 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  52. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  53. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  54. 169 71
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  55. 37 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  56. 35 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java
  57. 13 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  58. 6 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousServiceImpl.java
  59. 170 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  60. 9 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  61. 16 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  62. 23 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java
  63. 0 1
      blade-service/blade-meter/src/main/java/org/springblade/MeterApplication.java
  64. 2 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  65. 5 4
      blade-service/blade-system/src/main/java/org/springblade/system/controller/DictBizController.java
  66. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/feign/DictBizClient.java
  67. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.java
  68. 3 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml
  69. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/IDictBizService.java
  70. 5 2
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DictBizServiceImpl.java
  71. 50 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  72. 8 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  73. 79 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/util/RSA256Utils.java

+ 1 - 1
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -214,7 +214,7 @@ public class CommonUtil {
                 if (!((date = bis.read()) != -1)) break;
                 os.write(date);
             } catch (IOException e) {
-                throw new RuntimeException(e);
+                return new byte[0];
             }
         }
         return os.toByteArray();

+ 1 - 0
blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java

@@ -37,6 +37,7 @@ public class AuthProvider {
         DEFAULT_SKIP_URL.add("/oauth/token/**");
         DEFAULT_SKIP_URL.add("/loginByToken");
         DEFAULT_SKIP_URL.add("/loginByToken2");
+        DEFAULT_SKIP_URL.add("/loginByToken5");
         DEFAULT_SKIP_URL.add("/submit2");
         DEFAULT_SKIP_URL.add("/exceltab/callbackSave");
         DEFAULT_SKIP_URL.add("/oauth/captcha/**");

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/EntrustInfo.java

@@ -112,7 +112,7 @@ public class EntrustInfo extends BaseEntity {
 	 * 试验检测时间
 	 */
 	@ApiModelProperty(value = "处理方式")
-	private int repealType;
+	private Integer repealType;
 
 	/**
 	 * 留样开始时间

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -178,4 +178,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/saveBatchArchiveFile")
     void saveBatchArchiveFile(@RequestBody List<ArchiveFile> list);
+
+    @PostMapping(API_PREFIX + "/selectMaxSortByContractId")
+    Integer selectMaxSortByContractId(@RequestParam Long contractId);
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java

@@ -4,8 +4,10 @@ import org.springblade.business.dto.ImageClassificationFileDTO;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.common.constant.BusinessConstant;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -28,4 +30,7 @@ public interface ImageClassificationFileClient {
 
     @PostMapping(API_PREFIX + "/getImageClassificationFileById")
     ImageClassificationFile getImageClassificationFileById(@RequestBody Long id);
+
+    @PostMapping(API_PREFIX + "/getImageClassificationFileByIds")
+    List<ImageClassificationFile> getImageClassificationFileByIds(@RequestBody List<Long> imageIds);
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/EntrustDataInfoVO.java

@@ -40,6 +40,11 @@ public class EntrustDataInfoVO {
 	 */
 	@ApiModelProperty("委托单位")
 	private String entrustInfo;
+	/**
+	 * 委托单编号
+	 */
+	@ApiModelProperty("委托单编号")
+	private String entrustNo;
 	/**
 	 * 委托单位名称
 	 */

+ 13 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSampleInfoVO.java

@@ -52,4 +52,17 @@ public class TrialSampleInfoVO extends TrialSampleInfo {
     @ApiModelProperty("试验单id")
     private String testId;
 
+    /**
+     * 样品处理
+     */
+    @ApiModelProperty("样品处理")
+    private String sampleProcessing;
+
+
+    /**
+     * 样品处理时间或者原因
+     */
+    @ApiModelProperty("样品处理时间或者原因")
+    private String sampleProcessingResult;
+
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java

@@ -5,6 +5,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.FormulaOption;
 
+import java.util.List;
+
 /**
  * @author yangyj
  * @Date 2023/3/1 17:35
@@ -17,6 +19,8 @@ public class FormulaOptionVo {
     private Long parentId;
     /**元素码*/
     private String key;
+    /**元素码*/
+    private List<String> keys;
     /**合同段id*/
     private Long contractId;
     /**参数值*/

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java

@@ -49,6 +49,8 @@ public class RangeInfo {
     private List<Integer> gPass;
     @ApiModelProperty("容量")
     private String capacity;
+    @ApiModelProperty("是否复制本表:true-复制,false-不复制")
+    private Boolean isCopyThisData = false;
     private List<Integer> gCapacity;
 
     public Boolean verify() {

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

@@ -208,7 +208,7 @@ public interface WbsTreeContractClient {
     void saveNameRuleByPkeyId(@RequestParam Long  pKeyId, @RequestParam String s,  @RequestParam Long projectId);
 
     @PostMapping(API_PREFIX + "/queryListByPIds")
-    List<WbsTreeContract> queryListByPIds(@RequestBody List<Long> pIds);
+    List<WbsTreeContract> queryListByPIds(@RequestBody List<Long> pIds,@RequestParam Integer classify);
 
     @PostMapping(API_PREFIX + "/findIsExistTreeNode")
     Integer findIsExistTreeNode(@RequestBody List<String> ids);

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java

@@ -36,4 +36,8 @@ public class ArchiveSyncLogVO {
 
     @ApiModelProperty("电签文件路径")
     private String eVisaPdfUrl;
+    @ApiModelProperty("父级节点")
+    private Long wbsNodeId;
+    @ApiModelProperty("文件页数")
+    private Integer page;
 }

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

@@ -41,4 +41,7 @@ public class ArchiveSyncTrialVO {
 
     @ApiModelProperty(value = "排序")
     private Integer sort;
+
+    @ApiModelProperty(value = "父节点id")
+    private Long pId;
 }

+ 12 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/RebateIncentiveAdvPay.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import org.springblade.common.utils.BaseUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 /**
  * @author yangyj
@@ -39,13 +40,21 @@ public class RebateIncentiveAdvPay implements  DataModel{
     public void calc(String contractAmount,String dyTotalAmount,String currentPeriodEndPay){
         double contractAmountD=BaseUtils.obj2DoubleZero(contractAmount);
         //2025/7/23  修改逻辑 将最后算出来的值需要减去上期末的扣回动员预付款 currentPeriodEndPay
-        double x=((2*(BaseUtils.obj2DoubleZero(subtotal) -0.3*contractAmountD)*BaseUtils.obj2DoubleZero(dyTotalAmount))/contractAmountD)-BaseUtils.obj2DoubleZero(currentPeriodEndPay);
+        double x=((2*(BaseUtils.obj2DoubleZero(subtotal) -0.3*contractAmountD)*BaseUtils.obj2DoubleZero(dyTotalAmount))/contractAmountD);
+        double y=BaseUtils.obj2DoubleZero(currentPeriodEndPay);
+        // 四舍五入后再相减
+        BigDecimal roundedX = new BigDecimal(x).setScale(0, BigDecimal.ROUND_HALF_UP);
+        BigDecimal roundedY = new BigDecimal(y).setScale(0, BigDecimal.ROUND_HALF_UP);
+        double result = roundedX.subtract(roundedY).doubleValue();
         if(x>0){
             /*扣回款本身就是负数*/
-            String s=new BigDecimal(x).setScale(5,BigDecimal.ROUND_HALF_UP).toPlainString();
-            //this.retained =s ;
+            String s=new BigDecimal(result).setScale(0,BigDecimal.ROUND_HALF_UP).toPlainString();
+            this.retained =s ;
             this.currentPay=s;
         }
+        if(roundedX.compareTo(BigDecimal.ZERO)>0){
+            this.endPay=roundedX.toPlainString();
+        }
 
     }
 

+ 25 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/TokenVerifyResult.java

@@ -0,0 +1,25 @@
+package org.springblade.system.user.dto;
+
+import lombok.Data;
+
+/**
+ * @author LHB
+ */
+@Data
+public class TokenVerifyResult {
+    // 验证结果
+    private boolean valid;
+    // 提示消息
+    private String message;
+    // JWT解析出的账号
+    private String account;
+
+    public TokenVerifyResult() {
+    }
+
+    public TokenVerifyResult(boolean valid, String message, String account) {
+        this.valid = valid;
+        this.message = message;
+        this.account = account;
+    }
+}

+ 2 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -4839,8 +4839,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		for (ArchivesAutoVO4 v : value) {
 			ArchivesAuto auto = new ArchivesAuto();
 			if (config.getIndexType() == null || config.getIndexType() == 0) {
-				v.setFileNumber(v.getFileNumberPrefix() + "—" + i);
-
+				v.setFileNumber(v.getFileNumberPrefix() + "-" + i);
 			} else {
 				String prefix = v.getFileNumberPrefix();
 				int index = i; // 编号从 startNumber 开始
@@ -4853,7 +4852,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				// 使用 %0xd 格式化数字,x 表示总长度
 				String formattedIndex = String.format("%0" + numLength + "d", index);
 				// 设置最终档号
-				v.setFileNumber(prefix + "" + formattedIndex);
+				v.setFileNumber(prefix + "-" + formattedIndex);
 			}
 			auto.setId(v.getId());
 			auto.setFileNumber(v.getFileNumber());

+ 12 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/EntrustInfoController.java

@@ -18,6 +18,7 @@ package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
@@ -120,7 +121,16 @@ public class  EntrustInfoController extends BladeController {
 	@ApiOperation(value = "修改", notes = "传入entrustInfo")
 	@Transactional
 	public R update(@Valid @RequestBody EntrustInfo entrustInfo) {
-			// rfid--绑定 需要判断 委托单的状态和创建情况
+		EntrustInfo info = entrustInfoService.getById(entrustInfo.getId());
+		if (info ==  null) {
+			// 前端样品处理页面传递的是样品id
+			List<EntrustInfo> list = entrustInfoService.list(Wrappers.<EntrustInfo>lambdaQuery().eq(EntrustInfo::getSampleId, entrustInfo.getId()));
+			if (list == null || list.isEmpty()) {
+				return R.fail("委托单不存在");
+			}
+			entrustInfo.setId(list.get(0).getId());
+		}
+		// rfid--绑定 需要判断 委托单的状态和创建情况
 			if(Func.isNotEmpty(entrustInfo.getRepealType()) && entrustInfo.getRepealType()==1){
 				entrustInfo.setSampleStatus("6");
 				entrustInfo.setRepealTime(new Date());
@@ -191,6 +201,7 @@ public class  EntrustInfoController extends BladeController {
 		} else {
 			reportDetail = entrustInfoService.getReportDetail(id);
 		}
+		reportDetail.setEntrustNo(entrustInfo.getEntrustNo());
 		return R.data(reportDetail);
 	}
 

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

@@ -1275,7 +1275,7 @@ public class InformationWriteQueryController extends BladeController {
         } else { //质检
             //记录选中节点的所有表单旧html
             List<Long> list = Arrays.stream(startTaskVO.getIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
-            List<WbsTreeContract> wbsTreeContracts =  wbsTreeContractClient.queryListByPIds(list);
+            List<WbsTreeContract> wbsTreeContracts =  wbsTreeContractClient.queryListByPIds(list,startTaskVO.getClassify());
 
 
             businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));

+ 8 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1721,6 +1721,14 @@ public class TaskController extends BladeController {
                     emptyPage.setTotal(0);
                     emptyPage.setRecords(Collections.emptyList());
                     return R.data(emptyPage);
+                } else {
+                    // 待办页未选状态:默认查待审批
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    // 待办页选非待审批状态:直接返回空分页
+                    IPage<BusinessTaskPageVO> emptyPage = new Page<>(dto.getCurrent(), dto.getSize());
+                    emptyPage.setTotal(0);
+                    emptyPage.setRecords(Collections.emptyList());
+                    return R.data(emptyPage);
                 } else {
                     // 待办页未选状态:默认查待审批
                     sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ? AND u_task_parallel.e_visa_content!='当前等待电签的批次较多,请等待几分钟后刷新页面查看........')");

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -818,4 +818,15 @@ public class TrialDetectionController extends BladeController {
         });
         return R.data(trailDeviceUseInfoDTOS);
     }
+
+    /**
+     * 根据 设备id 查询 设备信息以及设备使用信息
+     */
+    @PostMapping("/self/updateSort")
+    @ApiOperationSupport(order = 30)
+    @ApiOperation(value = "根据类型修改排序", notes = "deviceInfoIds")
+    public R updateSort(@RequestBody TrialSelfInspectionRecordPageDTO dto) {
+        iTrialSelfInspectionRecordService.updateSort(dto);
+        return R.success("成功");
+    }
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -460,4 +460,8 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         iArchiveFileService.saveBatch(list);
     }
 
+    @Override
+    public Integer selectMaxSortByContractId(Long contractId) {
+        return iArchiveFileService.selectMaxSortByContractId(contractId);
+    }
 }

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

@@ -8,6 +8,7 @@ import org.springblade.business.mapper.ImageClassificationFileMapper;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
 import java.util.List;
 
 @RestController
@@ -27,4 +28,8 @@ public class ImageClassificationFileClientImpl implements ImageClassificationFil
         return imageClassificationFileService.getById(id);
     }
 
+    @Override
+    public List<ImageClassificationFile> getImageClassificationFileByIds(List<Long> imageIds) {
+        return imageClassificationFileService.listByIds(imageIds);
+    }
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -122,4 +122,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
     Map<String, BigDecimal> getAllArchiveAutoByContractTypeSummary(@Param("projectId") Long projectId);
 
     List<ArchiveFile> getAllArchiveFileByIds(@Param("strList") List<String> strList);
+
+    Integer selectMaxSortByContractId(@Param("contractId") Long contractId);
 }

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -569,4 +569,7 @@
             </foreach>
         </if>
     </select>
+    <select id="selectMaxSortByContractId" resultType="java.lang.Integer">
+        select max(sort) from u_archive_file where contract_id = #{contractId}
+    </select>
 </mapper>

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

@@ -28,14 +28,16 @@
     <update id="updateLeafNum">
         UPDATE m_wbs_tree_contract_statistics a INNER JOIN (
                 select  b.id, COUNT(c.id) AS leaf_num, sum(c.fill_num) as fill_num, sum(c.approve_num) as approve_num, sum(c.complete_num) as complete_num, sum(c.jl_fill_num) as jl_fill_num, sum(c.jl_approve_num) as jl_approve_num, sum(c.jl_complete_num) as jl_complete_num
-                FROM m_wbs_tree_contract_statistics b INNER JOIN m_wbs_tree_contract_statistics c  ON c.contract_id = b.contract_id AND c.leaf_num = 0 AND c.is_deleted = 0  AND c.status = 1 AND c.ancestors LIKE CONCAT(b.ancestors, ',', b.id, '%')
+                FROM m_wbs_tree_contract_statistics b LEFT JOIN m_wbs_tree_contract_statistics c  ON c.contract_id = b.contract_id AND c.leaf_num = 0 AND c.is_deleted = 0  AND c.status = 1 AND c.ancestors LIKE CONCAT(b.ancestors, ',', b.id, '%')
                 WHERE b.id IN (
                     <foreach collection="ids" item="item" separator=",">
                         #{item}
                     </foreach>
                     ) GROUP BY b.id
             ) AS t ON a.id = t.id
-        SET a.leaf_num = t.leaf_num, a.fill_num = t.fill_num,a.approve_num = t.approve_num, a.complete_num = t.complete_num, a.jl_fill_num =t.jl_fill_num, a.jl_approve_num = t.jl_approve_num, a.jl_complete_num = t.jl_complete_num, a.is_leaf = if(t.leaf_num > 0, 0, 1);
+        SET a.leaf_num = ifnull(t.leaf_num, a.leaf_num), a.fill_num = ifnull(t.fill_num, a.fill_num),a.approve_num = ifnull(t.approve_num, a.approve_num),
+            a.complete_num = ifnull(t.complete_num, a.complete_num), a.jl_fill_num = ifnull(t.jl_fill_num, a.jl_fill_num), a.jl_approve_num = ifnull(t.jl_approve_num, a.jl_approve_num),
+            a.jl_complete_num = ifnull(t.jl_complete_num, a.jl_complete_num), a.is_leaf = if(t.leaf_num > 0, 0, 1);
     </update>
     <select id="getByIdOnLock" resultMap="ResultMap">
         select <include refid="includeSql"/> from m_wbs_tree_contract_statistics where id = #{id} for update

+ 3 - 3
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java

@@ -193,7 +193,7 @@ public class ChenYuTestScheduled {
             JSONObject data = (JSONObject) result.getData();
             String newToken = data.getString("token");
             long expire = data.getLong("expireSecond") - 60;
-            bladeRedis.setEx(TOKEN_REDIS_KEY, newToken, expire);
+            bladeRedis.setEx(TOKEN_REDIS_KEY, newToken, 1800L);
             return newToken;
         } catch (Exception e) {
             log.error("Login process failed", e);
@@ -271,7 +271,7 @@ public class ChenYuTestScheduled {
     /**
      * 获取已完成的检测报告
      */
-    @Scheduled(cron = "0 0 * * * ?")
+    @Scheduled(cron = "0 05 * * * ?")
     public void getFinishTestReport() {
         if (!SystemUtils.isLinux()) {
             return;
@@ -408,7 +408,7 @@ public class ChenYuTestScheduled {
     /**
      * 获取第三方报告
      */
-    @Scheduled(cron = "0 0 * * * ?")
+    @Scheduled(cron = "0 05 * * * ?")
     public void getThirdReport() {
         if (!SystemUtils.isLinux()) {
             return;

+ 462 - 462
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled01.java

@@ -1,462 +1,462 @@
-package org.springblade.business.scheduled;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.nacos.common.utils.MD5Utils;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.springblade.business.entity.TrialCyFinishTestReport;
-import org.springblade.business.entity.TrialCyTestType;
-import org.springblade.business.entity.TrialCyThirdReport;
-import org.springblade.business.scheduled.vo.GetFinishTestReport;
-import org.springblade.business.scheduled.vo.GetThirdReport;
-import org.springblade.business.scheduled.vo.Result;
-import org.springblade.business.scheduled.vo.ThirdLogin;
-import org.springblade.business.service.TrialCyFinishTestReportService;
-import org.springblade.business.service.TrialCyTestTypeService;
-import org.springblade.business.service.TrialCyThirdReportService;
-import org.springblade.common.utils.SystemUtils;
-import org.springblade.core.redis.cache.BladeRedis;
-import org.springblade.core.tool.utils.CollectionUtil;
-import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.ProjectInfo;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 成渝试验第三方接口获取数据
- * 定时任务
- *
- * @author LHB
- */
-@Component
-@Slf4j
-public class ChenYuTestScheduled01 {
-
-    @Resource
-    private JdbcTemplate jdbcTemplate;
-
-    @Resource
-    private BladeRedis bladeRedis;
-    /**
-     * 成渝-获取标段已完成(已签章完成)的检测报告
-     */
-    @Resource
-    private TrialCyFinishTestReportService trialCyFinishTestReportService;
-    /**
-     * 成渝-试验检测树
-     */
-    @Resource
-    private TrialCyTestTypeService trialCyTestTypeService;
-    /**
-     * 成渝-已上传的外委检测报告/ 第三方检测报告/ 上传报告
-     */
-    @Resource
-    private TrialCyThirdReportService trialCyThirdReportService;
-
-    // HTTP客户端复用
-    private CloseableHttpClient httpClient;
-
-    @PostConstruct
-    public void init() {
-        this.httpClient = HttpClientBuilder.create().build();
-    }
-
-    //token缓存key
-    private static final String TOKEN_REDIS_KEY = "blade:cqcy:token";
-
-    //项目编码
-    private static final String PROJECT_CODE = "cqcyfx";
-
-    //项目id
-    private static Long PROJECT_ID = null;
-
-    //接口域名
-    private final String URL = "https://apicqcyfx.qdm123.com";
-
-    //合同编码缓存
-    private final Map<String, Long> contractCodeMap = new ConcurrentHashMap<>();
-
-    /**
-     * 登录 获取token
-     */
-
-    public String thirdLogin() {
-        //TODO 从后台管理的配置中心获取
-        String url = "/api/ThirdSystem/ThirdLogin";
-
-
-        //获取项目id
-        String sql = "select id from m_project_info where project_number = ? and is_deleted = 0 limit 1";
-        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, ProjectInfo.class, PROJECT_CODE);
-        PROJECT_ID = projectInfo.getId();
-
-
-        String getAppKeySql = "select param_value from blade_param where param_key = 'cy.trial.appKey' and is_deleted = 0";
-        String getAppSecretSql = "select param_value from blade_param where param_key = 'cy.trial.appSecret' and is_deleted = 0";
-        //后管配置 appKey
-        String appKey = jdbcTemplate.queryForObject(getAppKeySql, String.class);
-        //后管配置 appSecret
-        String appSecret = jdbcTemplate.queryForObject(getAppSecretSql, String.class);
-        if (StringUtil.isBlank(appKey) || StringUtil.isBlank(appSecret)) {
-            log.error("---------#后管未配置成渝-试验-授权码或私钥");
-            return null;
-        }
-        //当前时间戳
-        Long time = System.currentTimeMillis();
-
-        //加密
-        String md5Hex = MD5Utils.md5Hex(time + appKey + appSecret, "UTF-8");
-
-        ThirdLogin thirdLogin = new ThirdLogin();
-        thirdLogin.setAppKey(appKey);
-        thirdLogin.setTimestamp(time);
-        thirdLogin.setSecret(md5Hex);
-
-
-        Result post = this.post(URL + url, thirdLogin);
-        if (post == null) {
-            log.error("---------#成渝第三方接口访问失败");
-            return null;
-        }
-        Integer state = post.getState();
-        //成功
-        if (state == 1) {
-            JSONObject data = (JSONObject) post.getData();
-            bladeRedis.setEx(TOKEN_REDIS_KEY, data.getString("token"), data.getLong("expireSecond") - 60);
-            return data.getString("token");
-        } else {
-            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
-            return null;
-        }
-    }
-
-
-    /**
-     * 获取合同段列表接口
-     */
-    @Scheduled(cron = "0 0 * * * ?")
-    public void getContractSectByProjCode()     {
-        if(!SystemUtils.isLinux()){
-            return;
-        }
-        //清空缓存
-        contractCodeMap.clear();
-
-        String url = "/api/CQHCZC/MesureSystem/GetContractSectByProjCode";
-
-        String token = bladeRedis.get(TOKEN_REDIS_KEY);
-        if (token == null) {
-            token = thirdLogin();
-        }
-        if (token == null) {
-            log.error("---------#成渝第三方接口访问失败:token为空");
-            return;
-        }
-        if (PROJECT_ID == null) {
-            log.error("---------#成渝第三方接口访问失败:项目不存在");
-            return;
-        }
-
-
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("token", token);
-        jsonObject.put("ProjectCode", PROJECT_CODE);
-
-        Result post = this.post(URL + url, jsonObject);
-
-        if (post == null) {
-            log.error("---------#成渝第三方接口访问失败");
-            return;
-        }
-        Integer state = post.getState();
-        //成功
-        if (state == 1) {
-            //合同段列表数据
-            JSONArray data = (JSONArray) post.getData();
-
-            List<String> codes = new ArrayList<>();
-
-            //返回的数据不能为空
-            if (CollectionUtil.isNotEmpty(data)) {
-                for (Object datum : data) {
-                    JSONObject jsonObject1 = (JSONObject) datum;
-                    String code = jsonObject1.getString("Code");
-                    //编码不能为空
-                    if (StringUtil.isNotBlank(code)) {
-                        codes.add(code);
-                    }
-                }
-            }
-            //封装需要查询的合同段
-            if (CollectionUtil.isNotEmpty(codes)) {
-                //使用参数化查询防止SQL注入
-                StringBuilder sqlBuilder = new StringBuilder("select * from m_contract_info where contract_number in (");
-                for (int i = 0; i < codes.size(); i++) {
-                    sqlBuilder.append(i == 0 ? "?" : ",?");
-                }
-                sqlBuilder.append(")");
-
-                //查询数据
-                List<ContractInfo> contractInfoList = jdbcTemplate.queryForList(sqlBuilder.toString(), ContractInfo.class, codes.toArray());
-                contractInfoList.forEach(f -> {
-                    contractCodeMap.put(f.getContractNumber(), f.getId());
-                });
-            }
-        } else {
-            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
-        }
-    }
-
-    /**
-     * 获取标段已完成(已签章完成)的检测报告
-     */
-    @Scheduled(cron = "0 0 * * * ?")
-    public void getFinishTestReport() {
-        if(!SystemUtils.isLinux()){
-            return;
-        }
-        String url = "/open/TestReport/GetFinishTestReport";
-
-        String token = bladeRedis.get(TOKEN_REDIS_KEY);
-        if (token == null) {
-            token = thirdLogin();
-        }
-        if (token == null) {
-            log.error("---------#成渝第三方接口访问失败:token为空");
-            return;
-        }
-        if (PROJECT_ID == null) {
-            log.error("---------#成渝第三方接口访问失败:项目不存在");
-            return;
-        }
-        //获取需要同步的合同段信息
-        Set<String> contractCodes = contractCodeMap.keySet();
-        if (CollectionUtil.isEmpty(contractCodes)) {
-            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
-            return;
-        }
-        for (String contractCode : contractCodes) {
-            GetFinishTestReport getFinishTestReport = new GetFinishTestReport(token, PROJECT_CODE, contractCode);
-
-            Integer pageIndex = 0;
-            Integer pageSize = 100;
-
-            do {
-                getFinishTestReport.setPageIndex(pageIndex);
-                getFinishTestReport.setPageSize(pageSize);
-
-                Result post = this.post(URL + url, getFinishTestReport);
-                if (post == null) {
-                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
-                    break; // 继续处理下一个合同段
-                }
-                Integer state = post.getState();
-                //成功
-                if (state == 1) {
-                    //检测报告列表
-                    JSONArray data = (JSONArray) post.getData();
-                    List<TrialCyFinishTestReport> list = data.toJavaList(TrialCyFinishTestReport.class);
-                    //退出循环
-                    if (CollectionUtil.isEmpty(list)) {
-                        break;
-                    }
-                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
-                    //处理数据
-                    trialCyFinishTestReportService.saveBatch(list);
-                    if (list.size() < pageSize) {
-                        break;
-                    }
-                    pageIndex++;
-                } else {
-                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
-                    break; // 继续处理下一个合同段
-                }
-            } while (true);
-        }
-    }
-
-    /**
-     * 获取已上传的外委检测报告/第三方检测报告/上传报告
-     */
-    @Scheduled(cron = "0 0 * * * ?")
-    public void getThirdReport() {
-        if(!SystemUtils.isLinux()){
-            return;
-        }
-        String url = "/open/ThirdReport/GetThirdReport";
-
-        String token = bladeRedis.get(TOKEN_REDIS_KEY);
-        if (token == null) {
-            token = thirdLogin();
-        }
-        if (token == null) {
-            log.error("---------#成渝第三方接口访问失败:token为空");
-            return;
-        }
-        if (PROJECT_ID == null) {
-            log.error("---------#成渝第三方接口访问失败:项目不存在");
-            return;
-        }
-        //获取需要同步的合同段信息
-        Set<String> contractCodes = contractCodeMap.keySet();
-        if (CollectionUtil.isEmpty(contractCodes)) {
-            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
-            return;
-        }
-        for (String contractCode : contractCodes) {
-            GetThirdReport getThirdReport = new GetThirdReport(token, PROJECT_CODE, contractCode);
-
-            Integer pageIndex = 0;
-            int pageSize = 100;
-
-            do {
-                getThirdReport.setPageIndex(pageIndex);
-                getThirdReport.setPageSize(pageSize);
-
-                Result post = this.post(URL + url, getThirdReport);
-                if (post == null) {
-                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
-                    break; // 继续处理下一个合同段
-                }
-                Integer state = post.getState();
-                //成功
-                if (state == 1) {
-                    //已上传的外委检测报告/第三方检测报告/上传报告
-                    JSONArray data = (JSONArray) post.getData();
-                    List<TrialCyThirdReport> list = data.toJavaList(TrialCyThirdReport.class);
-                    //退出循环
-                    if (CollectionUtil.isEmpty(list)) {
-                        break;
-                    }
-                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
-                    //处理数据
-                    trialCyThirdReportService.saveBatch(list);
-
-                    if (list.size() < pageSize) {
-                        break;
-                    }
-
-                    pageIndex++;
-                } else {
-                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
-                    break; // 继续处理下一个合同段
-                }
-            } while (true);
-        }
-    }
-
-    /**
-     * 获取检测项目树(包括自建试验、外委、第三方、上传报告)
-     */
-    @Scheduled(cron = "0 0 * * * ?")
-    public void getAllTestType() {
-        if(!SystemUtils.isLinux()){
-            return;
-        }
-
-        String url = "/open/ThirdReport/GetAllTestType";
-        String token = bladeRedis.get(TOKEN_REDIS_KEY);
-        if (token == null) {
-            token = thirdLogin();
-        }
-        if (token == null) {
-            log.error("---------#成渝第三方接口访问失败:token为空");
-            return;
-        }
-        if (PROJECT_ID == null) {
-            log.error("---------#成渝第三方接口访问失败:项目不存在");
-            return;
-        }
-
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("token", token);
-        jsonObject.put("ProjectCode", PROJECT_CODE);
-
-        Result post = this.post(URL + url, jsonObject);
-
-        if (post == null) {
-            log.error("---------#成渝第三方接口访问失败:接口访问失败");
-            return;
-        }
-
-
-        Integer state = post.getState();
-        //成功
-        if (state == 1) {
-            //合同段列表数据
-            JSONArray data = (JSONArray) post.getData();
-            List<TrialCyTestType> list = data.toJavaList(TrialCyTestType.class);
-            //退出循环
-            if (CollectionUtil.isEmpty(list)) {
-                return;
-            }
-            list.forEach(f -> f.setProjectId(PROJECT_ID));
-            //处理数据
-            trialCyTestTypeService.saveOrUpdateBatch(list);
-        } else {
-            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
-        }
-    }
-
-
-    /**
-     * 封装请求参数
-     */
-    public Result post(String url, Object object) {
-        HttpPost httpPost = new HttpPost(url);
-        httpPost.setHeader("Content-Type", "application/json");
-
-        // 对象转json
-        StringEntity json = new StringEntity(JSON.toJSONString(object), "utf-8");
-        httpPost.setEntity(json);
-
-        try {
-            HttpResponse httpResponse = httpClient.execute(httpPost);
-
-            // 检查响应状态码
-            int statusCode = httpResponse.getStatusLine().getStatusCode();
-            if (statusCode != 200) {
-                log.warn("HTTP request failed with status code: {}", statusCode);
-                // 可以根据具体业务需求调整错误处理方式
-                return null;
-            }
-
-            try (InputStream inputStream = httpResponse.getEntity().getContent();
-                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
-
-                byte[] buffer = new byte[1024];
-                int index = 0;
-                while ((index = inputStream.read(buffer)) != -1) {
-                    outputStream.write(buffer, 0, index);
-                }
-                // 响应参数 - 指定明确的字符编码
-                Result result = JSON.parseObject(outputStream.toString("utf-8"), Result.class);
-                return result;
-            }
-        } catch (IOException e) {
-            log.error("HTTP request failed: ", e);
-            // 返回错误结果或抛出异常,根据业务需求决定
-            return null;
-        }
-    }
-
-}
+//package org.springblade.business.scheduled;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.alibaba.nacos.common.utils.MD5Utils;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.http.HttpResponse;
+//import org.apache.http.client.methods.HttpPost;
+//import org.apache.http.entity.StringEntity;
+//import org.apache.http.impl.client.CloseableHttpClient;
+//import org.apache.http.impl.client.HttpClientBuilder;
+//import org.springblade.business.entity.TrialCyFinishTestReport;
+//import org.springblade.business.entity.TrialCyTestType;
+//import org.springblade.business.entity.TrialCyThirdReport;
+//import org.springblade.business.scheduled.vo.GetFinishTestReport;
+//import org.springblade.business.scheduled.vo.GetThirdReport;
+//import org.springblade.business.scheduled.vo.Result;
+//import org.springblade.business.scheduled.vo.ThirdLogin;
+//import org.springblade.business.service.TrialCyFinishTestReportService;
+//import org.springblade.business.service.TrialCyTestTypeService;
+//import org.springblade.business.service.TrialCyThirdReportService;
+//import org.springblade.common.utils.SystemUtils;
+//import org.springblade.core.redis.cache.BladeRedis;
+//import org.springblade.core.tool.utils.CollectionUtil;
+//import org.springblade.core.tool.utils.StringUtil;
+//import org.springblade.manager.entity.ContractInfo;
+//import org.springblade.manager.entity.ProjectInfo;
+//import org.springframework.jdbc.core.JdbcTemplate;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//
+//import javax.annotation.PostConstruct;
+//import javax.annotation.Resource;
+//import java.io.ByteArrayOutputStream;
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Set;
+//import java.util.concurrent.ConcurrentHashMap;
+//
+///**
+// * 成渝试验第三方接口获取数据
+// * 定时任务
+// *
+// * @author LHB
+// */
+////@Component
+//@Slf4j
+//public class ChenYuTestScheduled01 {
+//
+//    @Resource
+//    private JdbcTemplate jdbcTemplate;
+//
+//    @Resource
+//    private BladeRedis bladeRedis;
+//    /**
+//     * 成渝-获取标段已完成(已签章完成)的检测报告
+//     */
+//    @Resource
+//    private TrialCyFinishTestReportService trialCyFinishTestReportService;
+//    /**
+//     * 成渝-试验检测树
+//     */
+//    @Resource
+//    private TrialCyTestTypeService trialCyTestTypeService;
+//    /**
+//     * 成渝-已上传的外委检测报告/ 第三方检测报告/ 上传报告
+//     */
+//    @Resource
+//    private TrialCyThirdReportService trialCyThirdReportService;
+//
+//    // HTTP客户端复用
+//    private CloseableHttpClient httpClient;
+//
+//    @PostConstruct
+//    public void init() {
+//        this.httpClient = HttpClientBuilder.create().build();
+//    }
+//
+//    //token缓存key
+//    private static final String TOKEN_REDIS_KEY = "blade:cqcy:token";
+//
+//    //项目编码
+//    private static final String PROJECT_CODE = "cqcyfx";
+//
+//    //项目id
+//    private static Long PROJECT_ID = null;
+//
+//    //接口域名
+//    private final String URL = "https://apicqcyfx.qdm123.com";
+//
+//    //合同编码缓存
+//    private final Map<String, Long> contractCodeMap = new ConcurrentHashMap<>();
+//
+//    /**
+//     * 登录 获取token
+//     */
+//
+//    public String thirdLogin() {
+//        //TODO 从后台管理的配置中心获取
+//        String url = "/api/ThirdSystem/ThirdLogin";
+//
+//
+//        //获取项目id
+//        String sql = "select id from m_project_info where project_number = ? and is_deleted = 0 limit 1";
+//        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, ProjectInfo.class, PROJECT_CODE);
+//        PROJECT_ID = projectInfo.getId();
+//
+//
+//        String getAppKeySql = "select param_value from blade_param where param_key = 'cy.trial.appKey' and is_deleted = 0";
+//        String getAppSecretSql = "select param_value from blade_param where param_key = 'cy.trial.appSecret' and is_deleted = 0";
+//        //后管配置 appKey
+//        String appKey = jdbcTemplate.queryForObject(getAppKeySql, String.class);
+//        //后管配置 appSecret
+//        String appSecret = jdbcTemplate.queryForObject(getAppSecretSql, String.class);
+//        if (StringUtil.isBlank(appKey) || StringUtil.isBlank(appSecret)) {
+//            log.error("---------#后管未配置成渝-试验-授权码或私钥");
+//            return null;
+//        }
+//        //当前时间戳
+//        Long time = System.currentTimeMillis();
+//
+//        //加密
+//        String md5Hex = MD5Utils.md5Hex(time + appKey + appSecret, "UTF-8");
+//
+//        ThirdLogin thirdLogin = new ThirdLogin();
+//        thirdLogin.setAppKey(appKey);
+//        thirdLogin.setTimestamp(time);
+//        thirdLogin.setSecret(md5Hex);
+//
+//
+//        Result post = this.post(URL + url, thirdLogin);
+//        if (post == null) {
+//            log.error("---------#成渝第三方接口访问失败");
+//            return null;
+//        }
+//        Integer state = post.getState();
+//        //成功
+//        if (state == 1) {
+//            JSONObject data = (JSONObject) post.getData();
+//            bladeRedis.setEx(TOKEN_REDIS_KEY, data.getString("token"), data.getLong("expireSecond") - 60);
+//            return data.getString("token");
+//        } else {
+//            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+//            return null;
+//        }
+//    }
+//
+//
+//    /**
+//     * 获取合同段列表接口
+//     */
+//    @Scheduled(cron = "0 0 * * * ?")
+//    public void getContractSectByProjCode()     {
+//        if(!SystemUtils.isLinux()){
+//            return;
+//        }
+//        //清空缓存
+//        contractCodeMap.clear();
+//
+//        String url = "/api/CQHCZC/MesureSystem/GetContractSectByProjCode";
+//
+//        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+//        if (token == null) {
+//            token = thirdLogin();
+//        }
+//        if (token == null) {
+//            log.error("---------#成渝第三方接口访问失败:token为空");
+//            return;
+//        }
+//        if (PROJECT_ID == null) {
+//            log.error("---------#成渝第三方接口访问失败:项目不存在");
+//            return;
+//        }
+//
+//
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("token", token);
+//        jsonObject.put("ProjectCode", PROJECT_CODE);
+//
+//        Result post = this.post(URL + url, jsonObject);
+//
+//        if (post == null) {
+//            log.error("---------#成渝第三方接口访问失败");
+//            return;
+//        }
+//        Integer state = post.getState();
+//        //成功
+//        if (state == 1) {
+//            //合同段列表数据
+//            JSONArray data = (JSONArray) post.getData();
+//
+//            List<String> codes = new ArrayList<>();
+//
+//            //返回的数据不能为空
+//            if (CollectionUtil.isNotEmpty(data)) {
+//                for (Object datum : data) {
+//                    JSONObject jsonObject1 = (JSONObject) datum;
+//                    String code = jsonObject1.getString("Code");
+//                    //编码不能为空
+//                    if (StringUtil.isNotBlank(code)) {
+//                        codes.add(code);
+//                    }
+//                }
+//            }
+//            //封装需要查询的合同段
+//            if (CollectionUtil.isNotEmpty(codes)) {
+//                //使用参数化查询防止SQL注入
+//                StringBuilder sqlBuilder = new StringBuilder("select * from m_contract_info where contract_number in (");
+//                for (int i = 0; i < codes.size(); i++) {
+//                    sqlBuilder.append(i == 0 ? "?" : ",?");
+//                }
+//                sqlBuilder.append(")");
+//
+//                //查询数据
+//                List<ContractInfo> contractInfoList = jdbcTemplate.queryForList(sqlBuilder.toString(), ContractInfo.class, codes.toArray());
+//                contractInfoList.forEach(f -> {
+//                    contractCodeMap.put(f.getContractNumber(), f.getId());
+//                });
+//            }
+//        } else {
+//            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+//        }
+//    }
+//
+//    /**
+//     * 获取标段已完成(已签章完成)的检测报告
+//     */
+//    @Scheduled(cron = "0 0 * * * ?")
+//    public void getFinishTestReport() {
+//        if(!SystemUtils.isLinux()){
+//            return;
+//        }
+//        String url = "/open/TestReport/GetFinishTestReport";
+//
+//        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+//        if (token == null) {
+//            token = thirdLogin();
+//        }
+//        if (token == null) {
+//            log.error("---------#成渝第三方接口访问失败:token为空");
+//            return;
+//        }
+//        if (PROJECT_ID == null) {
+//            log.error("---------#成渝第三方接口访问失败:项目不存在");
+//            return;
+//        }
+//        //获取需要同步的合同段信息
+//        Set<String> contractCodes = contractCodeMap.keySet();
+//        if (CollectionUtil.isEmpty(contractCodes)) {
+//            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
+//            return;
+//        }
+//        for (String contractCode : contractCodes) {
+//            GetFinishTestReport getFinishTestReport = new GetFinishTestReport(token, PROJECT_CODE, contractCode);
+//
+//            Integer pageIndex = 0;
+//            Integer pageSize = 100;
+//
+//            do {
+//                getFinishTestReport.setPageIndex(pageIndex);
+//                getFinishTestReport.setPageSize(pageSize);
+//
+//                Result post = this.post(URL + url, getFinishTestReport);
+//                if (post == null) {
+//                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
+//                    break; // 继续处理下一个合同段
+//                }
+//                Integer state = post.getState();
+//                //成功
+//                if (state == 1) {
+//                    //检测报告列表
+//                    JSONArray data = (JSONArray) post.getData();
+//                    List<TrialCyFinishTestReport> list = data.toJavaList(TrialCyFinishTestReport.class);
+//                    //退出循环
+//                    if (CollectionUtil.isEmpty(list)) {
+//                        break;
+//                    }
+//                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
+//                    //处理数据
+//                    trialCyFinishTestReportService.saveBatch(list);
+//                    if (list.size() < pageSize) {
+//                        break;
+//                    }
+//                    pageIndex++;
+//                } else {
+//                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
+//                    break; // 继续处理下一个合同段
+//                }
+//            } while (true);
+//        }
+//    }
+//
+//    /**
+//     * 获取已上传的外委检测报告/第三方检测报告/上传报告
+//     */
+//    @Scheduled(cron = "0 0 * * * ?")
+//    public void getThirdReport() {
+//        if(!SystemUtils.isLinux()){
+//            return;
+//        }
+//        String url = "/open/ThirdReport/GetThirdReport";
+//
+//        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+//        if (token == null) {
+//            token = thirdLogin();
+//        }
+//        if (token == null) {
+//            log.error("---------#成渝第三方接口访问失败:token为空");
+//            return;
+//        }
+//        if (PROJECT_ID == null) {
+//            log.error("---------#成渝第三方接口访问失败:项目不存在");
+//            return;
+//        }
+//        //获取需要同步的合同段信息
+//        Set<String> contractCodes = contractCodeMap.keySet();
+//        if (CollectionUtil.isEmpty(contractCodes)) {
+//            log.error("---------#成渝第三方接口访问失败:合同段编码无数据");
+//            return;
+//        }
+//        for (String contractCode : contractCodes) {
+//            GetThirdReport getThirdReport = new GetThirdReport(token, PROJECT_CODE, contractCode);
+//
+//            Integer pageIndex = 0;
+//            int pageSize = 100;
+//
+//            do {
+//                getThirdReport.setPageIndex(pageIndex);
+//                getThirdReport.setPageSize(pageSize);
+//
+//                Result post = this.post(URL + url, getThirdReport);
+//                if (post == null) {
+//                    log.error("---------#成渝第三方接口访问失败:接口访问失败, contractCode: {}", contractCode);
+//                    break; // 继续处理下一个合同段
+//                }
+//                Integer state = post.getState();
+//                //成功
+//                if (state == 1) {
+//                    //已上传的外委检测报告/第三方检测报告/上传报告
+//                    JSONArray data = (JSONArray) post.getData();
+//                    List<TrialCyThirdReport> list = data.toJavaList(TrialCyThirdReport.class);
+//                    //退出循环
+//                    if (CollectionUtil.isEmpty(list)) {
+//                        break;
+//                    }
+//                    list.forEach(f -> f.setContractId(contractCodeMap.get(contractCode)));
+//                    //处理数据
+//                    trialCyThirdReportService.saveBatch(list);
+//
+//                    if (list.size() < pageSize) {
+//                        break;
+//                    }
+//
+//                    pageIndex++;
+//                } else {
+//                    log.error("---------#成渝第三方接口访问失败:{}, contractCode: {}", post.getMessage(), contractCode);
+//                    break; // 继续处理下一个合同段
+//                }
+//            } while (true);
+//        }
+//    }
+//
+//    /**
+//     * 获取检测项目树(包括自建试验、外委、第三方、上传报告)
+//     */
+//    @Scheduled(cron = "0 0 * * * ?")
+//    public void getAllTestType() {
+//        if(!SystemUtils.isLinux()){
+//            return;
+//        }
+//
+//        String url = "/open/ThirdReport/GetAllTestType";
+//        String token = bladeRedis.get(TOKEN_REDIS_KEY);
+//        if (token == null) {
+//            token = thirdLogin();
+//        }
+//        if (token == null) {
+//            log.error("---------#成渝第三方接口访问失败:token为空");
+//            return;
+//        }
+//        if (PROJECT_ID == null) {
+//            log.error("---------#成渝第三方接口访问失败:项目不存在");
+//            return;
+//        }
+//
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("token", token);
+//        jsonObject.put("ProjectCode", PROJECT_CODE);
+//
+//        Result post = this.post(URL + url, jsonObject);
+//
+//        if (post == null) {
+//            log.error("---------#成渝第三方接口访问失败:接口访问失败");
+//            return;
+//        }
+//
+//
+//        Integer state = post.getState();
+//        //成功
+//        if (state == 1) {
+//            //合同段列表数据
+//            JSONArray data = (JSONArray) post.getData();
+//            List<TrialCyTestType> list = data.toJavaList(TrialCyTestType.class);
+//            //退出循环
+//            if (CollectionUtil.isEmpty(list)) {
+//                return;
+//            }
+//            list.forEach(f -> f.setProjectId(PROJECT_ID));
+//            //处理数据
+//            trialCyTestTypeService.saveOrUpdateBatch(list);
+//        } else {
+//            log.error("---------#成渝第三方接口访问失败:" + post.getMessage());
+//        }
+//    }
+//
+//
+//    /**
+//     * 封装请求参数
+//     */
+//    public Result post(String url, Object object) {
+//        HttpPost httpPost = new HttpPost(url);
+//        httpPost.setHeader("Content-Type", "application/json");
+//
+//        // 对象转json
+//        StringEntity json = new StringEntity(JSON.toJSONString(object), "utf-8");
+//        httpPost.setEntity(json);
+//
+//        try {
+//            HttpResponse httpResponse = httpClient.execute(httpPost);
+//
+//            // 检查响应状态码
+//            int statusCode = httpResponse.getStatusLine().getStatusCode();
+//            if (statusCode != 200) {
+//                log.warn("HTTP request failed with status code: {}", statusCode);
+//                // 可以根据具体业务需求调整错误处理方式
+//                return null;
+//            }
+//
+//            try (InputStream inputStream = httpResponse.getEntity().getContent();
+//                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+//
+//                byte[] buffer = new byte[1024];
+//                int index = 0;
+//                while ((index = inputStream.read(buffer)) != -1) {
+//                    outputStream.write(buffer, 0, index);
+//                }
+//                // 响应参数 - 指定明确的字符编码
+//                Result result = JSON.parseObject(outputStream.toString("utf-8"), Result.class);
+//                return result;
+//            }
+//        } catch (IOException e) {
+//            log.error("HTTP request failed: ", e);
+//            // 返回错误结果或抛出异常,根据业务需求决定
+//            return null;
+//        }
+//    }
+//
+//}

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java

@@ -76,4 +76,6 @@ public interface IArchiveFileService extends BaseService<ArchiveFile> {
     public void updateArchiveFileEx(List<ArchiveFile> files);
 
     boolean sortByFileTime(Long nodeId);
+
+    Integer selectMaxSortByContractId(Long contractId);
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java

@@ -47,4 +47,6 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
     R getSamplePdfUrl(String id,String contrctId);
 
     Long saveBaseInfo(TrialSeleInspectionRecordInfoDTO vo);
+
+    void updateSort(TrialSelfInspectionRecordPageDTO dto);
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -405,4 +405,8 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
         }
     }
 
+    @Override
+    public Integer selectMaxSortByContractId(Long contractId) {
+        return baseMapper.selectMaxSortByContractId(contractId);
+    }
 }

+ 5 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -2258,7 +2258,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
         String sqlqu = "update u_information_query set status=2,e_visa_pdf_url='' where id in( " + ids + ") and is_deleted=0 ";
         String sqlForTask = "update u_task set status=2 where form_data_id in( " + ids2 + ") and status in(1,2) and is_deleted=0 ";
-        String sqlForTaskPall = "UPDATE u_task_parallel a  set a.`status`=2 , a.e_visa_status=1 ,a.e_visa_content='电签成功' where a.process_instance_id in(select process_instance_id  from u_task b  where b.form_data_id in( " + ids2 + ") and b.status in(0,1,2) and b.is_deleted = 0)  and a.`status` in(0,1)";
+        String sqlForTaskPall = "UPDATE u_task_parallel a  set a.is_resign = 1, a.`status`=2 , a.e_visa_status=1 ,a.e_visa_content='电签成功' where a.process_instance_id in(select process_instance_id  from u_task b  where b.form_data_id in( " + ids2 + ") and b.status in(0,1,2) and b.is_deleted = 0)  and a.`status` in(0,1)";
 
         String taskBtech = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)  " +
                 " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,SYSDATE(),1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b where b.`status` in(1,2) and a.`status` in(2)  and   a.process_instance_id=b.process_instance_id " +
@@ -2267,6 +2267,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         if(userIds!=null && userIds.length()>=1){
             taskBtech += " and b.task_user in("+userIds+")";
             sqlForTaskPall += " and a.task_user in("+userIds+")";
+            sqlqu = "update u_information_query a set status = if((select count(1) from u_task_parallel where process_instance_id = ( select process_instance_id  from u_task  where form_data_id = cast(a.id as char) and is_deleted = 0 and status in (1,2) order by id desc limit 1 ) " +
+                    "and `is_deleted` = 0 and task_user not in ( " + userIds + ") and status != 2 and e_visa_status != 1 ) > 0, 1, 2) ,e_visa_pdf_url='' where id in( "+ ids + ") and is_deleted=0 ";
+            sqlForTask = "update u_task a set status = if((select count(1) from u_task_parallel where process_instance_id = a.process_instance_id " +
+                    "and `is_deleted` = 0 and task_user not in ( " + userIds + ") and status != 2 and e_visa_status != 1 ) > 0, 1, 2) where form_data_id in( " + ids2 + ") and status in(1,2) and is_deleted=0 ";
         }
         jdbcTemplate.execute(sqlqu);
         jdbcTemplate.execute(sqlForTask);

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;

+ 57 - 17
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -145,17 +146,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryStatus())) {
                 queryWrapper.lambda().eq(TrialSelfInspectionRecord::getDetectionResult, dto.getQueryStatus());
             }
-            if (dto.getSortType() != null) {
-                if (dto.getSortType().equals("1")) {
-                    queryWrapper.lambda().orderByAsc(TrialSelfInspectionRecord::getReportNo);
-                } else if (dto.getSortType().equals("2")) {
-                    queryWrapper.lambda().orderByDesc(TrialSelfInspectionRecord::getReportNo);
-                } else if (dto.getSortType().equals("3")) {
-                    queryWrapper.lambda().orderByAsc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
-                } else if (dto.getSortType().equals("4")) {
-                    queryWrapper.lambda().orderByDesc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
-                }
-            }
+            queryWrapper.lambda().orderByAsc(TrialSelfInspectionRecord::getSort);
 
             IPage<TrialSelfInspectionRecord> pages = this.page(page, queryWrapper.lambda().orderByDesc(true, TrialSelfInspectionRecord::getCreateTime));
             IPage<TrialSelfInspectionRecordVO> trialSelfInspectionRecordVOIPage = TrialSelfInspectionRecordWarpper.build().pageVO(pages);
@@ -1116,6 +1107,8 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         List<String> sampleIds = baseMapper.selectSelfSampleRecord(id);
         if (sampleIds.size() > 0) {
             List<TrialSampleInfo> trialSampleInfos = trialSampleInfoMapper.selectBatchIds(sampleIds);
+            List<EntrustInfo> entrustInfoList = entrustInfoService.list(Wrappers.<EntrustInfo>lambdaQuery().in(EntrustInfo::getSampleId, sampleIds));
+            Map<Long, EntrustInfo> entrustInfoMap = entrustInfoList.stream().collect(Collectors.toMap(EntrustInfo::getSampleId, item -> item, (v1, v2) -> v1));
             Map<Long, User> map = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, Function.identity()));
             if (trialSampleInfos.size() > 0) {
                 for (TrialSampleInfo trialSampleInfo : trialSampleInfos) {
@@ -1124,6 +1117,20 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                         TrialSampleInfoVO trialSampleInfoVO = BeanUtil.copyProperties(trialSampleInfo, TrialSampleInfoVO.class);
                         if (trialSampleInfoVO != null) {
                             trialSampleInfoVO.setUserName(ObjectUtil.isNotEmpty(user.getName()) ? user.getName() : user.getRealName());
+                            EntrustInfo entrustInfo = entrustInfoMap.get(trialSampleInfo.getId());
+                            if (entrustInfo != null && entrustInfo.getSampleStatus() != null) {
+                                if (entrustInfo.getSampleStatus().equals("6")) {
+                                    trialSampleInfoVO.setSampleProcessing("处理");
+                                    trialSampleInfoVO.setSampleProcessingResult(entrustInfo.getRepealReason() == null ? "" : entrustInfo.getRepealReason());
+                                } else if (entrustInfo.getSampleStatus().equals("5")) {
+                                    trialSampleInfoVO.setSampleProcessing("留样");
+                                    Date endTime = entrustInfo.getResamEndTime();
+                                    Date startTime = entrustInfo.getResamStartTime();
+                                    if (startTime != null && endTime != null) {
+                                        trialSampleInfoVO.setSampleProcessingResult(DateUtil.format(startTime, "yyyy-MM-dd") + " 至 " + DateUtil.format(endTime, "yyyy-MM-dd"));
+                                    }
+                                }
+                            }
                             result.add(trialSampleInfoVO);
                         }
                     }
@@ -1268,11 +1275,13 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                     //记录表  以第一张表为准
                     this.updateRecordNoOrReportNo(dto, jsonObject, doc, "记录编 号:", "record_no");
                     this.updateRecordNoOrReportNo(dto, jsonObject, doc, "记录编号:", "record_no");
+                    this.updateRecordNoOrReportNo(dto, jsonObject, doc, "记录编号", "record_no");
                 } else if (table.getTableType() == 10 || table.getTableType() == 2) {
                     //报告单
                     this.updateRecordNoOrReportNo(dto, jsonObject, doc, "报告编号:", "report_no");
                     //  :不一样 一个中文一个英文
                     this.updateRecordNoOrReportNo(dto, jsonObject, doc, "报告编号:", "report_no");
+                    this.updateRecordNoOrReportNo(dto, jsonObject, doc, "报告编号", "report_no");
                 }
             } catch (Exception e) {
                 log.error(e.getMessage());
@@ -1359,7 +1368,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         String key = first.attr("id");
         //记录编号或者报告编号的值
         String recordOrReportNo = jsonObject.getString(key);
-        if (!"".equals(recordOrReportNo) && !(recordOrReportNo == null)) {
+        if (!"".equals(recordOrReportNo) && recordOrReportNo != null && !"/".equals(recordOrReportNo)) {
             String updateSql = "update u_trial_self_inspection_record set " + fileVlue + "='" + recordOrReportNo + "' where id='" + dto.getId() + "'";
             if (fileVlue.equals("record_no")) {
                 dto.setRecordNo(recordOrReportNo);
@@ -1812,7 +1821,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                 if (StringUtils.isNotEmpty(maxRecordNo)) {
                     HashMap<String, String> stringStringHashMap = new HashMap<>();
                     stringStringHashMap.put("type", "记录表");
-                    if (trialSelfInspectionRecord != null) {
+                    if (trialSelfInspectionRecord != null && StringUtils.isNotEmpty(trialSelfInspectionRecord.getRecordNo())) {
                         stringStringHashMap.put("valueStr", trialSelfInspectionRecord.getRecordNo());
                         return stringStringHashMap;
                     }
@@ -1829,7 +1838,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                 if (StringUtils.isNotEmpty(maxReportNo)) {
                     HashMap<String, String> stringStringHashMap = new HashMap<>();
                     stringStringHashMap.put("type", "报告单");
-                    if (trialSelfInspectionRecord != null) {
+                    if (trialSelfInspectionRecord != null && StringUtils.isNotEmpty(trialSelfInspectionRecord.getReportNo())) {
                         stringStringHashMap.put("valueStr", trialSelfInspectionRecord.getReportNo());
                         return stringStringHashMap;
                     }
@@ -1876,7 +1885,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                     //记录表
                     HashMap<String, String> stringStringHashMap = new HashMap<>();
                     stringStringHashMap.put("type", "记录表");
-                    if (trialSelfInspectionRecord != null) {
+                    if (trialSelfInspectionRecord != null && StringUtils.isNotEmpty(trialSelfInspectionRecord.getRecordNo())) {
                         stringStringHashMap.put("valueStr", trialSelfInspectionRecord.getRecordNo());
                         return stringStringHashMap;
                     }
@@ -1923,7 +1932,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                     //报告单
                     HashMap<String, String> stringStringHashMap = new HashMap<>();
                     stringStringHashMap.put("type", "报告单");
-                    if (trialSelfInspectionRecord != null) {
+                    if (trialSelfInspectionRecord != null && StringUtils.isNotEmpty(trialSelfInspectionRecord.getReportNo())) {
                         stringStringHashMap.put("valueStr", trialSelfInspectionRecord.getReportNo());
                         return stringStringHashMap;
                     }
@@ -2185,6 +2194,9 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
     public R getSamplePdfUrl(String id, String contrctId) {
         try {
             String pdf = this.getMergePdfToTrial(Func.toLong(contrctId), Func.toLong(id));
+            if (pdf == null || pdf.isEmpty()) {
+                return R.fail("获取pdf文件失败");
+            }
             return R.data(pdf);
         } catch (FileNotFoundException e) {
             throw new RuntimeException(e);
@@ -2374,5 +2386,33 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         return record.getId();
     }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSort(TrialSelfInspectionRecordPageDTO dto) {
+        LambdaQueryWrapper<TrialSelfInspectionRecord> queryWrapper = Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                .eq(TrialSelfInspectionRecord::getNodeId, dto.getNodeId())
+                .eq(TrialSelfInspectionRecord::getType, dto.getType())
+                .eq(TrialSelfInspectionRecord::getContractId, dto.getContractId())
+                .eq(TrialSelfInspectionRecord::getIsDeleted, 0);
+        if (dto.getSortType() != null) {
+            if (dto.getSortType().equals("1")) {
+                queryWrapper.orderByAsc(TrialSelfInspectionRecord::getReportNo);
+            } else if (dto.getSortType().equals("2")) {
+                queryWrapper.orderByDesc(TrialSelfInspectionRecord::getReportNo);
+            } else if (dto.getSortType().equals("3")) {
+                queryWrapper.orderByAsc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
+            } else if (dto.getSortType().equals("4")) {
+                queryWrapper.orderByDesc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
+            }
+        }
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectList(queryWrapper);
+
+        if (CollectionUtil.isNotEmpty(trialSelfInspectionRecords)) {
+            for (int i = 0; i < trialSelfInspectionRecords.size(); i++) {
+                trialSelfInspectionRecords.get(i).setSort(i + 1);
+            }
+            //修改排序为连续排序
+            updateBatchById(trialSelfInspectionRecords);
+        }
+    }
 }

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ChekSignData.java

@@ -50,7 +50,7 @@ public class ChekSignData {
     @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         // 质检SQL
-        String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id,c.remark_type from u_information_query a ,u_task b ,m_project_info c where  c.id=a.project_id  and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) and a.chek_status=1 LIMIT 30";
+        String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id,c.remark_type from u_information_query a ,u_task b ,m_project_info c where  c.id=a.project_id  and a.`status` = 2 and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` = 2 and a.chek_status=1 LIMIT 30";
 
         List<ScrSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ScrSignInfoVO.class));
         if (query != null && query.size() >= 1 ) {

+ 2 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -64,7 +64,7 @@ public class EVController {
 
         log.info("扫描开始");
 
-        String sql = "SELECT GROUP_CONCAT(id) as id, JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.taskId')) as taskId," +
+        String sql = " SELECT GROUP_CONCAT(id) as id, JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.taskId')) as taskId," +
                 "GROUP_CONCAT(JSON_EXTRACT(json_data, '$.parallelProcessInstanceId')) as parallelProcessInstanceId," +
                 "JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.formDataId')) as formDataId," +
                 "JSON_EXTRACT(json_data, '$.approvalType') as approvalType," +
@@ -74,7 +74,7 @@ public class EVController {
                 "sign_type as sigType ," +
                 "(select count(0) from u_task_parallel b INNER JOIN u_task c on b.process_instance_id = c.process_instance_id " +
                 "where c.id = JSON_UNQUOTE(JSON_EXTRACT(a.json_data, '$.taskId')) and b.is_deleted = 0 and (b.status = 1 or b.initiative = 1)) isSignature" +
-                " from u_task_batch a where is_deleted=0  GROUP BY JSON_EXTRACT(json_data, '$.formDataId'),sign_type ORDER BY sign_type DESC ";
+                " from u_task_batch a where is_deleted=0  GROUP BY JSON_EXTRACT(json_data, '$.formDataId'),sign_type ORDER BY sign_type DESC,update_time ASC ";
 
         List<TaskSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskSignInfoVO.class));
 

+ 3 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -358,6 +358,7 @@ public class EVDataServiceImpl implements EVDataService {
                 this.jdbcTemplate.execute("update u_task set status=1 ,update_time=SYSDATE() where id='" + taskApp.getTaskId() + "'");
                 if (totalCount >= 3) {
                     this.jdbcTemplate.execute("delete from u_task_batch where id in(" + taskApp.getId()+")");
+                    this.jdbcTemplate.execute("update u_information_query set status=1 where id=" + taskApp.getFormDataId());
                 }
             }
             RedisTemplate.delete("sign-" + taskApp.getFormDataId());
@@ -451,10 +452,11 @@ public class EVDataServiceImpl implements EVDataService {
                 //中间计量用逗号拼接pagePdfUrl
                 String pageUrl = map.get("page_pdf_url")+"";
                 if(StringUtils.isNotEmpty(pageUrl) && pageUrl.length()>=20 ) {
-                    pageUrl = pageUrl.replaceAll(" ", "");
+                    pdfUrl = pageUrl.replaceAll(" ", "");
                 }else{
                     pdfUrl=map.get("raw_url") + "";
                 }
+                pdfUrl=map.get("raw_url") + "";
                 taskApp.setSignPdfUrl(pdfUrl);
             } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                 map = this.jdbcTemplate.queryForMap("select * from  s_material_start_statement where is_deleted=0 and meter_period_id = " + taskApp.getFormDataId());

+ 210 - 359
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java

@@ -40,7 +40,7 @@ public class ScrDataServiceImpl implements ScrDataService {
     /**
      * 电签检查
      */
-    public void sctTaskBatch2(ScrSignInfoVO taskApp) throws Exception {
+    public void sctTaskBatch3(ScrSignInfoVO taskApp) throws Exception {
         int threshold = 5;
 
         String fileUrl = CommonUtil.replaceOssUrl(taskApp.getEVisaPdfUrl());
@@ -49,366 +49,13 @@ public class ScrDataServiceImpl implements ScrDataService {
         InputStream inputStream2 = CommonUtil.getOSSInputStream(fileUrl);
         //转换
         byte[] pdfData = CommonUtil.InputStreamToBytes(inputStream);
-
-        PDDocument document = PDDocument.load(inputStream2);
-        SignKeyVO pdfSignIds = PdfAddimgUtil.getPdfSignIds(pdfUrl);
-        List<String> positions = pdfSignIds.getEVisaConfigList();
-        Map<String, String> dataMap = pdfSignIds.getDataMap();
-
-        List<String> sucessUser = new ArrayList<>();
-        List<String> sucessCompan = new ArrayList<>();
-        String ids = String.join(",", positions);
-        ids = ids.replaceAll("✹", "");
-        String remarkType = taskApp.getRemarkType();
-        List<Map<String, Object>> strategyListByDFZX = new ArrayList<>();
-        if(remarkType.equals("1")){
-            strategyListByDFZX = getStrategyListByAXQ(taskApp, ids);
-        } else if (remarkType.equals("2") || remarkType.equals("3")) {
-            strategyListByDFZX = getStrategyListByDFZX(taskApp, ids);
-        }
-
-        if(strategyListByDFZX==null || strategyListByDFZX.size()==0){
-
-            String sql2 = "UPDATE u_information_query set chek_status=3 where id='"+taskApp.getId()+"'";
+        if(pdfData==null || pdfData.length==0){
+            System.out.println("123");
+            String sql2 = "UPDATE u_information_query set chek_status=4,check_desc='无效的PDF' where id='" + taskApp.getId() + "'";
             jdbcTemplate.execute(sql2);
-
-            RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
-            System.out.println(taskApp.getProcessInstanceId()+"-"+"总共:" );
+            RedisTemplate.delete("chek-" + taskApp.getId());
             return;
         }
-
-        positions = strategyListByDFZX.stream().map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
-        String keyWord = String.join(",", positions);
-        List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, keyWord);
-
-        //根据id分组
-        List<Map<String, Object>> list2 = strategyListByDFZX.stream().collect(
-                Collectors.collectingAndThen(
-                        Collectors.toCollection(
-                                () -> new TreeSet<>(Comparator.comparing(m -> m.get("keyWord").toString()))
-                        ), ArrayList::new
-                )
-        );
-
-        Map<String, List<Map<String, Object>>> newMap = list2.stream().collect(Collectors.groupingBy(b -> Func.toStr(b.get("keyWord"))));
-
-        Map<String, List<PDFIndexInfo>> groupBy = pdfIndexInfo.stream().collect(Collectors.groupingBy(da -> Func.toStr(da.getDataInfo()[0])));
-
-        for (int i = 0; i < document.getPages().getCount(); i++) {
-            PDPage page = document.getPage(i);
-            List<PDAnnotation> annotations = page.getAnnotations();
-            for (PDAnnotation annotation : annotations) {
-                if (annotation instanceof PDAnnotationWidget) {
-                    PDRectangle rect = annotation.getRectangle();
-
-                    float imgW = rect.getWidth();
-                    float imgH = rect.getHeight();
-                    float imgX = rect.getLowerLeftX() + imgW / 2;
-                    float imgY = rect.getLowerLeftY() + imgH / 2;
-                    List<PDFIndexInfo> pdfIndexInfos = groupBy.get((i + 1) + ".0");
-                    if (pdfIndexInfos!=null && pdfIndexInfos.size() > 0) {
-                        for (PDFIndexInfo pdfInfo : pdfIndexInfos) {
-                            String pkeyid = pdfInfo.getPkeyid();
-
-                            float[] dataInfo = pdfInfo.getDataInfo();
-
-                            float keyX = dataInfo[1];
-                            float keyY = dataInfo[2];
-
-                            float pageHeight = page.getMediaBox().getHeight();
-                            float pageWidth = page.getMediaBox().getWidth();
-
-                            float keyw = keyX * pageWidth ;
-                            float keyh = pageHeight - keyY * pageHeight;
-
-                            List<Map<String, Object>> mapList = newMap.get(pkeyid);
-                            String keyData = dataMap.get(pkeyid);
-                            String userId="";
-                            String type="";
-                            if (mapList != null && mapList.size() >= 0) {
-                                Map<String, Object> map = mapList.get(0);
-                                Float pyzbx = Func.toFloat(map.get("pyzbx"));
-                                Float pyzby = Func.toFloat(map.get("pyzby"));
-                                 type = map.get("type")+"";
-                                userId = map.get("userId")+"";
-                                if(taskApp.getRemarkType().equals("3")){ //东方中讯
-                                    if(type.equals("1")){ //个人签字
-                                        keyw = keyw + pyzbx - 20;
-                                        keyh = keyh + pyzby ;
-
-                                    }else if(type.equals("2")){
-                                        keyw = keyw + pyzbx -21;
-                                        keyh = keyh + pyzby-16;
-                                        if(keyData.indexOf("||")>0){
-                                            keyw += 10;
-                                        }
-                                    }
-                                }else if(taskApp.getRemarkType().equals("2")){ //东方中讯
-                                    if(imgH>=100){ //个人签字
-                                        keyw = keyw + pyzbx - 20;
-                                        keyh = keyh + pyzby - 15;
-                                    }else{
-                                        keyw = keyw + pyzbx + 10;
-                                        keyh = keyh + pyzby;
-                                        if(keyData.indexOf("||")>0){
-                                            keyw += 10;
-                                        }
-                                    }
-                                }else{
-                                    keyw = keyw + pyzbx +5;
-                                    keyh = keyh + pyzby;
-                                }
-                            }
-                            System.out.println("type="+type+" imgX:" + "keyid="+pkeyid+"imgX:" + imgX + " keyw:" + keyw + " imgY:" + imgY + " keyh:" + keyh+"-imgH-"+imgH);
-                            if (Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold) {
-                                if(type.equals("1")){ //个人
-                                    sucessUser.add(pkeyid);
-                                }
-                                if(type.equals("2")){ //企业章
-                                    sucessCompan.add(pkeyid);
-                                }
-                                System.out.println("keyid="+pkeyid+"imgX:" + imgX + " keyw:" + keyw + " imgY:" + imgY + " keyh:" + keyh+"-imgH-"+imgH);
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        boolean isSign = false;
-        //判断章是否签完
-        List<String> companList = strategyListByDFZX.stream().filter(item -> item.get("type").equals("2")).map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
-        if(companList!=null && companList.size()>0){
-            Set<String> differentElements = new HashSet<>(companList);
-            differentElements.removeAll(sucessCompan);
-            if(differentElements==null || differentElements.size()==0){
-                isSign = true ;
-            }
-            System.out.println(taskApp.getId() +"-"+"章总共:" + companList.size() + "-剩下-" + differentElements.size());
-        }else{
-            isSign = true ;
-        }
-
-
-        //判断个人是否签完
-        List<String> userList = strategyListByDFZX.stream().filter(item -> item.get("type").equals("1")).map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
-        Map<String, String> dataUserMap = new HashMap<>(dataMap);
-
-        if(sucessUser!=null && sucessUser.size()>0 && isSign){
-            for(String user:sucessUser){
-                for(String mapkey:dataMap.keySet()){
-                    String mapval = dataMap.get(mapkey);
-                    if(mapval.contains(user)){
-                        dataUserMap.remove(mapkey) ;
-                    }
-                }
-            }
-            if(dataUserMap.keySet()==null || dataUserMap.keySet().size()==0){
-                isSign = true ;
-            }else{
-                isSign = false ;
-            }
-            System.out.println(taskApp.getId() +"-"+"个人总共:" + sucessUser.size() + "-剩下-" +dataUserMap.keySet().size());
-        }
-
-
-        if( isSign){
-            String sql2 = "UPDATE u_information_query set chek_status=2 where id='"+taskApp.getId()+"'";
-            jdbcTemplate.execute(sql2);
-        }else{
-            String sql2 = "UPDATE u_information_query set chek_status=3 where id='"+taskApp.getId()+"'";
-            jdbcTemplate.execute(sql2);
-        }
-        RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
-      //  System.out.println(taskApp.getProcessInstanceId()+"-"+"总共:" );
-      //  System.out.println(taskApp.getId() +"-"+"总共:" + positions.size() + "-剩下-" + differentElements.size());
-    }
-
-
-
-    // 添加电签策略 -- 安心签
-    public List<Map<String, Object>> getStrategyListByAXQ(ScrSignInfoVO task, String ids) {
-        String sql = "select task_user,initiative,status,(select  count(1) from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "' and initiative=2 and status=2) as pCount from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "'";
-        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
-        ArrayList<String> strArray = new ArrayList();
-        int pCount = 0;
-        if (mapList != null && mapList.size() >= 1) {
-            for (int i = 0; i < mapList.size(); i++) {
-                Map<String, Object> map = mapList.get(i);
-                if(i==0){
-                    pCount = Func.toInt(map.get("pCount"));
-                }
-                if((map.get("initiative")+"").equals("2") && (map.get("status")+"").equals("2")){
-                    strArray.add(map.get("task_user").toString());
-                }
-            }
-        }
-
-
-        List<Map<String, Object>> maps = new ArrayList<>();
-        String[] split = ids.split(",");
-        StringBuilder dqIds = new StringBuilder();
-        StringBuilder signIds = new StringBuilder();
-        for (String id : split) {
-            if (id != null && id.contains("✹")) {
-                signIds.append(id.substring(1)).append( ",");
-            } else {
-                dqIds.append(id).append( ",");
-            }
-        }
-        if (dqIds.length()>0) {
-            dqIds.deleteCharAt(dqIds.length()-1);
-        }
-        if (signIds.length()>0) {
-            signIds.deleteCharAt(signIds.length()-1);
-        }
-        if(strArray!=null && strArray.size()>0) {
-            for (int i = 0; i < strArray.size(); i++) {
-                List<Map<String, Object>> maps2 = null;
-                if (dqIds.length() > 0) {
-                    String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + strArray.get(i) + "' and is_deleted=0  ) as signature_file_url, '1' as type from m_textdict_info a where  a.type =2 and a.id in (" + dqIds + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + task.getContractId() + " and user_id=" + strArray.get(i) + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
-                    System.out.println("安心签--签字--" + sqlinfo);
-                    maps2 = jdbcTemplate.queryForList(sqlinfo);
-                }
-                if(CollectionUtil.isNotEmpty(maps2)) {
-                    Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                            .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
-                    for (String keyId : peopleByAge.keySet()) {
-                        int exId = 0;
-                        List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-                        if (keyList != null && keyList.size() == 1) {
-                            maps.addAll(keyList);
-                            exId = 1;
-                        } else if (keyList != null && keyList.size() >= 2) {
-                            for (Map<String, Object> datax : keyList) {
-                                if ((datax.get("project_id") + "").equals(task.getProjectId())) {
-                                    maps.add(datax);
-                                    exId = 1;
-                                }
-                            }
-                        }
-                        if (exId == 0) {
-                            maps.add(keyList.get(0));
-                        }
-                    }
-                } else {
-                    // 查询 sign_data 表
-                    List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT * from m_sign_data where query_id = ? and text_id in (?) and user_id = ? and type = 1", task.getId(), dqIds, strArray.get(i));
-                    if (!list.isEmpty()) {
-                        System.out.println("1111111111111111111");
-                    }
-                }
-            }
-
-
-
-            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId, '2' as type from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ")";
-            System.out.println("安心签--签章--" + sqlinfo);
-            List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
-            if(CollectionUtil.isNotEmpty(maps2)) {
-                Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                        .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
-                for (String keyId : peopleByAge.keySet()) {
-                    int exId = 0;
-                    List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-                    if (keyList != null && keyList.size() == 1) {
-                        maps.addAll(keyList);
-                        exId = 1;
-                    } else if (keyList != null && keyList.size() >= 2) {
-                        for (Map<String, Object> datax : keyList) {
-                            if ((datax.get("project_id") + "").equals(task.getProjectId())) {
-                                maps.add(datax);
-                                exId = 1;
-                            }
-                        }
-                    }
-                    if (exId == 0) {
-                        maps.add(keyList.get(0));
-                    }
-                }
-            } else {
-                System.out.println("22222222222222222222");
-            }
-        }
-        return maps;
-    }
-
-    // 添加电签策略 -- 东方中讯
-    public List<Map<String, Object>> getStrategyListByDFZX(ScrSignInfoVO taskApp, String ids) {
-        List<Map<String, Object>> maps = new ArrayList<>();
-        List<Map<String, Object>> maps2 = new ArrayList<>();
-     //   String sql = "select * from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2";
-
-        String sql = "select task_user,initiative,status,(select  count(1) from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2) as pCount from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "'";
-        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
-
-        int total = mapList.size();
-        int pCount = 0;
-
-        if (mapList != null && mapList.size() > 0) {
-            for (Map<String, Object> task : mapList) {
-                String taskUserId = Func.toStr(task.get("task_user"));
-                String initiative = Func.toStr(task.get("initiative"));
-                String status = Func.toStr(task.get("status"));
-                if(initiative.equals("2") && status.equals("2")) {
-                    String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + taskUserId + "' and is_deleted=0  ) as sealId,'" + taskUserId + "' as userId,'1' as type from m_textdict_info a where  a.type =2 and a.id in (" + ids + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + taskApp.getContractId() + " and user_id=" + taskUserId + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
-                    System.out.println("扫描-签字-sql=" + sqlinfo);
-                    List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
-                    maps2.addAll(maps3);
-                }
-            }
-            pCount = Func.toInt(mapList.get(0).get("pCount"));
-
-        }
-        // 添加章
-        if (total==pCount) {
-            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId,'2' as type from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + taskApp.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
-            System.out.println("扫描-签章-sql=" + sqlinfo);
-            List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
-            if (mapList != null && mapList.size() > 0) {
-                maps2.addAll(maps3);
-            }
-        }
-        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
-        for (String keyId : peopleByAge.keySet()) {
-            int exId = 0;
-            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-            if (keyList != null && keyList.size() == 1) {
-                maps.addAll(keyList);
-                exId = 1;
-            } else if (keyList != null && keyList.size() >= 2) {
-                for (Map<String, Object> datax : keyList) {
-                    if ((datax.get("project_id") + "").equals(taskApp.getProjectId())) {
-                        maps.add(datax);
-                        exId = 1;
-                    }
-                }
-            }
-            if (exId == 0) {
-                maps.add(keyList.get(0));
-            }
-        }
-
-        if(maps!=null & maps.size()==0 && mapList.size()>=4 ){
-            System.out.println("123");
-        }
-
-
-        return maps;
-    }
-
-    public void sctTaskBatch3(ScrSignInfoVO taskApp) throws Exception {
-        int threshold = 5;
-
-        String fileUrl = CommonUtil.replaceOssUrl(taskApp.getEVisaPdfUrl());
-        String pdfUrl = taskApp.getEVisaPdfUrl();
-        InputStream inputStream = CommonUtil.getOSSInputStream(fileUrl);
-        InputStream inputStream2 = CommonUtil.getOSSInputStream(fileUrl);
-        //转换
-        byte[] pdfData = CommonUtil.InputStreamToBytes(inputStream);
-
         try (PDDocument document = PDDocument.load(inputStream2);) {
             SignKeyVO pdfSignIds = PdfAddimgUtil.getPdfSignIds(pdfUrl);
             List<String> positions = pdfSignIds.getEVisaConfigList();
@@ -678,8 +325,182 @@ public class ScrDataServiceImpl implements ScrDataService {
         }
     }
 
+
+
+    // 添加电签策略 -- 安心签
+    public List<Map<String, Object>> getStrategyListByAXQ(ScrSignInfoVO task, String ids) {
+        String sql = "select task_user,initiative,status,(select  count(1) from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "' and initiative=2 and status=2) as pCount from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "'";
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
+        ArrayList<String> strArray = new ArrayList();
+        int pCount = 0;
+        if (mapList != null && mapList.size() >= 1) {
+            for (int i = 0; i < mapList.size(); i++) {
+                Map<String, Object> map = mapList.get(i);
+                if(i==0){
+                    pCount = Func.toInt(map.get("pCount"));
+                }
+                if((map.get("initiative")+"").equals("2") && (map.get("status")+"").equals("2")){
+                    strArray.add(map.get("task_user").toString());
+                }
+            }
+        }
+
+
+        List<Map<String, Object>> maps = new ArrayList<>();
+        String[] split = ids.split(",");
+        StringBuilder dqIds = new StringBuilder();
+        StringBuilder signIds = new StringBuilder();
+        for (String id : split) {
+            if (id != null && id.contains("✹")) {
+                signIds.append(id.substring(1)).append( ",");
+            } else {
+                dqIds.append(id).append( ",");
+            }
+        }
+        if (dqIds.length()>0) {
+            dqIds.deleteCharAt(dqIds.length()-1);
+        }
+        if (signIds.length()>0) {
+            signIds.deleteCharAt(signIds.length()-1);
+        }
+        if(strArray!=null && strArray.size()>0) {
+            for (int i = 0; i < strArray.size(); i++) {
+                List<Map<String, Object>> maps2 = null;
+                if (dqIds.length() > 0) {
+                    String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + strArray.get(i) + "' and is_deleted=0  ) as signature_file_url, '1' as type from m_textdict_info a where  a.type =2 and a.id in (" + dqIds + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + task.getContractId() + " and user_id=" + strArray.get(i) + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
+                    System.out.println("安心签--签字--" + sqlinfo);
+                    maps2 = jdbcTemplate.queryForList(sqlinfo);
+                }
+                if(CollectionUtil.isNotEmpty(maps2)) {
+                    Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                            .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+                    for (String keyId : peopleByAge.keySet()) {
+                        int exId = 0;
+                        List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                        if (keyList != null && keyList.size() == 1) {
+                            maps.addAll(keyList);
+                            exId = 1;
+                        } else if (keyList != null && keyList.size() >= 2) {
+                            for (Map<String, Object> datax : keyList) {
+                                if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                    maps.add(datax);
+                                    exId = 1;
+                                }
+                            }
+                        }
+                        if (exId == 0) {
+                            maps.add(keyList.get(0));
+                        }
+                    }
+                } else {
+                    // 查询 sign_data 表
+                    List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT * from m_sign_data where query_id = ? and text_id in (?) and user_id = ? and type = 1", task.getId(), dqIds, strArray.get(i));
+                    if (!list.isEmpty()) {
+                        System.out.println("1111111111111111111");
+                    }
+                }
+            }
+
+
+
+            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId, '2' as type from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ")";
+            System.out.println("安心签--签章--" + sqlinfo);
+            List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
+            if(CollectionUtil.isNotEmpty(maps2)) {
+                Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                        .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+                for (String keyId : peopleByAge.keySet()) {
+                    int exId = 0;
+                    List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                    if (keyList != null && keyList.size() == 1) {
+                        maps.addAll(keyList);
+                        exId = 1;
+                    } else if (keyList != null && keyList.size() >= 2) {
+                        for (Map<String, Object> datax : keyList) {
+                            if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                maps.add(datax);
+                                exId = 1;
+                            }
+                        }
+                    }
+                    if (exId == 0) {
+                        maps.add(keyList.get(0));
+                    }
+                }
+            } else {
+                System.out.println("22222222222222222222");
+            }
+        }
+        return maps;
+    }
+
+    // 添加电签策略 -- 东方中讯
+    public List<Map<String, Object>> getStrategyListByDFZX(ScrSignInfoVO taskApp, String ids) {
+        List<Map<String, Object>> maps = new ArrayList<>();
+        List<Map<String, Object>> maps2 = new ArrayList<>();
+     //   String sql = "select * from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2";
+
+        String sql = "select task_user,initiative,status,(select  count(1) from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2) as pCount from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "'";
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
+
+        int total = mapList.size();
+        int pCount = 0;
+
+        if (mapList != null && mapList.size() > 0) {
+            for (Map<String, Object> task : mapList) {
+                String taskUserId = Func.toStr(task.get("task_user"));
+                String initiative = Func.toStr(task.get("initiative"));
+                String status = Func.toStr(task.get("status"));
+                if(initiative.equals("2") && status.equals("2")) {
+                    String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + taskUserId + "' and is_deleted=0  ) as sealId,'" + taskUserId + "' as userId,'1' as type from m_textdict_info a where  a.type =2 and a.id in (" + ids + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + taskApp.getContractId() + " and user_id=" + taskUserId + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
+                    System.out.println("扫描-签字-sql=" + sqlinfo);
+                    List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
+                    maps2.addAll(maps3);
+                }
+            }
+            pCount = Func.toInt(mapList.get(0).get("pCount"));
+
+        }
+        // 添加章
+        if (total==pCount) {
+            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId,'2' as type from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + taskApp.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
+            System.out.println("扫描-签章-sql=" + sqlinfo);
+            List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
+            if (mapList != null && mapList.size() > 0) {
+                maps2.addAll(maps3);
+            }
+        }
+        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+        for (String keyId : peopleByAge.keySet()) {
+            int exId = 0;
+            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+            if (keyList != null && keyList.size() == 1) {
+                maps.addAll(keyList);
+                exId = 1;
+            } else if (keyList != null && keyList.size() >= 2) {
+                for (Map<String, Object> datax : keyList) {
+                    if ((datax.get("project_id") + "").equals(taskApp.getProjectId())) {
+                        maps.add(datax);
+                        exId = 1;
+                    }
+                }
+            }
+            if (exId == 0) {
+                maps.add(keyList.get(0));
+            }
+        }
+
+        if(maps!=null & maps.size()==0 && mapList.size()>=4 ){
+            System.out.println("123");
+        }
+
+
+        return maps;
+    }
+
     /**
-     * 获取所有电签关键字的位置
+     * 获取电签关键字的位置
      */
     public Map<String, float[]> getKeyPositions(SignKeyVO pdfSignIds,byte[] pdfData) throws Exception {
         if (pdfSignIds == null) {
@@ -709,6 +530,7 @@ public class ScrDataServiceImpl implements ScrDataService {
             Map<String, String> dataMap = pdfSignIds.getDataMap();
             String keyWord = String.join(",", positions);
             List<String> sucessList = new ArrayList<>();
+            Map<String, List<Map<String, Object>>> signatureDataMap = getSignatureData(taskApp.getId() + "", taskApp.getRemarkType(), keyWord);
             List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, keyWord);
             Map<String, List<PDFIndexInfo>> groupBy = pdfIndexInfo.stream().collect(Collectors.groupingBy(da -> Func.toStr(da.getDataInfo()[0])));
             for (int i = 0; i < document.getPages().getCount(); i++) {
@@ -735,6 +557,22 @@ public class ScrDataServiceImpl implements ScrDataService {
                                 float keyh = pageHeight - keyY * pageHeight;
                                 float pyzbx = 0.0f;
                                 float pyzby = 0.0f;
+                                List<Map<String, Object>> maps = signatureDataMap.get(pkeyid);
+                                if (maps != null && !maps.isEmpty()) {
+                                    boolean flag = false;
+                                    for (Map<String, Object> map : maps) {
+                                        Float pyzbx1 = Func.toFloat(map.get("pyzbx"));
+                                        Float pyzby1 = Func.toFloat(map.get("pyzby"));
+                                        if (Math.abs(imgX - keyw - pyzbx1) <= threshold && Math.abs(imgY - keyh - pyzby1) <= threshold) {
+                                            sucessList.add(pkeyid);
+                                            flag = true;
+                                            break;
+                                        }
+                                    }
+                                    if (flag) {
+                                        break;
+                                    }
+                                }
                                 if (taskApp.getRemarkType().equals("3")) { //东方中讯
                                     if (imgH >= 100) {
                                         // 签章
@@ -784,4 +622,17 @@ public class ScrDataServiceImpl implements ScrDataService {
             return dataUserMap;
         }
     }
+
+    private Map<String, List<Map<String, Object>>> getSignatureData(String queryId, String signType, String ids) {
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select text_id as keyword, type, pyzbx, pyzby from m_sign_data where query_id = " + queryId);
+        if (ids != null && !ids.isEmpty()) {
+            ids = ids.replaceAll("✹", "").replaceAll("\\*",  "");
+            List<Map<String, Object>> list = jdbcTemplate.queryForList("select text_id as keyword, type, pyzbx, pyzby from m_sign_data where query_id = -1 and user_id = -1 and text_id in (" + ids + ") and sign_type = " + signType);
+            mapList.addAll(list);
+        }
+        if (!mapList.isEmpty()) {
+            return mapList.stream().collect(Collectors.groupingBy(item -> (Func.toStr(item.get("keyword")))));
+        }
+        return new HashMap<>();
+    }
 }

+ 21 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1699,13 +1699,22 @@ public class ExcelTabController extends BladeController {
                 .sorted(Comparator.comparing(WbsTreeContract::getCreateTime)).collect(Collectors.toList());
         //如果数量对不上说明有错的情况就进来,进行修改,现在wbsTreeContractList2就是正常的
         if (strings.size() != wbsTreeContractList2.size()) {
+            boolean isFirst = true;
             for (int i = 0; i < wbsTreeContractList2.size(); i++) {
+                WbsTreeContract wbsTreeContract = wbsTreeContractList2.get(i);
+                if (Objects.equals(wbsInfo.getIsTypePrivatePid(), wbsTreeContract.getIsTypePrivatePid()) && Objects.equals(wbsTreeContract.getNodeName(), split[0]) && (wbsTreeContract.getIsCopeTab() == null || !wbsTreeContract.getIsCopeTab().equals(2))) {
+                    if (isFirst) {
+                        isFirst = false;
+                    } else {
+                        wbsTreeContract.setIsCopeTab(2);
+                    }
+                }
                 //是复制表
-                if (wbsTreeContractList2.get(i).getIsCopeTab() != null && wbsTreeContractList2.get(i).getIsCopeTab().equals(Integer.valueOf(2))) {
+                if (wbsTreeContract.getIsCopeTab() != null && wbsTreeContract.getIsCopeTab().equals(2)) {
                     String nodeName = wbsTreeContractList2.get(0).getNodeName().split("__")[0];
                     nodeName = nodeName + "__" + (i);
-                    wbsTreeContractList2.get(i).setNodeName(nodeName);
-                    String update = "UPDATE m_wbs_tree_contract Set node_name= " + "'" + wbsTreeContractList2.get(i).getNodeName() + "'" + " WHERE p_key_id=" + wbsTreeContractList2.get(i).getPKeyId();
+                    wbsTreeContract.setNodeName(nodeName);
+                    String update = "UPDATE m_wbs_tree_contract Set is_cope_tab = 2, node_name= " + "'" + wbsTreeContract.getNodeName() + "'" + " WHERE p_key_id=" + wbsTreeContract.getPKeyId();
                     jdbcTemplate.update(update);
                 }
             }
@@ -1729,6 +1738,7 @@ public class ExcelTabController extends BladeController {
             nodeName = nodeName + "__" + 1;
         }
         wbsTreeContract.setNodeName(nodeName);
+        wbsTreeContract.setSort(wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getSort() + 1);
         wbsTreeContract.setIsCopeTab(2);
         wbsTreeContract.setIsTabPdf(1); // pdf 不能预览
         wbsTreeContract.setIsBussShow(1); // 是否隐藏表
@@ -4301,20 +4311,17 @@ public class ExcelTabController extends BladeController {
         }else {
             WbsTreeContract wbsInfo = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                     .eq(WbsTreeContract::getPKeyId, pkeyId));
-            if(wbsInfo.getIsTypePrivatePid()!=null){
-                String sql="select * from m_wbs_tree_contract where p_id="+wbsInfo.getPId()+" and is_type_private_pid="+wbsInfo.getIsTypePrivatePid()+" and project_id="+wbsInfo.getProjectId();
-                List<WbsTreeContract> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-                if(!list.isEmpty()){
-                    for (WbsTreeContract wbsTreeContract : list) {
-                        String tabName = wbsTreeContract.getInitTableName();
-                        if (StringUtils.isNotEmpty(tabName)) {
-                            String delSql = "delete from " + tabName + " where p_key_id = " + wbsTreeContract.getPKeyId();
-                            jdbcTemplate.execute(delSql);
-                        }
+            String sql="select * from m_wbs_tree_contract where p_id="+wbsInfo.getPId()+" and is_type_private_pid="+wbsInfo.getIsTypePrivatePid();
+            List<WbsTreeContract> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if(!list.isEmpty()){
+                for (WbsTreeContract wbsTreeContract : list) {
+                    String tabName = wbsTreeContract.getInitTableName();
+                    if (StringUtils.isNotEmpty(tabName)) {
+                        String delSql = "delete from " + tabName + " where p_key_id = " + wbsTreeContract.getPKeyId();
+                        jdbcTemplate.execute(delSql);
                     }
                 }
             }
-
         }
         return R.data("成功!");
     }

+ 43 - 20
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -413,29 +413,45 @@ public class FormulaController {
     @ApiOperation(value = "公式交互面板", notes = "公式交互面板")
     public R<Object> panel(FormulaOptionVo fo) {
         Map<String, Object> result = new LinkedHashMap<>();
-        String key = fo.getKey().replaceAll("__[\\d_]+", "");
-        ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
-        WbsTreeContract parent = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,fo.getParentId()).eq(WbsTreeContract::getContractId,fo.getContractId()).last("limit 1"));
-
-        List<KeyMapper> kms = this.service.getKeyMapperList(Collections.singletonList(fo.getPkeyId()), contract.getPId(), parent.getPKeyId().toString(), ExecuteType.INSPECTION);
-        KeyMapper keyMapper = null;
-        if (Func.isNotEmpty(kms)) {
-            Optional<KeyMapper> optionalKeyMapper = kms.stream().filter(e -> StringUtils.isEquals(e.getField(), key)).findFirst();
-            if (optionalKeyMapper.isPresent()) {
-                keyMapper = optionalKeyMapper.get();
+        String key1 = fo.getKey();
+        String[] split = key1.split(",");
+
+        int i = 0;
+        int type = 0;
+
+        for (String key2 : split) {
+            String key = key2.replaceAll("__[\\d_]+", "");
+            ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
+            WbsTreeContract parent = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,fo.getParentId()).eq(WbsTreeContract::getContractId,fo.getContractId()).last("limit 1"));
+
+            List<KeyMapper> kms = this.service.getKeyMapperList(Collections.singletonList(fo.getPkeyId()), contract.getPId(), parent.getPKeyId().toString(), ExecuteType.INSPECTION);
+            KeyMapper keyMapper = null;
+            if (Func.isNotEmpty(kms)) {
+                Optional<KeyMapper> optionalKeyMapper = kms.stream().filter(e -> StringUtils.isEquals(e.getField(), key)).findFirst();
+                if (optionalKeyMapper.isPresent()) {
+                    keyMapper = optionalKeyMapper.get();
+                }
             }
-        }
-        if (keyMapper != null && Func.isNotEmpty(keyMapper.getFormulaId())) {
-            Formula formula = this.service.getById(keyMapper.getFormulaId());
-            /*临时处理,等确定数据结构在优化*/
-            if (formula.getFormula().contains(".option")) {
-                return R.data(createRadioPanel(0, "是否引用公式数据", this.formulaOptionService.queryOption(fo.getContractId(), fo.getParentId(), fo.getPkeyId(), key)));
-            } else if (StringUtils.isEquals("MILE", formula.getNumber()) || StringUtils.isEquals("TURN_POINT", formula.getNumber())) {
-                if (StringUtils.isEquals(key, formula.getRelyList().get(0).split(StringPool.COLON)[1])) {
-                    return R.data(createRadioPanel(1, "竖直方向", this.formulaOptionService.queryOption(fo.getContractId(), fo.getParentId(), fo.getPkeyId(), fo.getKey())));
+            if (keyMapper != null && Func.isNotEmpty(keyMapper.getFormulaId())) {
+                Formula formula = this.service.getById(keyMapper.getFormulaId());
+                /*临时处理,等确定数据结构在优化*/
+                if (formula.getFormula().contains(".option")) {
+                    i++;
+                } else if (StringUtils.isEquals("MILE", formula.getNumber()) || StringUtils.isEquals("TURN_POINT", formula.getNumber())) {
+                    if (StringUtils.isEquals(key, formula.getRelyList().get(0).split(StringPool.COLON)[1])) {
+                        type = 1;
+                        i++;
+                    }
                 }
+                R.success("暂无公式控件");
+            }
+        }
+        if(split.length == i){
+            if(type == 0){
+                return R.data(createRadioPanel(0, "是否引用公式数据", this.formulaOptionService.queryOption(fo.getContractId(), fo.getParentId(), fo.getPkeyId(), split[0])));
+            }else{
+                return R.data(createRadioPanel(1, "竖直方向", this.formulaOptionService.queryOption(fo.getContractId(), fo.getParentId(), fo.getPkeyId(), split[0])));
             }
-            R.success("暂无公式控件");
         }
         return R.data(result);
     }
@@ -459,6 +475,13 @@ public class FormulaController {
         return R.data(this.formulaOptionService.saveOrUpdateOption(fo));
     }
 
+    @PostMapping("/panel-save-list")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "公式交互面板参数保存(批量)", notes = "公式交互面板参数保存(批量)")
+    public R<Object> panelSaveList(@RequestBody FormulaOptionVo fos) {
+        return R.data(this.formulaOptionService.saveOrUpdateOption(fos));
+    }
+
     @GetMapping("/log")
     public R<Object> log(Long pkeyId) throws UnknownHostException {
         Map<String, Object> result = new HashMap<>();

+ 317 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.aspose.cells.LoadFormat;
 import com.aspose.cells.LoadOptions;
 import com.aspose.cells.SaveFormat;
@@ -11,6 +12,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.google.common.collect.Lists;
 import com.spire.xls.FileFormat;
 import com.spire.xls.Worksheet;
+import com.spire.xls.collections.WorksheetsCollection;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -35,6 +37,7 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
@@ -55,6 +58,7 @@ import org.springblade.manager.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.core.io.Resource;
+import org.springframework.dao.DataAccessException;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
@@ -640,6 +644,319 @@ public class WbsTreeContractController extends BladeController {
         return R.data(null, "没有获取到excel中的数据");
     }
 
+
+    /**
+     * 客户端-导入excel数据到对应元素表中(批量)
+     *
+     * @author liuyc
+     * @date 2023年8月29日
+     */
+    @PostMapping("/import-excel-list")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "客户端-导入excel数据到对应元素表中(批量)", notes = "传入表的pKeyId、excel文件file")
+    public R<Map<String, Object>> importExcelList(@RequestParam Long pKeyId,
+                                                  @RequestPart MultipartFile file) {
+        WbsTreeContract byId = wbsTreeContractServiceImpl.getById(pKeyId);
+        List<String> integers = new ArrayList<>();
+        integers.add("4");
+        integers.add("5");
+        integers.add("6");
+
+        Integer classify = 1;
+        if (byId.getTableOwner() != null && integers.contains(byId.getTableOwner())) {
+            classify = 2;
+        }
+        //查询与当前表及所有复制表
+        List<WbsTreeContract> list = wbsTreeContractServiceImpl.list(Wrappers.<WbsTreeContract>lambdaQuery()
+                .eq(WbsTreeContract::getPId, byId.getPId())
+                .eq(WbsTreeContract::getInitTableName, byId.getInitTableName())
+                .in(WbsTreeContract::getTableOwner, byId.getTableOwner())
+                .orderByAsc(WbsTreeContract::getSort)
+                .orderByAsc(WbsTreeContract::getFullName)
+                .orderByAsc(WbsTreeContract::getCreateTime)
+        );
+        // 查找目标ID的索引
+        int targetIndex = -1;
+
+        //只记录当前这个表及它排序下的表
+        for (int i = 0; i < list.size(); i++) {
+            if (Objects.equals(pKeyId, list.get(i).getPKeyId())) {
+                targetIndex = i;
+                break;
+            }
+        }
+        if (targetIndex != -1) {
+            list = list.subList(targetIndex, list.size());
+        }
+
+        ArrayList<Map<String, Object>> maps = new ArrayList<>();
+
+
+        //日期格式正则
+        String doubleSlashRegex_XG = ".*\\/[^\\/]*\\/.*"; //匹配包含两个斜杠且不相邻的字符串
+        String dateFormatRegex_yyyyMdd = "\\d{4}/\\d{1,2}/\\d{1,2}"; //yyyy/M/dd格式
+        String dateFormatRegex_yyyyMMdd = "\\d{4}/\\d{2}/\\d{2}";   //yyyy/MM/dd格式
+        String dateFormatRegex_chinese = "(\\d{4}年\\d{1,2}月\\d{1,2}日|\\d{4}年\\d{2}月\\d{2}日)"; //“2023年1月1日、2023年01月01日”这两种格式
+        SimpleDateFormat inputDateFormat = new SimpleDateFormat("yyyy/M/dd");
+        SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+
+
+        //创建一个临时html路径
+        Long id = SnowFlakeUtil.getId();
+        String importExcelFilePath = FileUtils.getSysLocalFileUrl();
+        String importExcelTOHtmlPath = importExcelFilePath + "/pdf//" + id + ".html";
+
+        //解析匹配数据(rul_1为临时文件地址,接口执行后删除,用流读取会导致htmlString_2乱码,只能存储本地后再解析)
+        String url_1 = "";
+        //文件转workbook
+        com.spire.xls.Workbook workbook = null;
+
+        try {
+            workbook = new com.spire.xls.Workbook();
+            workbook.loadFromHtml(file.getInputStream());
+            WorksheetsCollection worksheets = workbook.getWorksheets();
+            workbook.saveToFile(importExcelTOHtmlPath, FileFormat.HTML);
+            int size = worksheets.size();
+
+            //获取第一张表的行和列,然后其他表与第一张表的行、列不匹配,就说明表格错误
+            Worksheet worksheet = worksheets.get(0);
+            int lastRow = worksheet.getLastRow();
+            int lastColumn = worksheet.getLastColumn();
+            //排除空表
+            for (int x = 0; x < size; x++) {
+                Worksheet sheet = worksheets.get(x);
+                if(lastRow != sheet.getLastRow() && lastColumn != sheet.getLastColumn()){
+                    worksheets.remove(x);
+                    size = worksheets.size();
+                }
+            }
+            //如果sheet比数据库中表多 则需要添加复制表
+            if (size > list.size()) {
+                //却几张复制几张 并且复制出来的排序要再最后
+                for (int i = 0; i < size - list.size(); i++) {
+                    excelTabController.copeBussTab(pKeyId);
+                }
+
+                list = wbsTreeContractServiceImpl.list(Wrappers.<WbsTreeContract>lambdaQuery()
+                        .eq(WbsTreeContract::getPId, byId.getPId())
+                        .eq(WbsTreeContract::getInitTableName, byId.getInitTableName())
+                        .in(WbsTreeContract::getTableOwner, byId.getTableOwner())
+                        .orderByAsc(WbsTreeContract::getSort)
+                        .orderByAsc(WbsTreeContract::getFullName)
+                        .orderByAsc(WbsTreeContract::getCreateTime)
+                );
+
+                //只记录当前这个表及它排序下的表
+                for (int i = 0; i < list.size(); i++) {
+                    if (Objects.equals(pKeyId, list.get(i).getPKeyId())) {
+                        targetIndex = i;
+                        break;
+                    }
+                }
+                if (targetIndex != -1) {
+                    list = list.subList(targetIndex, list.size());
+                }
+            }
+            if (size > list.size()) {
+                return R.fail("添加复制表失败");
+            }
+
+
+            //获取转换成功后的html路径
+            url_1 = importExcelTOHtmlPath.split("pdf//")[0];
+
+            for (int x = 0; x < size; x++) {
+                //结果集
+                Map<String, String> stringStringMap = new HashMap<>();
+
+
+                WbsTreeContract wbsTreeContract = list.get(x);
+
+                //获取当前表htmlString
+                String htmlString_1 = wbsTreeContractServiceImpl.getHtmlString(String.valueOf(wbsTreeContract.getPKeyId()));
+
+                Worksheet sheet = worksheets.get(x);
+                String excelToHtmlFileUrl = url_1 + "/pdf/" + id + "_files/" + sheet.getName() + ".html";
+                String htmlString_2 = IoUtil.readToString(new FileInputStream(ResourceUtil.getFile(excelToHtmlFileUrl)));
+                //循环遍历解析两张html的tr、td
+                Document doc_1 = Jsoup.parse(htmlString_1); //合同段表的html
+                Document doc_2 = Jsoup.parse(htmlString_2); //导入excel转换的html
+                Elements trElements1 = doc_1.select("table tbody tr");
+                Elements trElements2 = doc_2.select("table tbody tr");
+                for (int i = 0; i < trElements1.size(); i++) {
+                    Element tr1 = trElements1.get(i);
+                    Element tr2 = trElements2.get(i);
+                    //排除电签单元格
+                    Elements tdElements1 = tr1.select("td");
+                    Elements tdElements2 = tr2.select("td");
+                    for (int j = 0; j < tdElements1.size(); j++) {
+                        Element td1 = tdElements1.get(j);
+                        // 检查td1是否包含dqid属性,如果包含则跳过
+                        if (td1.attr("dqid").length() > 0) {
+                            continue;
+                        }
+                        Element td2 = tdElements2.get(j);
+                        String keyName = getKeyNameFromChildElement(td1);
+                        if (StringUtils.isNotEmpty(keyName)) {
+                            String[] split = keyName.split("__");
+
+                            String divValue = td2.text(); //获取文本值
+                            if (StringUtils.isNotEmpty(divValue)) {
+                                if (parseDateRange(divValue).size() == 2) {
+                                    //判断范围日期
+                                    List<String> dateArr = parseDateRange(divValue);
+                                    String value = stringStringMap.get(split[0]);
+
+                                    String dataValue = "[" + dateArr.get(0) + "," + dateArr.get(1) + "]" + "_^_" + split[1];
+                                    if (value != null) {
+                                        value = value + "☆" + dataValue;
+                                    } else {
+                                        value = dataValue;
+                                    }
+                                    // key_1  1_^_1_1
+                                    stringStringMap.put(split[0], value);
+                                    continue;
+                                }
+                                //判断是否存在两个斜杠,且不在一起,那么视为日期格式
+                                Pattern pattern_XG = Pattern.compile(doubleSlashRegex_XG);
+                                Matcher matcher_XG = pattern_XG.matcher(divValue);
+                                if (matcher_XG.matches()) {
+                                    //判断日期格式yyyy/M/dd、yyyy/MM/dd
+                                    Pattern pattern_yyyyMdd = Pattern.compile(dateFormatRegex_yyyyMdd);
+                                    Pattern pattern_yyyyMMdd = Pattern.compile(dateFormatRegex_yyyyMMdd);
+                                    Matcher matcher_yyyyMdd = pattern_yyyyMdd.matcher(divValue);
+                                    Matcher matcher_yyyyMMdd = pattern_yyyyMMdd.matcher(divValue);
+                                    if (matcher_yyyyMdd.matches()) {
+                                        Date date = inputDateFormat.parse(divValue);
+                                        divValue = outputDateFormat.format(date);
+                                    } else if (matcher_yyyyMMdd.matches()) {
+                                        Date date = inputDateFormat.parse(divValue);
+                                        divValue = outputDateFormat.format(date);
+                                    }
+
+                                } else if (divValue.contains("年") && divValue.contains("月") && divValue.contains("日")) {
+                                    //判断如:“2023年1月1日、2023年01月01日”这两种格式
+                                    Pattern pattern_chinese = Pattern.compile(dateFormatRegex_chinese);
+                                    Matcher matcher_chinese = pattern_chinese.matcher(divValue);
+                                    if (matcher_chinese.matches()) {
+                                        Date date = outputDateFormat.parse(divValue);
+                                        divValue = outputDateFormat.format(date);
+                                    }
+                                }
+                                String value = stringStringMap.get(split[0]);
+
+                                String dataValue = divValue + "_^_" + split[1];
+                                if (value != null) {
+                                    value = value + "☆" + dataValue;
+                                } else {
+                                    value = dataValue;
+                                }
+                                stringStringMap.put(split[0], value);
+                            }
+                        }
+                    }
+                }
+
+                //先查询 如果有 则修改数据
+
+                String selectSql = "select * from " + byId.getInitTableName() + " where p_key_id = " + wbsTreeContract.getPKeyId();
+
+                Map<String, Object> initId = null;
+                try {
+                    List<Map<String, Object>> hashMaps = jdbcTemplate.queryForList(selectSql);
+                    if(CollectionUtil.isNotEmpty(hashMaps)){
+                        initId = hashMaps.get(0);
+                    }
+                } catch (DataAccessException e) {
+                    initId = null;
+                }
+                String sql = null;
+                if (initId != null) {
+                    sql = "update " + byId.getInitTableName() + " set ";
+                    //导入的数据
+                    Set<Map.Entry<String, String>> entries = stringStringMap.entrySet();
+                    StringBuilder sb = new StringBuilder();
+                    Map<String, Object> finalInitId = initId;
+                    entries.forEach(f -> {
+                        //原先是否存在值 是否为☆拼接的多数据
+                        String oldValue = (String) finalInitId.get(f.getKey());
+                        if (StringUtils.isNotEmpty(oldValue)) {
+                            //当前keu坐标与数据的对应关系
+                            HashMap<String, String> newCoordinate = new HashMap<>();
+                            //旧数据中需要保留的数据
+                            List<String> oldRetainData = new ArrayList<>();
+                            //导入的数据
+                            String[] newSp = f.getValue().split("☆");
+                            for (String s : newSp) {
+                                //单个单元格的数据
+                                String[] split1 = s.split("_\\^_");
+                                newCoordinate.put(split1[1], split1[0]);
+                            }
+                            //旧数据
+                            String[] oldSp = oldValue.split("☆");
+                            for (String s : oldSp) {
+                                //单个单元格的数据
+                                String[] split1 = s.split("_\\^_");
+                                //根据旧数据的坐标去新数据中查询
+                                String s1 = newCoordinate.get(split1[1]);
+                                //如果没有查询到就需要当前坐标数据
+                                if (s1 == null) {
+                                    oldRetainData.add(s);
+                                }
+                            }
+                            if (CollectionUtil.isNotEmpty(oldRetainData)) {
+                                f.setValue(f.getValue() + "☆" + StringUtils.join(oldRetainData, "☆"));
+                            }
+                        }
+                        if (StringUtils.isNotEmpty(sb.toString())) {
+                            sb.append(",");
+                        }
+                        sb.append(f.getKey()).append("=").append("'").append(f.getValue()).append("'");
+                    });
+                    sql = sql + sb + "where id = " + initId.get("id");
+                } else {
+                    Set<String> strings = stringStringMap.keySet();
+                    Collection<String> values = stringStringMap.values();
+                    //转换成sql能够使用的字符串
+                    ArrayList<String> strings1 = new ArrayList<>();
+                    values.forEach(f -> {
+                        f = "'" + f + "'";
+                        strings1.add(f);
+                    });
+                    long newPkId = SnowFlakeUtil.getId();
+                    sql = "insert into " + byId.getInitTableName() + " (id,p_key_id," + StringUtils.join(strings, ",") + ") VALUES (" + newPkId + ", " + wbsTreeContract.getPKeyId() + ", " + StringUtils.join(strings1, ",") + ")";
+                }
+
+
+                jdbcTemplate.execute(sql);
+            }
+
+
+            //删除临时文件信息
+            if (deleteFolder(Paths.get(importExcelTOHtmlPath))) {
+                logger.info("执行方法【importExcel】结束,删除临时文件成功!");
+            } else {
+                logger.info("执行方法【importExcel】结束,删除临时文件失败!");
+            }
+            if (StringUtils.isNotEmpty(url_1)) {
+                //删除临时文件夹
+                if (deleteFolderAndContents(Paths.get(url_1 + "/pdf/" + id + "_files"))) {
+                    logger.info("执行方法【importExcel】结束,删除临时文件夹成功!");
+                } else {
+                    logger.info("执行方法【importExcel】结束,删除临时文件夹失败!");
+                }
+            }
+            return R.success("ok");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (workbook != null) {
+                workbook.dispose();
+            }
+        }
+
+    }
+
     /**
      * 判断日期范围格式数据,以下12种格式
      * 2023-01-01-2023-01-30 或 2023-01-01~2023-01-30

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

@@ -416,8 +416,8 @@ public class WbsTreePrivateController extends BladeController {
             @ApiImplicitParam(name = "parentId", value = "父级id"),
             @ApiImplicitParam(name = "projectId", value = "项目id")
     })
-    public R<List<WbsTreePrivateVO>> lazyTree(String wbsId, String wbsType, Long parentId, String projectId) {
-        List<WbsTreePrivateVO> tree = wbsTreePrivateService.lazyTree(wbsId, wbsType, parentId, projectId);
+    public R<List<WbsTreePrivateVO>> lazyTree(String wbsId, String wbsType, Long parentId, String projectId,Integer type) {
+        List<WbsTreePrivateVO> tree = wbsTreePrivateService.lazyTree(wbsId, wbsType, parentId, projectId,type);
         if (tree != null && tree.size() > 0) {
             return R.data(tree);
         }
@@ -860,8 +860,8 @@ public class WbsTreePrivateController extends BladeController {
     @GetMapping("/getTitleRange")
     @ApiOperationSupport(order = 33)
     @ApiOperation(value = "获取题名范围",notes = "获取题名范围")
-    public R<List<TitleRangeVo>> getTitleRange(@RequestParam String projectId,@RequestParam(required = false) Long nameId){
-        List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId);
+    public R<List<TitleRangeVo>> getTitleRange(@RequestParam String projectId,@RequestParam(required = false) Long nameId,@RequestParam(required = false) Integer wbsType){
+        List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId,wbsType);
         List<WbsParam> list1 = iWbsParamService.getBaseMapper().selectList(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getK, "FILE_TITLE").eq(WbsParam::getProjectId, projectId));
         if(list1.size()>0){
                 //修改
@@ -920,7 +920,7 @@ public class WbsTreePrivateController extends BladeController {
                     iWbsParamService.getBaseMapper().delete(new QueryWrapper<WbsParam>().eq("name_id",dto.getNameId()));
                 }
                 if(dto.getType()==1){
-                    List<WbsTreePrivate>list=wbsTreeService.getTitleRange(dto.getProjectId()+"");
+                    List<WbsTreePrivate>list=wbsTreeService.getTitleRange(dto.getProjectId()+"",null);
                     if(list.size()>0){
                         dto.setNodeId(list.stream()
                             .map(item -> String.valueOf(item.getId()))

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

@@ -497,8 +497,8 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
 
     @Override
-    public List<WbsTreeContract> queryListByPIds(List<Long> pIds) {
-        return wbsTreeContractService.queryListByPIds(pIds);
+    public List<WbsTreeContract> queryListByPIds(List<Long> pIds, Integer classify) {
+        return wbsTreeContractService.queryListByPIds(pIds, classify);
     }
 
     @Override

+ 11 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -1347,19 +1347,25 @@ public class ExecutorMeter extends FormulaExecutor {
                                      if(preSubTotal!=null) {
                                          rebateIncentiveAdvPay.setCurrentPay(subtractFc.apply(dyTotalAmount, preSubTotal.getCurrentPeriodEndPay()));
                                      }
+                                     // 计量支付扣回开工预付款
                                      rebateIncentiveAdvPay.setRetained(rebateIncentiveAdvPay.getCurrentPay());
                                  } else {
                                      rebateIncentiveAdvPay.calc(baseInfo.getContractAmount().toPlainString(), dyTotalAmount,preSubTotal.getCurrentPeriodEndPay());
                                  }
                                  if (preSubTotal != null) {
-                                     // 对两个参数进行四舍五入后再计算
-                                     String currentPayRounded = BaseUtils.str2BigDecimal(rebateIncentiveAdvPay.getCurrentPay()).setScale(0, RoundingMode.HALF_UP).toPlainString();
-                                     String previousPayRounded = BaseUtils.str2BigDecimal(preSubTotal.getCurrentPeriodEndPay()).setScale(0, RoundingMode.HALF_UP).toPlainString();
-                                     rebateIncentiveAdvPay.setEndPay(addFc.apply(currentPayRounded, previousPayRounded));
-                                     rebateIncentiveAdvPay.setRetained(rebateIncentiveAdvPay.getEndPay());
+//                                     // 对两个参数进行四舍五入后再计算
+//                                     String currentPayRounded = BaseUtils.str2BigDecimal(rebateIncentiveAdvPay.getCurrentPay()).setScale(0, RoundingMode.HALF_UP).toPlainString();
+//                                     String previousPayRounded = BaseUtils.str2BigDecimal(preSubTotal.getCurrentPeriodEndPay()).setScale(0, RoundingMode.HALF_UP).toPlainString();
+//                                     String endapply = addFc.apply(currentPayRounded, previousPayRounded);
+//                                    // rebateIncentiveAdvPay.setEndPay("0");
+//                                     rebateIncentiveAdvPay.setEndPay(endapply);
+//                                     //rebateIncentiveAdvPay.setEndPay(rebateIncentiveAdvPay.getEndPay());
                                  } else {
+                                     //累计扣回开工预付款金额
                                      rebateIncentiveAdvPay.setEndPay(rebateIncentiveAdvPay.getCurrentPay());
                                  }
+
+                                 //扣除金额-上期末累计扣回金额
                                  if(preSubTotal!=null){
                                      rebateIncentiveAdvPay.setPreviousPay(preSubTotal.getCurrentPeriodEndPay());
                                  }

+ 5 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -61,7 +61,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
 
     List<ArchiveTreeContractVO2> lazyTree2(@Param("tenantId") String tenantId, @Param("parentId") Long parentId, @Param("projectId") Long projectId
-            , @Param("code") String code, @Param("contractId") String contractId);
+            , @Param("code") String code, @Param("contractId") String contractId, @Param("extType") Integer extType);
 
     /**
      * 归档树不带文件数量
@@ -180,11 +180,14 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
     List<TrialSelfInspectionRecordFileVO> getAllTrialRecordFile(@Param("ids") List<Long> recordIds);
 
-    List<TrialClassificationConfiguration> getAllThreeTestNode();
+    List<TrialClassificationConfiguration> getAllThreeTestNode(@Param("contractId") Long contractId);
 
     List<TrialDetectionData> getAllTrialTestRecord(@Param("contractId") Long contractId);
 
     List<ArchiveTreeContract> getOutNodes(@Param("projectId")Long projectId);
 
     List<ArchiveTreeContract> getOutNodesByOutIds(@Param("projectId")Long projectId,@Param("ids") List<String> outIds);
+
+    Integer selectExtTypeByParentId(@Param("projectId")Long projectId,
+                                    @Param("parentId") Long parentId);
 }

+ 61 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -172,9 +172,9 @@
         <result column="reviewer" property="reviewer"/>
         <result column="specification" property="specification"/>
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
-        <!--        <result column="tree_number" property="treeNumber"/>-->
-        <association property="treeNumber" javaType="java.lang.Integer" select="selectFileNumber"
-                     column="{id=id,projectId=project_id,code=code,contractId=contract_id,extType=ext_type}"/>
+        <result column="tree_number" property="treeNumber"/>
+<!--        <association property="treeNumber" javaType="java.lang.Integer" select="selectFileNumber"-->
+<!--                     column="{id=id,projectId=project_id,code=code,contractId=contract_id,extType=ext_type}"/>-->
     </resultMap>
 
 
@@ -272,11 +272,45 @@
         d.specification,
         d.archive_name_suffix,
         d.contract_id,
-        d.project_id,
-        #{code} as code,
+        IFNULL(SUM(file_counts.count), 0) AS tree_number,
         (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId}) AS "has_children"
         FROM
         m_archive_tree_contract d
+        LEFT JOIN (
+            -- 合并两个统计查询
+            SELECT
+                a.id,
+                a.ancestors,
+                SUM(b.count) AS count
+            FROM
+                m_archive_tree_contract a
+            INNER JOIN (
+                SELECT node_id AS id, COUNT(*) AS count
+                FROM u_archive_file
+                WHERE project_id = #{projectId}
+                AND is_deleted = 0
+                AND (is_auto_file IS NULL OR is_auto_file != 1)
+                GROUP BY node_id
+                <if test="extType > 0">
+                    UNION ALL
+
+                    SELECT node_ext_id AS id, COUNT(*) AS count
+                    FROM u_archive_file
+                    WHERE project_id = #{projectId}
+                    AND is_deleted = 0
+                    AND (is_auto_file IS NULL OR is_auto_file != 1)
+                    GROUP BY node_ext_id
+                </if>
+            ) b ON b.id = a.id
+            WHERE
+                a.is_deleted = 0
+                <if test="code!=null and code!=''">
+                    AND (a.tree_code = #{code} or a.tree_code = #{contractId} or a.parent_id = 0)
+                </if>
+            GROUP BY
+                a.id
+        ) file_counts ON file_counts.id = d.id
+        OR file_counts.ancestors like concat(d.ancestors,',',d.id,'%')
         WHERE
         d.parent_id = #{parentId} AND d.is_deleted = 0 and project_id = #{projectId}
         <if test="tenantId!=null and tenantId!=''">
@@ -285,6 +319,8 @@
         <if test="code!=null and code!=''">
             AND (d.tree_code = #{code} or d.tree_code = #{contractId} or d.parent_id = 0)
         </if>
+        GROUP BY
+        d.id
         ORDER BY d.tree_sort, d.sort
     </select>
     <!-- 归档数不带文件数量 -->
@@ -932,7 +968,7 @@
         select * from blade_dict_biz where parent_id != 0 and code = 'contract_log_type' and is_deleted = 0
     </select>
     <select id="getAllTrialNode" resultType="org.springblade.manager.vo.ArchiveSyncTrialVO">
-        select p_key_id,id,parent_id,node_name,full_name,node_type,sort
+        select p_key_id,id,parent_id,node_name,full_name,node_type,sort,p_id
         from m_wbs_tree_private
         where wbs_type = 2 and project_id = #{projectId} and `type` = 1 and is_deleted = 0
           and node_type in (51,52,53)
@@ -941,7 +977,7 @@
     <select id="getAllTrialRecord" resultType="org.springblade.business.entity.TrialSelfInspectionRecord">
         select *
         from u_trial_self_inspection_record
-        where contract_id = #{contractId} and is_deleted = 0 and task_status = '已审批'
+        where contract_id = #{contractId} and is_deleted = 0 and task_status = '已审批' order by sort
     </select>
     <select id="getAllTrialRecordFile"
             resultType="org.springblade.business.vo.TrialSelfInspectionRecordFileVO">
@@ -955,12 +991,21 @@
     </select>
     <select id="getAllThreeTestNode"
             resultType="org.springblade.manager.entity.TrialClassificationConfiguration">
-        select *
-        from m_trial_classification_configuration
-        where is_deleted = 0 and parent_id in
-            (
-                select id from m_trial_classification_configuration where is_deleted = 0 and parent_id = 0 and node_type in (1,2)
-                )
+        SELECT
+            *
+        FROM
+            m_trial_classification_configuration b
+        WHERE
+            is_deleted = 0
+          AND STATUS = 1
+            <if test="contractId == null">
+                and contract_id is null
+            </if>
+            <if test="contractId != null and contractId != ''">
+                and (contract_id is null OR (contract_id = #{contractId}))
+            </if>
+        ORDER BY
+            sort
     </select>
     <select id="getAllTrialTestRecord" resultType="org.springblade.business.entity.TrialDetectionData">
         select *
@@ -980,4 +1025,7 @@
             #{id}
         </foreach>
     </select>
+    <select id="selectExtTypeByParentId" resultType="java.lang.Integer">
+        select count(0) from m_archive_tree_contract where project_id = #{projectId} and ext_type = 2 and is_deleted = 0 and FIND_IN_SET(#{parentId},ancestors)
+    </select>
 </mapper>

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java

@@ -100,5 +100,6 @@ public interface WbsTreeMapper extends EasyBaseMapper<WbsTree> {
 
     int isThereAField(@Param("initTableName") String initTableName, @Param("keyId") String keyId);
 
-    List<WbsTreePrivate> getTitleRange(@Param("projectId")Long projectId);
+    List<WbsTreePrivate> getTitleRange(@Param("projectId")Long projectId,
+                                       @Param("wbsType")Integer wbsType);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -568,6 +568,9 @@
     <select id="getTitleRange" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT id,node_name,status From m_wbs_tree_private where project_id = #{projectId} and node_type=1 and is_deleted=0 and type=1
         and parent_id !=0
+        <if test="wbsType != null">
+            and wbs_type = #{wbsType}
+        </if>
     </select>
 
 </mapper>

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

@@ -39,7 +39,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     void updateDeletedByCondition(String id, String wbsId, String projectId);
 
-    List<WbsTreePrivateVO> lazyTree(String wbsId, Integer wbsType, Long parentId, String projectId);
+    List<WbsTreePrivateVO> lazyTree(String wbsId, Integer wbsType, Long parentId, String projectId,Integer type);
 
     List<TreeNodeVOByTabType> tabTypeLazyTree(IPage page, Long parentId, String projectId, String titleName);
 
@@ -127,7 +127,8 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     void batchUpdateIsAddConceal(@Param("private") WbsTreePrivate wbsTreePrivate,@Param("pId") Long pId);
 
-    List<ArchiveSyncLogVO> getContractAllLog(@Param("contractId") Long contractId);
+    List<ArchiveSyncLogVO> getContractAllLog(@Param("contractId") Long contractId,
+                                             @Param("wbsNodeId") Long wbsNodeId);
 
     int cancelLinkNodeTreeInfoByJL(@Param("pkeyId")String pkeyId);
 
@@ -152,4 +153,6 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     void updateSortBatchByPKeyId(List<WbsTreePrivate> resourceData);
 
     List<ArchiveSyncLogVO> getContractAllLogMonthPack(@Param("contractId") Long contractId);
+
+    List<Long> getContractAllLogWbsNodeIds(@Param("contractId") Long contractId);
 }

+ 19 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -377,12 +377,19 @@
                 m_wbs_tree_private
                 WHERE
                 parent_id = d.id and is_deleted = 0 and type != 2
-            ) AS "has_children"
+            ) AS "has_children",
+            d.update_time AS "updateTime",
+            d.update_user AS "updateUser",
+            d.unique_code AS "uniqueCode",
+            d.partition_code AS "partitionCode",
+            (select name from blade_user where id = d.update_user) AS "updateUserName"
         FROM
             m_wbs_tree_private d
         WHERE
             d.is_deleted = 0
-        AND (d.is_buss_show != 1 OR d.is_buss_show IS NULL)
+        <if test="type ==1">
+          AND  (d.is_add_conceal != 1 OR d.is_add_conceal IS NULL)
+        </if>
         AND d.parent_id = #{parentId}
         AND d.project_id = #{projectId}
             <if test="wbsType != null and wbsType != '' and wbsType != -1">
@@ -515,6 +522,7 @@
                wt.sort,
                wt.status,
                wt.node_type                                                                         AS nodeType,
+               wt.wbs_type                                                                          AS wbsType,
                wt.fill_rate                                                                         AS "fillRate",
                wt.html_url                                                                          AS htmlUrl,
                (SELECT count(1)
@@ -977,6 +985,9 @@
             contract_id = #{contractId}
           AND ucl.is_deleted = 0
           AND pdf_url IS NOT NULL
+          <if test="wbsNodeId != null">
+              AND wbs_node_id = #{wbsNodeId}
+          </if>
         ORDER BY
             record_time
     </select>
@@ -1039,6 +1050,8 @@
             pdf_url e_visa_pdf_url,
             create_user,
             create_time,
+            wbs_node_id,
+            page,
             ( SELECT node_type FROM m_wbs_tree_private WHERE p_key_id = ucl.wbs_node_id ) AS logType,
             ( SELECT node_name FROM m_wbs_tree_private WHERE p_key_id = ucl.wbs_node_id ) AS logName
         FROM
@@ -1049,4 +1062,8 @@
         ORDER BY
             record_time;
     </select>
+    <select id="getContractAllLogWbsNodeIds" resultType="java.lang.Long">
+        select DISTINCT wbs_node_id from u_contract_log  WHERE
+            contract_id = #{contractId}
+    </select>
 </mapper>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java

@@ -5,6 +5,8 @@ import org.springblade.manager.dto.FormulaOptionVo;
 import org.springblade.manager.dto.RangeInfo;
 import org.springblade.manager.entity.FormulaOption;
 
+import java.util.List;
+
 /**
  * @author yangyj
  */

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

@@ -98,10 +98,10 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     Integer findIsExistTreeNode(List<String> ids);
 
-    List<WbsTreeContract> queryListByPIds(List<Long> pIds);
 
     List<APIWbsContractSubdivisionVo> getWbsContractSubdivision(String contractId);
 
+    List<WbsTreeContract> queryListByPIds(List<Long> pIds, Integer classify);
     ResponseEntity<Resource> exportTree(Long contractId, HttpServletResponse response) throws IOException, InvalidFormatException;
 
     R importPartitionCode(MultipartFile file);

+ 4 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -26,7 +26,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean removeTableByCondition(String id, String wbsId, String projectId);
 
-    List<WbsTreePrivateVO> lazyTree(String wbsId, String wbsType, Long parentId, String projectId);
+    List<WbsTreePrivateVO> lazyTree(String wbsId, String wbsType, Long parentId, String projectId,Integer type);
 
     // 项目级 表单类型划分
     IPage<TreeNodeVOByTabType> tabTypeLazyTree(IPage<TreeNodeVOByTabType> page, Long parentId, String projectId, String titleName);
@@ -106,11 +106,13 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     //获取数据回显
     List<Long> linkNodeTreeBynodeId(String pkeyId);
 
-    List<ArchiveSyncLogVO> getContractAllLog(Long contractId);
+    List<ArchiveSyncLogVO> getContractAllLog(Long contractId, Long wbsNodeId);
 
     void diGuiWbs(int i);
 
     WbsTreePrivateVO tree3(String wbsId, String projectId);
 
     List<ArchiveSyncLogVO> getContractAllLogMonthPack(Long contractId);
+
+    List<Long> getContractAllLogWbsNodeIds(Long contractId);
 }

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

@@ -78,7 +78,7 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     Object getQueryValueByType(String queryValue, String wbsId, String projectId, String type);
 
-    List<WbsTreePrivate> getTitleRange(String projectId);
+    List<WbsTreePrivate> getTitleRange(String projectId,Integer wbsType);
 
     Object getQueryValueByNodeType(String wbsId, String projectId, String queryValue, Integer nodeType, Integer majorDataType);
 }

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -196,7 +196,10 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			tenantId = StringPool.EMPTY;
 		}
 		if(type != null && type == 1){
-			return ForestNodeMergerEx.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+			//当前节点子节点是否存在ext_type = 2 的数据
+			Integer extType = baseMapper.selectExtTypeByParentId(projectId,parentId);
+
+			return ForestNodeMergerEx.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId), extType));
 		}
 		return ForestNodeMergerEx.merge(baseMapper.lazyTree3(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}

+ 169 - 71
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -1,21 +1,19 @@
 package org.springblade.manager.service.impl;
 
+import cn.hutool.core.lang.mutable.MutableInt;
 import com.alibaba.nacos.common.utils.DateFormatUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.dto.ImageClassificationFileDTO;
-import org.springblade.business.entity.ArchiveFile;
-import org.springblade.business.entity.InformationQuery;
-import org.springblade.business.entity.TrialDetectionData;
-import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.entity.*;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.ImageClassificationFileClient;
 import org.springblade.business.feign.InformationQueryClient;
-import org.springblade.business.vo.TreeVoTwo;
 import org.springblade.business.vo.TrialSelfInspectionRecordFileVO;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.ForestNodeMergerEx;
@@ -24,6 +22,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.AssociationTypeEnum;
 import org.springblade.manager.enums.StorageTypeEnum;
@@ -42,6 +41,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -1035,6 +1035,17 @@ public class ArchiveTreeContractSyncImpl {
         Map<Long, List<TrialSelfInspectionRecord>> recordsMap = records.stream().collect(Collectors.groupingBy(TrialSelfInspectionRecord::getNodeId));
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
+        //试验节点id 添加到档案的节点id映射关系 用与父节点创建
+        HashMap<Long, Long> map = new HashMap<>();
+        for (ArchiveSyncTrialVO trial : trials) {
+            map.put(trial.getPKeyId(),SnowFlakeUtil.getId());
+        }
+
+        //获取文档文件最大 sort
+        Integer sort = archiveFileClient.selectMaxSortByContractId(contractInfo.getId());
+        MutableInt mutableInt = new MutableInt();
+        mutableInt.set(sort);
+
         /**循环指定试验类型 */
         for (Integer type : TrialType) {
             //根据类型获取试验节点
@@ -1045,7 +1056,7 @@ public class ArchiveTreeContractSyncImpl {
             //循环试验节点
             for (ArchiveSyncTrialVO vo : trialVOS) {
                 //把节点转换为档案节点,挂载到同步节点下
-                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), vo.getSort(), vo.getPKeyId(), vo.getPId(), archiveTreeContract, map);
                 addNode.add(trialNode);
                 //获取出节点下面的报告,并转换为档案文件
                 List<TrialSelfInspectionRecord> files = recordsMap.get(vo.getPKeyId());
@@ -1054,7 +1065,7 @@ public class ArchiveTreeContractSyncImpl {
                 }
                 //挂载到子节点下
                 List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                    ArchiveFile archiveFile = trialFileCovertArchiveFile(file, trialNode);
+                    ArchiveFile archiveFile = trialFileCovertArchiveFile(file, trialNode, contractInfo, mutableInt);
                     return archiveFile;
                 }).collect(Collectors.toList());
                 addFile.addAll(newArchiveFileList);
@@ -1064,15 +1075,22 @@ public class ArchiveTreeContractSyncImpl {
         /**单独处理外委和第三方报告 */
         if (contractTrialType.contains("98")){
             //获取所有的外委和第三方节点
-            List<TrialClassificationConfiguration> threeTestNodes = archiveTreeContractMapper.getAllThreeTestNode();
+            List<TrialClassificationConfiguration> threeTestNodes = archiveTreeContractMapper.getAllThreeTestNode(contractId);
             //获取出合同段所有的检测报告
             List<TrialDetectionData> dataList = archiveTreeContractMapper.getAllTrialTestRecord(contractId);
             //检测报告,按照节点分组
             Map<Long, List<TrialDetectionData>> dataMap = dataList.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+
+            //试验节点id 添加到档案的节点id映射关系 用与父节点创建
+            HashMap<Long, Long> map2 = new HashMap<>();
+            for (TrialClassificationConfiguration configuration : threeTestNodes) {
+                map2.put(configuration.getId(),SnowFlakeUtil.getId());
+            }
+
             //循环所有节点
             for (TrialClassificationConfiguration vo : threeTestNodes) {
                 //把节点转换为档案节点,挂载到同步节点下
-                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), vo.getNodeType() == 1 ? vo.getSort() : vo.getSort() + 100, vo.getId(), vo.getParentId(), archiveTreeContract, map2);
                 addNode.add(trialNode);
                 //获取出节点下面的报告,并转换为档案文件
                 List<TrialDetectionData> files = dataMap.get(vo.getId());
@@ -1081,57 +1099,57 @@ public class ArchiveTreeContractSyncImpl {
                 }
                 //挂载到子节点下
                 List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                    ArchiveFile archiveFile = trialTestFileCovertArchiveFile(file, trialNode);
+                    ArchiveFile archiveFile = trialTestFileCovertArchiveFile(file, trialNode, mutableInt);
                     return archiveFile;
                 }).collect(Collectors.toList());
                 addFile.addAll(newArchiveFileList);
             }
         }
-
+        //暂时先不做
         /**单独处理原材料资质证书 */
-        if (contractTrialType.contains("99")){
-            //获取所有的原材节点
-            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(52);
-            if (CollectionUtil.isNotEmpty(trialVOS)){
-                //查询出整个系统的附件,设计问题
-                Map<String, Attach> maps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Attach -> Attach, (obj1, obj2) -> obj1));
-                //获取出所有节点id
-                List<Long> nodeIds = trialVOS.stream().map(l -> l.getPKeyId()).collect(Collectors.toList());
-                //根据节点id,查询出所有的报告id
-                List<Long> recordIds = records.stream().filter(l -> nodeIds.contains(l.getNodeId())).map(l -> l.getId()).collect(Collectors.toList());
-                //根据报告id,查询出所有的报告附件
-                List<TrialSelfInspectionRecordFileVO> fileVOS = archiveTreeContractMapper.getAllTrialRecordFile(recordIds);
-                //报告附件按照节点id分组
-                Map<Long, List<TrialSelfInspectionRecordFileVO>> fileMap = fileVOS.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
-                //循环原材节点
-                for (ArchiveSyncTrialVO vo : trialVOS) {
-                    //把节点转换为档案节点,挂载到同步节点下
-                    ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
-                    addNode.add(trialNode);
-                    //获取出节点下面的报告下面的附件,并转换为档案文件
-                    List<TrialSelfInspectionRecordFileVO> files = fileMap.get(vo.getPKeyId());
-                    if (CollectionUtil.isEmpty(files)){
-                        continue;
-                    }
-                    //上个开发太懒,敷衍了事,重新设置附件相关值
-                    for (TrialSelfInspectionRecordFileVO file : files) {
-                        Attach attach = maps.get(file.getUrl());
-                        if (attach != null){
-                            file.setFileName(attach.getOriginalName());
-                            file.setCreateTime(attach.getCreateTime());
-                        }
-                    }
-                    //挂载到子节点下
-                    List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                        ArchiveFile archiveFile = trialFileCovertArchiveFile2(file, trialNode);
-                        return archiveFile;
-                    }).collect(Collectors.toList());
-                    addFile.addAll(newArchiveFileList);
-                }
-
-            }
-
-        }
+//        if (contractTrialType.contains("99")){
+//            //获取所有的原材节点
+//            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(52);
+//            if (CollectionUtil.isNotEmpty(trialVOS)){
+//                //查询出整个系统的附件,设计问题
+//                Map<String, Attach> maps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Attach -> Attach, (obj1, obj2) -> obj1));
+//                //获取出所有节点id
+//                List<Long> nodeIds = trialVOS.stream().map(l -> l.getPKeyId()).collect(Collectors.toList());
+//                //根据节点id,查询出所有的报告id
+//                List<Long> recordIds = records.stream().filter(l -> nodeIds.contains(l.getNodeId())).map(l -> l.getId()).collect(Collectors.toList());
+//                //根据报告id,查询出所有的报告附件
+//                List<TrialSelfInspectionRecordFileVO> fileVOS = archiveTreeContractMapper.getAllTrialRecordFile(recordIds);
+//                //报告附件按照节点id分组
+//                Map<Long, List<TrialSelfInspectionRecordFileVO>> fileMap = fileVOS.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+//                //循环原材节点
+//                for (ArchiveSyncTrialVO vo : trialVOS) {
+//                    //把节点转换为档案节点,挂载到同步节点下
+//                    ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+//                    addNode.add(trialNode);
+//                    //获取出节点下面的报告下面的附件,并转换为档案文件
+//                    List<TrialSelfInspectionRecordFileVO> files = fileMap.get(vo.getPKeyId());
+//                    if (CollectionUtil.isEmpty(files)){
+//                        continue;
+//                    }
+//                    //上个开发太懒,敷衍了事,重新设置附件相关值
+//                    for (TrialSelfInspectionRecordFileVO file : files) {
+//                        Attach attach = maps.get(file.getUrl());
+//                        if (attach != null){
+//                            file.setFileName(attach.getOriginalName());
+//                            file.setCreateTime(attach.getCreateTime());
+//                        }
+//                    }
+//                    //挂载到子节点下
+//                    List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
+//                        ArchiveFile archiveFile = trialFileCovertArchiveFile2(file, trialNode);
+//                        return archiveFile;
+//                    }).collect(Collectors.toList());
+//                    addFile.addAll(newArchiveFileList);
+//                }
+//
+//            }
+//
+//        }
         if (addNode.size() > 0){
             addNode.stream().forEach(l->l.setTenantId(tenantId));
             archiveTreeContractMapper.batchInsertArchiveTreeContract(addNode);
@@ -1169,14 +1187,41 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
         //获取合同段所有的日志,并且附带类型
+        //先查询所有当前合同段下所有日志数据的父级节点
+        List<Long> wbsNodeIds =  wbsTreePrivateService.getContractAllLogWbsNodeIds(contractId);
+        if(CollectionUtil.isEmpty(wbsNodeIds)){
+            throw new ServiceException("当前合同段下没有日志资料");
+        }
         List<ArchiveSyncLogVO> logs = wbsTreePrivateService.getContractAllLogMonthPack(contractId);
         //先查按月封装 没有再查日志
         if(CollectionUtil.isEmpty(logs)){
-            logs = wbsTreePrivateService.getContractAllLog(contractId);
+            logs = wbsTreePrivateService.getContractAllLog(contractId, null);
+        } else {
+            Map<Long, List<ArchiveSyncLogVO>> collect = logs.stream().collect(Collectors.groupingBy(ArchiveSyncLogVO::getWbsNodeId));
+            for (Long f : wbsNodeIds) {
+                List<ArchiveSyncLogVO> list = collect.get(f);
+                if(CollectionUtil.isEmpty(list)){
+                    List<ArchiveSyncLogVO> contractAllLog = wbsTreePrivateService.getContractAllLog(contractId, f);
+                    //生成页数
+                    contractAllLog.forEach(x -> {
+                        InputStream inputStream = CommonUtil.getOSSInputStream(x.getPdfUrl());
+                        try (PDDocument document = PDDocument.load(inputStream)) {
+                            int numberOfPages = document.getNumberOfPages();
+                            x.setPage(numberOfPages);
+                        } catch (IOException e) {
+                            System.err.println("文件读取错误: " + e.getMessage());
+                        }
+                    });
+                    if(CollectionUtil.isNotEmpty(contractAllLog)){
+                        logs.addAll(contractAllLog);
+                    }
+                }
+            }
         }
         if (CollectionUtil.isEmpty(logs)){
             throw new ServiceException("当前合同段下没有日志资料");
         }
+        HashMap<Long, Long> map = new HashMap<>();
         //日志按照类型分组
         Map<Integer, List<ArchiveSyncLogVO>> logMap = logs.stream().collect(Collectors.groupingBy(ArchiveSyncLogVO::getLogType));
         //循环选择的日志类型
@@ -1186,7 +1231,7 @@ public class ArchiveTreeContractSyncImpl {
                 throw new ServiceException("日志存在字典中未配置的类型,请检查后再同步");
             }
             //生成子节点
-            ArchiveTreeContract logNode = createTypeNode(typeName, archiveTreeContract);
+            ArchiveTreeContract logNode = createTypeNode(typeName, 0, null, null, archiveTreeContract, map);
             /** 如果到时候修改需求,只显示有日志的,则下面文件存在再add*/
             addNode.add(logNode);
             //然后再从分组中获取,如果存在值则转换为档案文件
@@ -1265,10 +1310,11 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
+        HashMap<Long, Long> map = new HashMap<>();
         //循环下级节点
         for (ImageClassificationConfig imageType : imageTypes) {
             //把分类生成为影像资料的下级节点
-            ArchiveTreeContract imageNode = createTypeNode(imageType.getClassfName(),archiveTreeContract);
+            ArchiveTreeContract imageNode = createTypeNode(imageType.getClassfName(), 0, null, null, archiveTreeContract, map);
             addNode.add(imageNode);
             //如果当前分类下存在文件,则根据类型生成树,还是日期
 //            List<ImageClassificationFileDTO> files = imageMap.get(imageType.getId());
@@ -1375,7 +1421,27 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setFileUrl(file.getImagesPdf());
         archiveFile.setPdfFileUrl(file.getImagesPdf());
         //文件页数  根据关联照片判断
-        long count = albumImagesService.count(Wrappers.<AlbumImages>lambdaQuery().eq(AlbumImages::getAlbumId, file.getId()));
+        List<AlbumImages> list = albumImagesService.list(Wrappers.<AlbumImages>lambdaQuery().eq(AlbumImages::getAlbumId, file.getId()));
+        int count = 0;
+        if(CollectionUtil.isNotEmpty(list)){
+            List<Long> imageIds = list.stream().map(AlbumImages::getImageId).collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(imageIds)){
+                //可能存在一条关联记录 多张照片
+                List<ImageClassificationFile> imageClassificationFileByIds = imageClassificationFileClient.getImageClassificationFileByIds(imageIds);
+                if(CollectionUtil.isNotEmpty(imageClassificationFileByIds)){
+                    for (ImageClassificationFile f : imageClassificationFileByIds) {
+                        if(StringUtils.isNotBlank(f.getImageUrl())){
+                            if(f.getImageUrl().contains(",")){
+                                List<String> collect = Arrays.stream(f.getImageUrl().split(",")).filter(StringUtil::isNotBlank).collect(Collectors.toList());
+                                count += collect.size();
+                            }else{
+                                count++;
+                            }
+                        }
+                    }
+                }
+            }
+        }
         //2张照片为一页
         archiveFile.setFilePage((int) Math.ceil((double) count / 2));
         archiveFile.setIsApproval(0);
@@ -1521,7 +1587,7 @@ public class ArchiveTreeContractSyncImpl {
     /**
      * 质检试验检测资料 转换为 档案文件
      */
-    private ArchiveFile trialTestFileCovertArchiveFile(TrialDetectionData vo,ArchiveTreeContract parentNode)
+    private ArchiveFile trialTestFileCovertArchiveFile(TrialDetectionData vo,ArchiveTreeContract parentNode, MutableInt sort)
     {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setId(SnowFlakeUtil.getId());
@@ -1529,7 +1595,20 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
         archiveFile.setNodeId(parentNode.getId()+"");
         archiveFile.setFileNumber(vo.getReportNo());
-        archiveFile.setFileName(vo.getMaterialName()+vo.getSpecificationModel());
+        //报告编号+规格型号+试验名称+试验检测报告及附件
+        StringBuffer fileName = new StringBuffer();
+        if(StringUtils.isNotBlank(vo.getReportNo())){
+            fileName.append(vo.getReportNo());
+        }
+        if(StringUtils.isNotBlank(vo.getSpecificationModel())){
+            fileName.append(vo.getSpecificationModel());
+        }
+        if(StringUtils.isNotBlank(vo.getMaterialName())){
+            fileName.append(vo.getMaterialName());
+        }
+        fileName.append("试验检测报告及附件");
+
+        archiveFile.setFileName(fileName.toString());
         if (vo.getReportDate() != null) {
             archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
         }
@@ -1539,7 +1618,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
-        archiveFile.setDutyUser(vo.getUserName());
+        //责任人 - 委托单位名称
+        archiveFile.setDutyUser(vo.getEntrustCompany());
         archiveFile.setCreateUser(vo.getCreateUser());
         archiveFile.setStatus(0);
         archiveFile.setIsDeleted(0);
@@ -1550,7 +1630,8 @@ public class ArchiveTreeContractSyncImpl {
                 .toLocalDateTime();
         archiveFile.setFtime(localDateTime);
         archiveFile.setUtime(localDateTime);
-        archiveFile.setSort(0);
+        sort.set(sort.get() + 1);
+        archiveFile.setSort(sort.get());
         archiveFile.setPageNum("1");
         archiveFile.setSourceType(1);
         archiveFile.setIsElement(0);
@@ -1562,7 +1643,7 @@ public class ArchiveTreeContractSyncImpl {
     /**
      * 质检试验资料 转换为 档案文件
      */
-    private ArchiveFile trialFileCovertArchiveFile(TrialSelfInspectionRecord vo,ArchiveTreeContract parentNode)
+    private ArchiveFile trialFileCovertArchiveFile(TrialSelfInspectionRecord vo,ArchiveTreeContract parentNode, ContractInfo contractInfo, MutableInt sort )
     {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setId(SnowFlakeUtil.getId());
@@ -1570,7 +1651,21 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
         archiveFile.setNodeId(parentNode.getId()+"");
         archiveFile.setFileNumber(vo.getReportNo());
-        archiveFile.setFileName(StringUtils.isNotBlank(vo.getSpecificationModel())?vo.getSpecificationModel():vo.getTrialProjectName());
+        //报告编号+规格型号+试验名称+试验检测报告及附件
+        StringBuffer fileName = new StringBuffer();
+        if(StringUtils.isNotBlank(vo.getReportNo())){
+            fileName.append(vo.getReportNo());
+        }
+        if(StringUtils.isNotBlank(vo.getSpecificationModel())){
+            fileName.append(vo.getSpecificationModel());
+        }
+        if(StringUtils.isNotBlank(vo.getTrialProjectName())){
+            fileName.append(vo.getTrialProjectName());
+        }
+        fileName.append("试验检测报告及附件");
+
+
+        archiveFile.setFileName(fileName.toString());
         if (vo.getReportDate() != null) {
             archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
         }
@@ -1580,7 +1675,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
-        archiveFile.setDutyUser(vo.getTrialUserName());
+        //当前合同段单位名称 施工单位 / 监理单位
+        archiveFile.setDutyUser(contractInfo.getContractType() == 1 ? contractInfo.getConstructionUnitName() : contractInfo.getSupervisionUnitName());
         archiveFile.setCreateUser(vo.getCreateUser());
         archiveFile.setStatus(0);
         archiveFile.setIsDeleted(0);
@@ -1591,7 +1687,8 @@ public class ArchiveTreeContractSyncImpl {
                 .toLocalDateTime();
         archiveFile.setFtime(localDateTime);
         archiveFile.setUtime(localDateTime);
-        archiveFile.setSort(0);
+        sort.set(sort.get() + 1);
+        archiveFile.setSort(sort.get());
         archiveFile.setPageNum("1");
         archiveFile.setSourceType(1);
         archiveFile.setIsElement(0);
@@ -1613,8 +1710,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setFileName(vo.getFileName());
         archiveFile.setFileTime(vo.getRecordTime());
         archiveFile.setFileUrl(vo.getPdfUrl());
-        archiveFile.setPdfFileUrl(vo.getEVisaPdfUrl());
-        archiveFile.setFilePage(1);
+        archiveFile.setPdfFileUrl(StringUtil.isNotBlank(vo.getEVisaPdfUrl()) ? vo.getEVisaPdfUrl() : vo.getPdfUrl());
+        archiveFile.setFilePage(vo.getPage() == null ? 0 : vo.getPage());
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
@@ -1683,18 +1780,19 @@ public class ArchiveTreeContractSyncImpl {
      * 档案同步质检影像资料时,为影像资料-日志资料   节点下级创建分类节点
      * 传入分类名称
      */
-    public ArchiveTreeContract createTypeNode(String nodeName,ArchiveTreeContract archiveTreeContract){
+    public ArchiveTreeContract createTypeNode(String nodeName, Integer sort,Long pKeyId, Long pId,ArchiveTreeContract archiveTreeContract, HashMap<Long, Long> map){
         ArchiveTreeContract archiveTreeContractTemp = new ArchiveTreeContract();
         //设置基本信息
-        archiveTreeContractTemp.setId(SnowFlakeUtil.getId());
+        archiveTreeContractTemp.setId(map.get(pKeyId) == null ? SnowFlakeUtil.getId() : map.get(pKeyId));
         archiveTreeContractTemp.setTenantId(AuthUtil.getTenantId());
         archiveTreeContractTemp.setProjectId(archiveTreeContract.getProjectId());
         archiveTreeContractTemp.setContractId(archiveTreeContract.getContractId());
-        archiveTreeContractTemp.setParentId(archiveTreeContract.getId());
+        archiveTreeContractTemp.setParentId(pId == null || map == null || map.get(pId) == null ? archiveTreeContract.getId() : map.get(pId));
         archiveTreeContractTemp.setAncestors(archiveTreeContract.getAncestors()+","+archiveTreeContract.getId());
         archiveTreeContractTemp.setNodeName(nodeName);
         archiveTreeContractTemp.setNodeType(1);
         archiveTreeContractTemp.setFullName(nodeName);
+        archiveTreeContractTemp.setSort(sort);
         archiveTreeContractTemp.setStatus(1);
         archiveTreeContractTemp.setIsDeleted(0);
         //设置关联

+ 37 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -371,7 +371,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 /*用来保存日志执行情况*/
                 FormulaLog log = new FormulaLog();
                 /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
-                List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify());
+                List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify(), tableInfoList.get(0).getTestGroupId());
                 if (tableAll.size() > tableInfoList.size()) {
                     TableInfo example = tableInfoList.get(0);
 
@@ -479,7 +479,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             JSONObject tableInfo = dataArray.getJSONObject(0);
             Long nodeId = tableInfo.getLong("nodeId");
             List<TableInfo> tableInfoList = this.getTableInfoList(dataArray);
-            List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify());
+            List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify(), null);
             String tableNames = tableAll.stream().map(NodeTable::getInitTableName).distinct().collect(Collectors.joining("','"));
             /*当前工序包含的所有元素信息,还未包含数据*/
             List<FormData> processFds = this.formulaService.createFormDataByTableName(tableNames);
@@ -541,7 +541,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
     }
 
-    private List<NodeTable> createNodeTables(Long nodeId, String contractId, String projectId, ExecuteType type ,String tableOwner) {
+    private List<NodeTable> createNodeTables(Long nodeId, String contractId, String projectId, ExecuteType type ,String tableOwner, String recordId) {
         List<NodeTable> tableAll = new ArrayList<>();
         if (type.equals(ExecuteType.INSPECTION)) {
             List<AppWbsTreeContractVO> treeNode = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), tableOwner, contractId, projectId, null);
@@ -551,6 +551,19 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             List<WbsTreePrivateVO4> wbsTreePrivateVO = wbsTreePrivateService.searchNodeAllTable(nodeId.toString(), "1", "10", contractId, projectId, null, null);
             wbsTreePrivateVO4s.addAll(wbsTreePrivateVO);
             tableAll = BeanUtil.copyProperties(wbsTreePrivateVO4s, NodeTable.class);
+            if(recordId != null){
+                tableAll = tableAll.stream().filter(e -> e.getIsBussShow() == 1).collect(Collectors.toList());
+                List<NodeTable> nodeTables = new ArrayList<>();
+                //处理试验 过滤掉隐藏表单
+                tableAll.forEach(e -> {
+                    String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + recordId + " and tab_id = " + e.getPKeyId();
+                    TrialSelfDataRecord query = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+                    if(query != null && query.getIsBussShow() == 1){
+                        nodeTables.add(e);
+                    }
+                });
+                tableAll = nodeTables;
+            }
         }
         return tableAll;
     }
@@ -3025,10 +3038,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
             //匹配
             Elements bgBH = doc.select("el-input[placeholderxx~=报告编号.*]");
+            if (bgBH == null || bgBH.isEmpty()) {
+                bgBH = doc.select("el-input[placeholderxx~=报告编 号.*]");
+            }
             Elements cbdwBH = doc.select("el-input[placeholderxx~=承包单位.*]");
             Elements jldwBH = doc.select("el-input[placeholderxx~=监理单位.*]");
             Elements jcdwName = doc.select("el-input[placeholderxx~=检测单位名称.*]");
             Elements jlBH = doc.select("el-input[placeholderxx~=记录编号.*]");
+            if (jlBH == null || jlBH.isEmpty()) {
+                jlBH = doc.select("el-input[placeholderxx~=记录编 号.*]");
+            }
             Elements gcName = doc.select("el-input[placeholderxx~=工程名称.*]");
             Elements sgName = doc.select("el-input[placeholderxx~=施工单位.*]");
             Elements wtName = doc.select("el-input[placeholderxx~=委托单位.*]");
@@ -3127,6 +3146,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     //报告编号
                     if (bgBH.size() >= 1) {
                         for (Element element : bgBH) {
+                            if (ObjectUtils.isEmpty(record.getReportNo()) && ObjectUtils.isNotEmpty(reData.get(element.attr("keyname"))) ) {
+                                break;
+                            }
                             reData.put(element.attr("keyname"), ObjectUtils.isNotEmpty(record.getReportNo()) ? record.getReportNo() : "");
                             break;
                         }
@@ -3134,6 +3156,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     //记录编号
                     if (jlBH.size() >= 1) {
                         for (Element element : jlBH) {
+                            if (ObjectUtils.isEmpty(record.getRecordNo()) && ObjectUtils.isNotEmpty(reData.get(element.attr("keyname"))) ) {
+                                break;
+                            }
                             reData.put(element.attr("keyname"), ObjectUtils.isNotEmpty(record.getRecordNo()) ? record.getRecordNo() : "");
                             break;
                         }
@@ -3951,8 +3976,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
             // 获取匹配的laodId
             String load_data_id = "";
-            JSONArray jsonArray = dto.getDataInfo().getJSONArray("orderList");
-            load_data_id = jsonArray.getJSONObject(0).getString("loadDataId");
+            if (dto.getDataInfo() != null) {
+                JSONArray jsonArray = dto.getDataInfo().getJSONArray("orderList");
+                if (jsonArray != null) {
+                    load_data_id = jsonArray.getJSONObject(0).getString("loadDataId");
+                }
+            }
 
             String sql;
             if (query.size() == 0) {
@@ -3982,6 +4011,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String
             projectId, Long id, String tabIds, TrialSelfInspectionRecordDTO dto) throws Exception {
         String file_path = FileUtils.getSysLocalFileUrl();
+        if (StringUtils.isBlank(tabIds)) {
+            return "";
+        }
         //获取有权限的表的信息
         List<WbsTreePrivate> queryList = jdbcTemplate.query("select p_key_id,html_url,table_type,sort,node_name,create_time from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ") order by sort,node_name,create_time", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
         List<String> dataPdfUrls = new ArrayList<>();

+ 35 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.mixsmart.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FormulaOptionVo;
 import org.springblade.manager.dto.RangeInfo;
@@ -20,6 +22,7 @@ import org.springblade.manager.service.IWbsTreeContractService;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
@@ -84,27 +87,40 @@ public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, F
     }
 
     @Override
-    public Object saveOrUpdateOption(FormulaOptionVo fo) {
-        if (fo.saveChecked()) {
-            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, fo.getPkeyId()));
-            WbsTreeContract parent= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, fo.getParentId()).eq(WbsTreeContract::getContractId, fo.getContractId()));
-            FormulaOption formulaOption = this.getById(parent.getPKeyId());
-            JSONObject root;
-            if (formulaOption == null) {
-                formulaOption = fo.toFo();
-                formulaOption.setId(parent.getPKeyId());
-                root = new JSONObject();
-            } else {
-                root = JSON.parseObject(formulaOption.getVal());
+    public Object saveOrUpdateOption(FormulaOptionVo fos) {
+        List<FormulaOptionVo> formulaOptionVos = new ArrayList<>();
+        if(CollectionUtil.isNotEmpty(fos.getKeys())){
+            for (String key : fos.getKeys()) {
+                FormulaOptionVo formulaOptionVo = BeanUtil.copyProperties(fos, FormulaOptionVo.class);
+                formulaOptionVo.setKey(key);
+                formulaOptionVos.add(formulaOptionVo);
             }
-            JSONObject table = (JSONObject) root.computeIfAbsent(wbc.getInitTableName(), (k) -> new JSONObject());
-            JSONObject data = (JSONObject) table.computeIfAbsent(fo.createKey(), (k) -> new JSONObject());
-            data.put(fo.getCode(), fo.getValue());
-            formulaOption.setVal(root.toJSONString());
-            this.saveOrUpdate(formulaOption);
-            return data;
         }
-        return null;
+
+        List<JSONObject> jsonObjects = new ArrayList<>();
+        for (FormulaOptionVo fo : formulaOptionVos) {
+            if (fo.saveChecked()) {
+                WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, fo.getPkeyId()));
+                WbsTreeContract parent= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, fo.getParentId()).eq(WbsTreeContract::getContractId, fo.getContractId()));
+                FormulaOption formulaOption = this.getById(parent.getPKeyId());
+                JSONObject root;
+                if (formulaOption == null) {
+                    formulaOption = fo.toFo();
+                    formulaOption.setId(parent.getPKeyId());
+                    root = new JSONObject();
+                } else {
+                    root = JSON.parseObject(formulaOption.getVal());
+                }
+                JSONObject table = (JSONObject) root.computeIfAbsent(wbc.getInitTableName(), (k) -> new JSONObject());
+                JSONObject data = (JSONObject) table.computeIfAbsent(fo.createKey(), (k) -> new JSONObject());
+                data.put(fo.getCode(), fo.getValue());
+                formulaOption.setVal(root.toJSONString());
+                this.saveOrUpdate(formulaOption);
+                jsonObjects.add(data);
+
+            }
+        }
+        return jsonObjects;
     }
 
     @Override

+ 13 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -418,11 +418,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     g = op.get();
                                 }
                             } else {
-                                /*只有不存在配置的前提下才能尝试自动匹配*/
-                                Optional<ElementBlock> op = elementBlockList.stream().filter(w -> FormulaUtils.similarity(w.getEName(), t.getPoint()) > 0.3).max(Comparator.comparingDouble((ElementBlock b) -> FormulaUtils.similarity(b.getEName(), t.getPoint())));
-                                /*相似匹配*/
-                                if (op.isPresent()) {
-                                    g = op.get();
+                                /*只有不存在配置的前提下才能尝试自动匹配(只有宝北路项目执行这个)*/
+                                if (tec.getCurrentNode() != null && tec.getCurrentNode().getProjectId() == 1630011899725201410L) {
+                                    Optional<ElementBlock> op = elementBlockList.stream().filter(w -> FormulaUtils.similarity(w.getEName(), t.getPoint()) > 0.3).max(Comparator.comparingDouble((ElementBlock b) -> FormulaUtils.similarity(b.getEName(), t.getPoint())));
+                                    /*相似匹配*/
+                                    if (op.isPresent()) {
+                                        g = op.get();
+                                    }
                                 }
                             }
                             if (g != null) {
@@ -525,6 +527,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                             }
                                         }
                                     }
+                                    //数据去重 只有全部数据都不为数字才执行
+                                    long count = values.stream().filter(StringUtils::isNumber).count();
+                                    if(!values.isEmpty() && count == 0){
+                                        Set<String> set = new LinkedHashSet<>(values);
+                                        values = new ArrayList<>(set);
+                                    }
                                     int scale = StringUtils.getScale(values);
                                     FormulaUtils.write(t.getValue(), values.stream().map(u -> {
                                     /*    if(StringUtils.isEmpty(u)){

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

@@ -521,7 +521,6 @@ public class WbsSynchronousServiceImpl {
                         case 3:
                             //公式配置
                         case 5:
-                            editData.addAll(addPrivateNodes);
                             editData.addAll(editPrivateNodes);
                             wbsSynchronousEViSaService.saveFormula(wbsTreeSynchronousRecord, editData);
                             //现在电签使用的是模糊匹配 如果电签匹配方式改为精确匹配 则需要使用该功能
@@ -1021,10 +1020,9 @@ public class WbsSynchronousServiceImpl {
             Set<Long> longs = collect.keySet();
 
             List<Long> pIds = new ArrayList<>(longs);
-            List<WbsTreePrivate> saveData = new ArrayList<>();
             //按最小节点批量新增
             List<List<Long>> partition = Lists.partition(pIds, 100);
-
+            int sum = 0;
             for (List<Long> data : partition) {
                 for (Long pId : data) {
                     List<WbsTreePrivate> list = collect.get(pId);
@@ -1051,10 +1049,8 @@ public class WbsSynchronousServiceImpl {
                         }
                     }
 
-                    boolean b = saveData.addAll(list);
-
                     //单个批次一个事务,只会回滚当前批次数据
-                    Integer i = wbsTreePrivateMapper.insertBatchSomeColumn(saveData);
+                    Integer i = wbsTreePrivateMapper.insertBatchSomeColumn(list);
                     //如果失败  -- - - - - 继续执行   或者把当前节点的p_key_id 记录到某个地方 方便后续处理
                     if (i == 0) {
                         List<Long> collect1 = addData.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
@@ -1077,6 +1073,10 @@ public class WbsSynchronousServiceImpl {
                                 wbsTreePrivateMapper.updateSortBatchByPKeyId(resourceData);
                             }
                         }
+                        synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
+                                .set(WbsTreeSynchronousRecord::getNodeNumEnd, sum++)
+                                .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
+                                .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
                     }
                 }
             }

+ 170 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -756,6 +756,15 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 try {
                     return compareTo(split1, split2);
                 } catch (NumberFormatException e) {
+                    try {
+                        if (split1[1].contains("_PL_") || split2[1].contains("_PL_")) {
+                            split1 = split1[1].split("_PL_");
+                            split2 = split2[1].split("_PL_");
+                            return compareTo(split1, split2);
+                        }
+                    } catch (NumberFormatException e1) {
+                        return name1.compareTo(name2);
+                    }
                     // 如果无法将字符串转换为数字,则按照字符串比较
                     return name1.compareTo(name2);
                 }
@@ -884,6 +893,72 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     public boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) throws InterruptedException {
         WbsTreeContract wbsInfo = this.baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, info.getPkId()));
+        // ,key1=value1,key2=value2
+        StringBuilder update = new StringBuilder();
+        // ,key1,key2
+        StringBuilder insert = new StringBuilder();
+        // ,value1,value2
+        StringBuilder insertValue = new StringBuilder();
+        // ,value1,value2
+        StringBuilder key201Value = new StringBuilder();
+        //解析html
+//        if(info.getIsCopyThisData()){
+        List<String> keys = new ArrayList<>();
+        try {
+            String fileUrl = wbsInfo.getHtmlUrl();
+            InputStream fileInputStream = org.springblade.manager.utils.FileUtils.getInputStreamByUrl(fileUrl);
+
+            String htmlString = IoUtil.readToString(fileInputStream);
+            // 样式集合
+            Document doc = Jsoup.parse(htmlString);
+
+            //获取所有照片
+            Elements selectImgs = doc.select("hc-table-form-upload");
+            for (Element element : selectImgs) {
+                String keyname = element.attr("keyname");
+                keys.add(keyname);
+            }
+            //获取所有日期
+            Elements selectDates = doc.select("el-date-picker");
+            for (Element element : selectDates) {
+                String keyname = element.attr("keyname");
+                keys.add(keyname);
+            }
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        String s1 = "select  * from " + wbsInfo.getInitTableName() + " where p_key_id= " + wbsInfo.getPKeyId();
+
+        //获取当前表数据
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(s1);
+
+
+        if(CollectionUtil.isNotEmpty(keys) && CollectionUtil.isNotEmpty(list)){
+            Map<String, Object> jsonObject = list.get(0);
+
+            keys.forEach(f -> {
+                String s = f.split("__")[0];
+                String string = (String) jsonObject.get(s);
+
+                //判断当前字段是否超过80 超过就存在key_201中
+                if(isSaveKey201(s)){
+                    if(StringUtils.isNotEmpty(key201Value.toString())){
+                        key201Value.append("$$");
+                    }
+                    key201Value.append(s).append(":").append("'").append(string).append("'");
+                } else {
+                    update.append(",").append(s).append("=").append("'").append(string).append("'");
+                    insert.append(",").append(s);
+                    insertValue.append(",").append("'").append(string).append("'");
+                }
+
+            });
+        }
+
+//        }
+
 
         String cols = Arrays.stream(excLenght).collect(Collectors.joining(StringPool.COMMA));
         //查询复制表有多少张
@@ -923,24 +998,55 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
             boolean flag = isSaveKey201(info, wbsInfo, dataCol);
             if (!DataMap.isEmpty()) {
-                String updateSql = "update " + wbsInfo.getInitTableName() + " set " + info.getKey() + "=";
-                if (flag) {
-                    updateSql = "update " + wbsInfo.getInitTableName() + " set key_201 = concat(IFNULL(key_201,''),'$$'," + "'" + info.getKey() + ":" + dataCol + "') where p_key_id= " + wbsTreeContract.getPKeyId() + ";";
+                //是否同步数据
+                if(info.getIsCopyThisData()){
+                    //如果存在字段大于80的
+                    if(StringUtils.isNotEmpty(key201Value.toString())){
+                        String updateSql = "update " + wbsInfo.getInitTableName() + " set key_201 = concat(IFNULL(key_201,''),'$$'," + "'" + info.getKey() + ":" + dataCol + "','$$'," + key201Value + ") where p_key_id= " + wbsTreeContract.getPKeyId() + ";";
+                        addSql.append(updateSql);
+                    }
+                    //存在需要更新单独数据
+                    if(StringUtils.isNotEmpty(update.toString())){
+                        String updateSql = "update " + wbsInfo.getInitTableName() + " set " + info.getKey() + "=" + "'" + dataCol + "'" + update + " where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
+                        addSql.append(updateSql);
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 } else {
-                    updateSql = updateSql + "'" + dataCol + "' where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
+
+                    String updateSql = "update " + wbsInfo.getInitTableName() + " set " + info.getKey() + "=";
+                    if (flag) {
+                        updateSql = "update " + wbsInfo.getInitTableName() + " set key_201 = concat(IFNULL(key_201,''),'$$'," + "'" + info.getKey() + ":" + dataCol + "') where p_key_id= " + wbsTreeContract.getPKeyId() + ";";
+                    } else {
+                        updateSql = updateSql + "'" + dataCol + "' where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
+                    addSql.append(updateSql);
                 }
-                moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
-                addSql.append(updateSql);
             } else {
                 long dataId = SnowFlakeUtil.getId();
-                String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
-                if (flag) {
-                    insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
-                } else {
-                    insertSql = insertSql + dataCol + "');";
+                //是否同步数据
+                if(info.getIsCopyThisData()){
+                    //如果存在字段大于80的
+                    if(StringUtils.isNotEmpty(key201Value.toString())){
+                        String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",concat('" + info.getKey() + ":" + dataCol + "','$$'," + key201Value + "));";
+                        addSql.append(insertSql);
+                    }
+                    //存在需要更新单独数据
+                    if(StringUtils.isNotEmpty(insert.toString()) && StringUtils.isNotEmpty(insertValue.toString()) ){
+                        String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + insert + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + dataCol + "'" + insertValue + ");";
+                        addSql.append(insertSql);
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
+                }else{
+                    String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
+                    if (flag) {
+                        insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
+                    } else {
+                        insertSql = insertSql + dataCol + "');";
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
+                    addSql.append(insertSql);
                 }
-                moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
-                addSql.append(insertSql);
             }
         }
 
@@ -994,7 +1100,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     dataSize = moreData.size();
                 }
                 long dataId = SnowFlakeUtil.getId();
-                String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
                 String dataCol = "";
                 for (int j = 0; j < dataSize; j++) {
                     if (j == dataSize - 1) {
@@ -1003,13 +1108,30 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
                     }
                 }
-                if (isSaveKey201(info, wbsInfo, dataCol)) {
-                    insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
-                } else {
-                    insertSql = insertSql + dataCol + "');";
+
+                //是否同步数据
+                if(info.getIsCopyThisData()){
+                    //如果存在字段大于80的
+                    if(StringUtils.isNotEmpty(key201Value.toString())){
+                        String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",concat('" + info.getKey() + ":" + dataCol + "','$$'," + key201Value + "));";
+                        addSql.append(insertSql);
+                    }
+                    //存在需要更新单独数据
+                    if(StringUtils.isNotEmpty(insert.toString()) && StringUtils.isNotEmpty(insertValue.toString()) ){
+                        String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + insert + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + dataCol + "'" + insertValue + ");";
+                        addSql.append(insertSql);
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
+                }else{
+                    String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
+                    if (isSaveKey201(info, wbsInfo, dataCol)) {
+                        insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
+                    } else {
+                        insertSql = insertSql + dataCol + "');";
+                    }
+                    moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
+                    addSql.append(insertSql);
                 }
-                moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
-                addSql.append(insertSql);
             }
             // 插入数据
             this.baseMapper.insertBatchSomeColumn(addList);
@@ -1026,6 +1148,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return false;
     }
 
+
     private boolean isSaveKey201(RangeInfo info, WbsTreeContract wbsInfo, String dataCol) {
         boolean flag = false;
         try {
@@ -1051,6 +1174,22 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return flag;
     }
 
+    /**
+     * 判断字段是否超过80
+     * @param key
+     * @return
+     */
+    private boolean isSaveKey201(String key) {
+        boolean flag = false;
+        try {
+            String[] split = key.split("_");
+            flag = split.length > 1 && StringUtil.isNumeric(split[1]) && Integer.parseInt(split[1]) > 80;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
     @Override
     public void syncCurrentFormToAllContract(WbsTreePrivate wbsTreePrivate) {
         baseMapper.syncCurrentFormToAllContract(wbsTreePrivate);
@@ -5613,9 +5752,17 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
     }
     @Override
-    public List<WbsTreeContract> queryListByPIds(List<Long> pIds) {
-        return baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+    public List<WbsTreeContract> queryListByPIds(List<Long> pIds, Integer classify) {
+        LambdaQueryWrapper<WbsTreeContract> eq = Wrappers.<WbsTreeContract>lambdaQuery()
                 .in(WbsTreeContract::getPId, pIds)
-                .eq(WbsTreeContract::getIsDeleted, 0));
+                .isNotNull(WbsTreeContract::getHtmlUrl)
+                .eq(WbsTreeContract::getIsDeleted, 0);
+        if(Objects.equals(1,classify)){
+            eq.in(WbsTreeContract::getTableOwner, 1,2,3);
+        }
+        if(Objects.equals(2,classify)){
+            eq.in(WbsTreeContract::getTableOwner, 4,5,6);
+        }
+        return baseMapper.selectList(eq);
     }
 }

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

@@ -258,10 +258,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<WbsTreePrivateVO> lazyTree(String wbsId, String wbsType, Long parentId, String projectId) {
+    public List<WbsTreePrivateVO> lazyTree(String wbsId, String wbsType, Long parentId, String projectId, Integer type) {
         //获取请求头中的authorization
         String headerAuthorization = getHeaderAuthorization();
-        List<WbsTreePrivateVO> wbsTreePrivateVOS = baseMapper.lazyTree(wbsId, Integer.valueOf(wbsType), parentId, projectId);
+        List<WbsTreePrivateVO> wbsTreePrivateVOS = baseMapper.lazyTree(wbsId, Integer.valueOf(wbsType), parentId, projectId,type);
         //判断如果是客户端就进入分支 把包含委托单的节点删除
         if (headerAuthorization != null && !"".equals(headerAuthorization) && headerAuthorization.contains("client_secret") && wbsTreePrivateVOS.size() > 0) {
             JSONArray objects = JSONUtil.parseArray(wbsTreePrivateVOS);
@@ -3204,8 +3204,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<ArchiveSyncLogVO> getContractAllLog(Long contractId) {
-        return baseMapper.getContractAllLog(contractId);
+    public List<ArchiveSyncLogVO> getContractAllLog(Long contractId, Long wbsNodeId) {
+        return baseMapper.getContractAllLog(contractId, wbsNodeId);
     }
 
     @Override
@@ -3213,6 +3213,11 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return baseMapper.getContractAllLogMonthPack(contractId);
     }
 
+    @Override
+    public List<Long> getContractAllLogWbsNodeIds(Long contractId) {
+        return baseMapper.getContractAllLogWbsNodeIds(contractId);
+    }
+
     public void diGuiWbs(int i) {
         QueryWrapper<WbsTreePrivate> wbsTreePrivateQueryWrapper = new QueryWrapper<>();
         wbsTreePrivateQueryWrapper.select("p_key_id", "id", "p_id", "wbs_id", "project_id", "parent_id", "ancestors");

+ 16 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -503,7 +503,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             if (("1").equals(type)) {//节点
                 if (ObjectUtil.isEmpty(projectId)) {//公有
                     Set<WbsTree> resultNodes = new HashSet<>();
-                    List<WbsTree> wbsTrees = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getType, 1).eq(WbsTree::getWbsId, wbsId).and(wrapper -> wrapper.like(WbsTree::getNodeName, queryValue).or().like(WbsTree::getFullName, queryValue)));
+                    List<WbsTree> wbsTrees = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getType, 1).eq(WbsTree::getWbsId, wbsId).and(wrapper -> wrapper.like(WbsTree::getNodeName, queryValue).or().like(WbsTree::getImportMatchingInfo, queryValue)));
                     this.getParentNodesPublicWbs(wbsTrees, resultNodes);
                     resultNodes.addAll(wbsTrees);
                     List<WbsTreeQueryValueVO> wbsTreeQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreeQueryValueVO.class);
@@ -516,8 +516,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
                 } else {//私有
                     Set<WbsTreePrivate> resultNodes = new HashSet<>();
-                    List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).and(wrapper -> wrapper.like(WbsTreePrivate::getNodeName, queryValue).or().like(WbsTreePrivate::getFullName, queryValue)));
+                    List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).and(wrapper -> wrapper.like(WbsTreePrivate::getNodeName, queryValue).or().like(WbsTreePrivate::getImportMatchingInfo, queryValue)).and(wrapper -> wrapper.ne(WbsTreePrivate::getIsAddConceal, 1).or().isNull(WbsTreePrivate::getIsAddConceal)));
                     this.getParentNodesPrivateWbs(wbsTreePrivates, resultNodes, projectId, wbsId);
+                    this.getChildNodesPrivateWbs(wbsTreePrivates, resultNodes, projectId, wbsId);
                     resultNodes.addAll(wbsTreePrivates);
                     List<WbsTreePrivateQueryValueVO> wbsTreePrivateQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreePrivateQueryValueVO.class);
                     if (wbsTreePrivateQueryValueVOS.size() > 0) {
@@ -563,8 +564,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
 
     @Override
-    public List<WbsTreePrivate> getTitleRange(String projectId) {
-        return this.baseMapper.getTitleRange(Long.valueOf(projectId));
+    public List<WbsTreePrivate> getTitleRange(String projectId,Integer wbsType) {
+        return this.baseMapper.getTitleRange(Long.valueOf(projectId),wbsType);
     }
 
     @Override
@@ -668,6 +669,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         }
     }
 
+    private void getChildNodesPrivateWbs(List<WbsTreePrivate> wbsTreePrivates, Set<WbsTreePrivate> resultNodes, String projectId, String wbsId) {
+        Set<Long> Ids = wbsTreePrivates.stream().map(WbsTreePrivate::getId).collect(Collectors.toSet());
+        if (Ids.size() > 0) {
+            List<WbsTreePrivate> childNodes = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getParentId, Ids).eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId));
+            if (childNodes.size() > 0) {
+                resultNodes.addAll(childNodes);
+                this.getChildNodesPrivateWbs(childNodes, resultNodes, projectId, wbsId);
+            }
+        }
+    }
+
     private void buildWbsTreePrivateByGetQueryValueByType(List<WbsTreePrivateQueryValueVO> listRoot, Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll) {
         for (WbsTreePrivateQueryValueVO wbsTree : listRoot) {
             List<WbsTreePrivateQueryValueVO> childrenList = mapAll.get(wbsTree.getId());

+ 23 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java

@@ -81,7 +81,7 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
 
 
         //记录选中节点下的表单数
-        String[] newNodeIds = mWbsTreeSynchronousRecord.getNodeId().split(",");
+        List<String> newNodeIds = Arrays.asList(mWbsTreeSynchronousRecord.getNodeId().split(","));
         for (String newNodeId : newNodeIds) {
             Long nodeIdLong = Long.valueOf(newNodeId);
             if (privateIds.contains(nodeIdLong)) {
@@ -89,6 +89,28 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             }
         }
 
+        List<String> parentIds = new ArrayList<>();
+        //处理父节点包含子节点数据
+        for (String newNodeId : newNodeIds) {
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getPKeyId, newNodeId));
+            //如果是最顶层节点
+            if(wbsTreePrivate.getPId() == 0){
+                //清空所有记录,只保留最顶层节点id
+                parentIds.clear();
+                parentIds.add(newNodeId);
+                break;
+            }
+            //如果当前节点的父节点也在列表中,去掉当前节点
+            if(newNodeIds.contains(wbsTreePrivate.getPId().toString())){
+                continue;
+            }
+            parentIds.add(newNodeId);
+        }
+        if(!parentIds.isEmpty()){
+            mWbsTreeSynchronousRecord.setNodeId(String.join(",", parentIds));
+        }
+
         //模板项目信息
         ProjectInfo tempProject = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery()
                 .eq(ProjectInfo::getId, mWbsTreeSynchronousRecord.getTemplateId()));

+ 0 - 1
blade-service/blade-meter/src/main/java/org/springblade/MeterApplication.java

@@ -16,5 +16,4 @@ public class MeterApplication {
     public static void main(String[] args) {
         BladeApplication.run(LauncherConstant.APPLICATION_METER_NAME, MeterApplication.class, args);
     }
-
 }

+ 2 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -1319,7 +1319,8 @@ public class TaskController extends BladeController {
         /*获取用户信息Map*/
         Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
         /*获取预设流程Map*/
-        Map<Long, String> flowMap = jdbcTemplate.query("select id,fixed_flow_name from u_fixed_flow where is_deleted = 0 and contract_id = "+dto.getContractId(), new BeanPropertyRowMapper<>(FixedFlow.class)).stream().collect(Collectors.toMap(FixedFlow::getId, FixedFlow::getFixedFlowName, (key1, key2) -> key1));
+       // Map<Long, String> flowMap = jdbcTemplate.query("select id,fixed_flow_name from u_fixed_flow where is_deleted = 0 and contract_id = "+dto.getContractId(), new BeanPropertyRowMapper<>(FixedFlow.class)).stream().collect(Collectors.toMap(FixedFlow::getId, FixedFlow::getFixedFlowName, (key1, key2) -> key1));
+        Map<Long, String> flowMap = jdbcTemplate.query("select id,fixed_flow_name from u_fixed_flow where is_deleted = 0 ", new BeanPropertyRowMapper<>(FixedFlow.class)).stream().collect(Collectors.toMap(FixedFlow::getId, FixedFlow::getFixedFlowName, (key1, key2) -> key1));
 
         //筛选出可审批的数据
          if(ObjectUtil.isNotEmpty(dto.getStatusValue()) && dto.getStatusValue() .equals(4) && ObjectUtil.isNotEmpty(resultList)){

+ 5 - 4
blade-service/blade-system/src/main/java/org/springblade/system/controller/DictBizController.java

@@ -24,6 +24,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.system.entity.DictBiz;
@@ -159,8 +160,8 @@ public class DictBizController extends BladeController {
     @GetMapping("/dictionary")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "获取字典", notes = "获取字典")
-    public R<List<DictBiz>> dictionary(String code) {
-        List<DictBiz> tree = dictService.getList(code, "notRoot");
+    public R<List<DictBiz>> dictionary(String code, BladeUser user) {
+        List<DictBiz> tree = dictService.getList(code, "notRoot",user.getTenantId());
         return R.data(tree);
     }
 
@@ -170,8 +171,8 @@ public class DictBizController extends BladeController {
     @GetMapping("/dictionary-tree")
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "获取字典树", notes = "获取字典树")
-    public R<List<DictBizVO>> dictionaryTree(String code) {
-        List<DictBiz> tree = dictService.getList(code, "notRoot");
+    public R<List<DictBizVO>> dictionaryTree(String code, BladeUser user) {
+        List<DictBiz> tree = dictService.getList(code, "notRoot",user.getTenantId());
         return R.data(DictBizWrapper.build().listNodeVO(tree));
     }
 

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/feign/DictBizClient.java

@@ -57,7 +57,7 @@ public class DictBizClient implements IDictBizClient {
     @Override
     @GetMapping(GET_LIST)
     public R<List<DictBiz>> getList(String code, String notRoot) {
-        return R.data(service.getList(code, notRoot));
+        return R.data(service.getList(code, notRoot,""));
     }
 
 }

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.java

@@ -46,7 +46,7 @@ public interface DictBizMapper extends BaseMapper<DictBiz> {
      * @param code 字典编号
      * @return
      */
-    List<DictBiz> getList(@Param("code") String code, @Param("notRoot") String notRoot);
+    List<DictBiz> getList(@Param("code") String code, @Param("notRoot") String notRoot, @Param("tenantId") String tenantId);
 
     /**
      * 获取树形节点

+ 3 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

@@ -40,6 +40,9 @@
         <if test="notRoot != null and notRoot != ''">
             and parent_id > 0
         </if>
+        <if test="tenantId != null and tenantId != ''">
+            and tenantId = #{tenantId}
+        </if>
         and is_sealed = 0 and is_deleted = 0
         order by sort
     </select>

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/IDictBizService.java

@@ -62,7 +62,7 @@ public interface IDictBizService extends IService<DictBiz> {
      * @param code 字典编号
      * @return
      */
-    List<DictBiz> getList(String code, String notRoot);
+    List<DictBiz> getList(String code, String notRoot,String tenantId);
 
     /**
      * 新增或修改

+ 5 - 2
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DictBizServiceImpl.java

@@ -67,8 +67,11 @@ public class DictBizServiceImpl extends ServiceImpl<DictBizMapper, DictBiz> impl
     }
 
     @Override
-    public List<DictBiz> getList(String code, String notRoot) {
-        return baseMapper.getList(code, notRoot);
+    public List<DictBiz> getList(String code, String notRoot,String tenantId) {
+        if (tenantId==null || tenantId.equals("") || tenantId.equals("null") || Func.isNull(tenantId)) {
+            tenantId = "000000";
+        }
+        return baseMapper.getList(code, notRoot,tenantId);
     }
 
     @Override

+ 50 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -56,12 +56,14 @@ import org.springblade.system.cache.ParamCache;
 import org.springblade.system.user.bean.CyGetToken;
 import org.springblade.system.user.bean.ResultCYData;
 import org.springblade.system.user.bean.ResultCYKey;
+import org.springblade.system.user.dto.TokenVerifyResult;
 import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.excel.UserExcel;
 import org.springblade.system.user.excel.UserExcel2;
 import org.springblade.system.user.excel.UserImporter;
 import org.springblade.system.user.service.IUserService;
+import org.springblade.system.user.util.RSA256Utils;
 import org.springblade.system.user.util.RsaUtils;
 import org.springblade.system.user.vo.UserVO;
 import org.springblade.system.user.wrapper.UserWrapper;
@@ -474,7 +476,7 @@ public class UserController {
     @PostMapping("/loginByToken")
     @ApiOperationSupport(order = 20)
     @ApiOperation(value = "token验证加密", notes = "token验证登录")
-    public R loginByToken(String token, HttpServletRequest request) {
+    public R loginByToken(String token, String gfzxToken, HttpServletRequest request) {
         String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
         token = "bearer " + token;
         HttpClient httpClient = HttpClientBuilder.create().build();
@@ -815,4 +817,51 @@ public class UserController {
         }
         return this.getLoginInfo(Authorization,userInfo);
     }
+
+
+    /**
+     * 成渝获取token接口
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/loginByToken5")
+    public R loginByToken5(String token, HttpServletRequest request) {
+        if (token == null) {
+            return R.fail("token值不能为空");
+        }
+        //获取公钥 存放在系统配置中
+        String sql = "select param_value from blade_param where param_key = 'gfzx.publicKey' and is_deleted = 0";
+        String publicKey = jdbcTemplate.queryForObject(sql, String.class);
+        if (StringUtil.isBlank(publicKey)) {
+            return R.fail("系统中不存在公钥信息,请联系管理员");
+        }
+        //解密
+        TokenVerifyResult tokenVerifyResult = RSA256Utils.verifyToken(token, publicKey);
+        if(!tokenVerifyResult.isValid()){
+            return R.fail(tokenVerifyResult.getMessage());
+        }
+
+
+
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account", tokenVerifyResult.getAccount());
+        queryWrapper.eq("sys_type", 2);
+        User userInfo = userService.getOne(queryWrapper);
+        if (userInfo == null) {
+            return R.fail("用户名或密码错误");
+        }
+
+        String Authorization = request.getHeader("Authorization");
+
+        if (Authorization == null || StringUtil.isEmpty(Authorization)) {
+            String dataInfo = "archives:archives_secret";
+            Authorization = "Basic " + Func.encodeBase64(dataInfo);
+            R loginInfo = this.getLoginInfo(Authorization, userInfo);
+            if (loginInfo.getCode() == 200) {
+                return loginInfo;
+            }
+        }
+        return this.getLoginInfo(Authorization, userInfo);
+    }
 }

+ 8 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -221,7 +221,14 @@
                     AND iq.type != 3
                 </if>
                 <if test="query.chekStatus != null and query.chekStatus != ''">
-                    AND iq.chek_status = #{query.chekStatus}
+                    <choose>
+                        <when test="query.chekStatus == 3">
+                            AND iq.chek_status >= 3
+                        </when>
+                        <otherwise>
+                            AND iq.chek_status = #{query.chekStatus}
+                        </otherwise>
+                    </choose>
                 </if>
                 <if test="query.wbsIds != null">
                     AND iq.wbs_id IN

+ 79 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/util/RSA256Utils.java

@@ -0,0 +1,79 @@
+package org.springblade.system.user.util;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.Jwts;
+import org.springblade.system.user.dto.TokenVerifyResult;
+
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+public class RSA256Utils {
+
+    /**
+     * Base64字符串公钥返回PublicKey
+     */
+    public static PublicKey getPublicSecretKey(String publicKey) throws Exception {
+        byte[] keyBytes = Base64.getDecoder().decode(publicKey);
+        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory kf = KeyFactory.getInstance("RSA");
+        return kf.generatePublic(spec);
+    }
+
+    /**
+     * 使用公钥对字符串进行验签
+     */
+    public static boolean verifySign(String data, String sign, String publicKey) throws Exception  {
+        Signature verifier = Signature.getInstance("SHA256withRSA");
+        verifier.initVerify(getPublicSecretKey(publicKey)); // 公钥验证
+        verifier.update(data.getBytes());
+        return verifier.verify(Base64.getDecoder().decode(sign));
+    }
+
+    /**
+     * 校验Token是否合法
+     */
+    public static TokenVerifyResult verifyToken(String token, String publicKey) {
+        try {
+            Claims claims = Jwts.parser()
+                    .setSigningKey(RSA256Utils.getPublicSecretKey(publicKey))
+                    .parseClaimsJws(token)
+                    .getBody();
+
+            String account = (String) claims.get("account");
+            String name = (String) claims.get("name");
+            String tag = (String) claims.get("tag");
+            Object tsObj = claims.get("timestamp");
+            String sign = (String) claims.get("sign");
+
+            if (tsObj == null) {
+                return new TokenVerifyResult(false,"缺少时间戳(timestamp)","");
+            }
+
+            long timestamp;
+            try {
+                timestamp = ((Number) tsObj).longValue();
+            } catch (Exception e) {
+                return new TokenVerifyResult(false,"时间戳格式错误","");
+            }
+
+            if (sign == null) {
+                return new TokenVerifyResult(false,"缺少签名字段","");
+            }
+
+            boolean signResult = RSA256Utils.verifySign(account + "|" + name + "|" + tag + "|" + timestamp, sign, publicKey);
+            if (!signResult) {
+                return new TokenVerifyResult(false,"签名不匹配","");
+            }
+            return new TokenVerifyResult(true,"",account);
+        } catch (ExpiredJwtException e) {
+            e.printStackTrace();
+            return new TokenVerifyResult(false,"Token已过期","");
+        } catch (Exception e) {
+            return new TokenVerifyResult(false,"Token非法","");
+        }
+    }
+}