Browse Source

Merge remote-tracking branch 'origin/master' into master

yangyj 2 years ago
parent
commit
d11fa7a187
63 changed files with 1524 additions and 606 deletions
  1. 3 3
      blade-ops/blade-xxljob-admin/blade-xxljob-admin.iml
  2. 3 3
      blade-ops/blade-xxljob/blade-xxljob.iml
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RawMaterialSubmitRelationDTO.java
  4. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RecordSampleSubmitDTO.java
  5. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/SelfProjectPositionSubmitDTO.java
  6. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  7. 1 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java
  8. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/RecycleBinVO.java
  9. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialRawMaterialSelfRecord.java
  10. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO.java
  11. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO2.java
  12. 16 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfSample.java
  13. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/SaveUserInfoByProjectDTO.java
  14. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java
  15. 0 9
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  16. 44 21
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  17. 60 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  18. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/OperationLogController.java
  19. 15 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/RecycleBinController.java
  20. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  21. 22 8
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  22. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java
  23. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  24. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  25. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  26. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java
  27. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  28. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.java
  29. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml
  30. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java
  31. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java
  32. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  33. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSampleInfoService.java
  34. 10 7
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  35. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  36. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  37. 0 6
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  38. 15 13
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceUseServiceImpl.java
  39. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java
  40. 300 183
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  41. 62 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  42. 161 29
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  43. 10 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  44. 46 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  45. 77 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  46. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java
  47. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  48. 35 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  49. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.xml
  50. 3 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  51. 32 37
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  52. 18 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  53. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  54. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  55. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  56. 119 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  57. 43 61
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java
  58. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFileServiceImpl.java
  59. 62 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  60. 87 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  61. 0 6
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  62. 0 2
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  63. 39 78
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 3 - 3
blade-ops/blade-xxljob-admin/blade-xxljob-admin.iml

@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
   <component name="FacetManager">
   <component name="FacetManager">
-    <facet type="Spring" name="Spring">
-      <configuration />
-    </facet>
     <facet type="web" name="Web">
     <facet type="web" name="Web">
       <configuration>
       <configuration>
         <webroots />
         <webroots />
       </configuration>
       </configuration>
     </facet>
     </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
   </component>
   </component>
   <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
   <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
     <output url="file://$MODULE_DIR$/target/classes" />
     <output url="file://$MODULE_DIR$/target/classes" />

+ 3 - 3
blade-ops/blade-xxljob/blade-xxljob.iml

@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
   <component name="FacetManager">
   <component name="FacetManager">
-    <facet type="Spring" name="Spring">
-      <configuration />
-    </facet>
     <facet type="web" name="Web">
     <facet type="web" name="Web">
       <configuration>
       <configuration>
         <webroots />
         <webroots />
       </configuration>
       </configuration>
     </facet>
     </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
   </component>
   </component>
   <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
   <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
     <output url="file://$MODULE_DIR$/target/classes" />
     <output url="file://$MODULE_DIR$/target/classes" />

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RawMaterialSubmitRelationDTO.java

@@ -26,4 +26,7 @@ public class RawMaterialSubmitRelationDTO implements Serializable {
     @ApiModelProperty("所属方类型 1=施工自检 2=监理抽检")
     @ApiModelProperty("所属方类型 1=施工自检 2=监理抽检")
     private Integer type;
     private Integer type;
 
 
+    @ApiModelProperty("当前记录的原始pdfUrl")
+    private String pdfUrl;
+
 }
 }

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/RecordSampleSubmitDTO.java

@@ -0,0 +1,20 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RecordSampleSubmitDTO implements Serializable {
+
+    /**
+     * 自检记录id
+     */
+    private Long id;
+
+    /**
+     * 样品ids
+     */
+    private String sampleIds;
+
+}

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/SelfProjectPositionSubmitDTO.java

@@ -0,0 +1,20 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SelfProjectPositionSubmitDTO implements Serializable {
+
+    /**
+     * 自检记录id
+     */
+    private Long id;
+
+    /**
+     * 工程部位及用途,当前合同段质检树节点ids
+     */
+    private String projectPosition;
+
+}

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

@@ -47,7 +47,7 @@ public interface InformationQueryClient {
                                             @RequestBody List<JSONObject> linkDataList);
                                             @RequestBody List<JSONObject> linkDataList);
 
 
     @PostMapping(API_PREFIX + "/informationQuerySaveData")
     @PostMapping(API_PREFIX + "/informationQuerySaveData")
-    void saveData(@RequestParam String nodeId, @RequestParam String projectId, @RequestParam String contractId, @RequestParam String classify, @RequestParam String link, @RequestParam String trialProjectName);
+    void saveData(@RequestParam String id, @RequestParam String projectId, @RequestParam String contractId, @RequestParam String classify, @RequestParam String link, @RequestParam String trialProjectName);
 
 
     @PostMapping(API_PREFIX + "/updateInformationQuery")
     @PostMapping(API_PREFIX + "/updateInformationQuery")
     void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);
     void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);

+ 1 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO.java

@@ -92,6 +92,7 @@ public class NeiYeLedgerVO {
         this.taskStatus = values[8];
         this.taskStatus = values[8];
         this.isEvaluate = Boolean.parseBoolean(values[9]);
         this.isEvaluate = Boolean.parseBoolean(values[9]);
         this.isExperiment = Boolean.parseBoolean(values[10]);
         this.isExperiment = Boolean.parseBoolean(values[10]);
+        this.reportNumber = values[11];
     }
     }
 
 
     public NeiYeLedgerVO(){}
     public NeiYeLedgerVO(){}

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/RecycleBinVO.java

@@ -17,6 +17,6 @@ import java.util.List;
 public class RecycleBinVO extends RecycleBin {
 public class RecycleBinVO extends RecycleBin {
 	private static final long serialVersionUID = 1L;
 	private static final long serialVersionUID = 1L;
 
 
-	private List<String> regainIds;
+	private List<RecycleBin> regainIds;
 
 
 }
 }

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialRawMaterialSelfRecord.java

@@ -0,0 +1,20 @@
+package org.springblade.business.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("u_trial_raw_material_self_record")
+public class TrialRawMaterialSelfRecord implements Serializable {
+
+    private Long id;
+
+    private Long selfRecordId;
+
+    private Long rawMaterialRecordId;
+
+    private String oldPdfUrl;
+
+}

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO.java

@@ -23,4 +23,7 @@ public class TrialSelfInspectionRecordVO extends TrialSelfInspectionRecord {
     @ApiModelProperty(value = "是否关联选择过 0=否 1=是")
     @ApiModelProperty(value = "是否关联选择过 0=否 1=是")
     private Integer isSelectedStatus;
     private Integer isSelectedStatus;
 
 
+    @ApiModelProperty("样品信息ids")
+    private String sampleIds;
+
 }
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordVO2.java

@@ -22,6 +22,9 @@ public class TrialSelfInspectionRecordVO2 implements Serializable {
     @ApiModelProperty(value = "工程部位及用途")
     @ApiModelProperty(value = "工程部位及用途")
     private String projectPosition;
     private String projectPosition;
 
 
+    @ApiModelProperty(value = "工程部位及用途名称")
+    private String projectPositionName;
+
     @ApiModelProperty(value = "报告日期")
     @ApiModelProperty(value = "报告日期")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date reportDate;
     private Date reportDate;

+ 16 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfSample.java

@@ -0,0 +1,16 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TrialSelfSample implements Serializable {
+
+    private Long id;
+
+    private Long selfId;
+
+    private Long samplingId;
+
+}

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/SaveUserInfoByProjectDTO.java

@@ -52,5 +52,11 @@ public class SaveUserInfoByProjectDTO extends BaseEntity {
     @ApiModelProperty(value = "userId",required = true)
     @ApiModelProperty(value = "userId",required = true)
     private String userId;
     private String userId;
 
 
+    /**
+     * 是否从监理合同段关联
+     */
+    @JsonProperty(value = "isRecordJl")
+    @ApiModelProperty(value = "数据来源-监理合同段id",required = true)
+    private Long isRecordJlId;
 
 
 }
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java

@@ -24,4 +24,10 @@ public interface ProjectClient {
     @GetMapping(API_PREFIX + "/queryProjectList")
     @GetMapping(API_PREFIX + "/queryProjectList")
     List<ProjectInfo> queryProjectList(@RequestParam List<String> projectIds);
     List<ProjectInfo> queryProjectList(@RequestParam List<String> projectIds);
 
 
+    /**
+     * 根据项目ID获取项目信息
+     */
+    @GetMapping(API_PREFIX + "/getById")
+    ProjectInfo getById(@RequestParam String key);
+
 }
 }

+ 0 - 9
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -17,16 +17,13 @@
 package org.springblade.system.user.feign;
 package org.springblade.system.user.feign;
 
 
 
 
-import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
 import org.springblade.system.user.entity.UserOauth;
-import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -159,12 +156,6 @@ public interface IUserClient {
     @GetMapping(UPDATE_USER_ROLE_ID)
     @GetMapping(UPDATE_USER_ROLE_ID)
     boolean updateUserRoleIdTwo(@RequestParam("userId") String userId, @RequestParam("roleId") String roleId);
     boolean updateUserRoleIdTwo(@RequestParam("userId") String userId, @RequestParam("roleId") String roleId);
 
 
-    /**
-     * 批量删除用户RoleId
-     */
-    @GetMapping(UPDATE_USERS_ROLE_ID)
-    boolean updateUserRoleIdThree(@RequestParam("userIds") List<String> userIds, @RequestParam("roleIds") String roleIds);
-
     /**
     /**
      * 获取全部userList
      * 获取全部userList
      */
      */

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

@@ -51,6 +51,7 @@ import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -490,7 +491,7 @@ public class InformationWriteQueryController extends BladeController {
         InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify));
         InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify));
         if (businessData != null) {
         if (businessData != null) {
             //使用批量废除接口
             //使用批量废除接口
-            return this.batchAbolish(businessData.getId().toString());
+            return this.batchAbolish(businessData.getId().toString(), primaryKeyId);
         }
         }
         return R.data(300, false, "废除失败,未找到业务数据");
         return R.data(300, false, "废除失败,未找到业务数据");
     }
     }
@@ -556,12 +557,12 @@ public class InformationWriteQueryController extends BladeController {
      */
      */
     @PostMapping("/queryNodeStatus-trial")
     @PostMapping("/queryNodeStatus-trial")
     @ApiOperationSupport(order = 23)
     @ApiOperationSupport(order = 23)
-    @ApiOperation(value = "/查询节点状态-试验")
-    public R<String> queryNodeStatusTrial(@RequestParam String primaryKeyId, @RequestParam String classify) {
+    @ApiOperation(value = "/查询节点状态-试验", notes = "当前记录id、所属方classify")
+    public R<String> queryNodeStatusTrial(@RequestParam String classify, @RequestParam String id) {
         //记录状态
         //记录状态
         String status = "1";
         String status = "1";
         //查询填报状态
         //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, id).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
         if (businessData != null) {
         if (businessData != null) {
             switch (businessData.getStatus()) {
             switch (businessData.getStatus()) {
                 case 0:
                 case 0:
@@ -578,10 +579,11 @@ public class InformationWriteQueryController extends BladeController {
                     //如果不匹配,默认为未填报
                     //如果不匹配,默认为未填报
                     status = "1";
                     status = "1";
                     //查询表格
                     //查询表格
-                    List<WbsTreePrivate> tableList = this.wbsTreePrivateClient.queryChildByParent(this.wbsTreePrivateClient.getNodeByPrimaryKeyId(primaryKeyId), "queryTable", classify);
-                    if (tableList != null && tableList.size() > 0) {
-                        for (WbsTreePrivate table : tableList) {
-                            if (new Integer("2").equals(table.getIsTabPdf())) {
+                    String sql = "select is_tab_pdf from u_trial_self_data_record where record_id = " + id;
+                    List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+                    if (query.size() > 0) {
+                        for (TrialSelfDataRecord info : query) {
+                            if (new Integer("2").equals(info.getIsTabPdf())) {
                                 //这些表格中,但凡有一个能够预览,就开放预览
                                 //这些表格中,但凡有一个能够预览,就开放预览
                                 status = "2";
                                 status = "2";
                                 break;
                                 break;
@@ -591,14 +593,17 @@ public class InformationWriteQueryController extends BladeController {
                     break;
                     break;
             }
             }
         } else {
         } else {
-            //查询表格
-            List<WbsTreePrivate> tableList = this.wbsTreePrivateClient.queryChildByParent(this.wbsTreePrivateClient.getNodeByPrimaryKeyId(primaryKeyId), "queryTable", classify);
-            if (tableList != null && tableList.size() > 0) {
-                for (WbsTreePrivate table : tableList) {
-                    if (new Integer("2").equals(table.getIsTabPdf())) {
-                        //这些表格中,但凡有一个能够预览,就开放预览
-                        status = "2";
-                        break;
+            if (StringUtils.isNotEmpty(id)) {
+                //查询表格
+                String sql = "select is_tab_pdf from u_trial_self_data_record where record_id = " + id;
+                List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+                if (query.size() > 0) {
+                    for (TrialSelfDataRecord info : query) {
+                        if (new Integer("2").equals(info.getIsTabPdf())) {
+                            //这些表格中,但凡有一个能够预览,就开放预览
+                            status = "2";
+                            break;
+                        }
                     }
                     }
                 }
                 }
             }
             }
@@ -739,8 +744,8 @@ public class InformationWriteQueryController extends BladeController {
      */
      */
     @PostMapping("/batchAbolish")
     @PostMapping("/batchAbolish")
     @ApiOperationSupport(order = 18)
     @ApiOperationSupport(order = 18)
-    @ApiOperation(value = "批量废除")
-    public R<Boolean> batchAbolish(@RequestParam String ids) {
+    @ApiOperation(value = "批量废除", notes = "质检的ids,试验的记录ids")
+    public R<Boolean> batchAbolish(@RequestParam String ids, String primaryKeyId) {
         //获取所有相关任务记录
         //获取所有相关任务记录
         List<Task> taskList = this.taskClient.queryTaskListByFormDataId(ids);
         List<Task> taskList = this.taskClient.queryTaskListByFormDataId(ids);
         if (taskList != null && taskList.size() > 0) {
         if (taskList != null && taskList.size() > 0) {
@@ -880,6 +885,18 @@ public class InformationWriteQueryController extends BladeController {
                         e.printStackTrace();
                         e.printStackTrace();
                     }
                     }
                 }
                 }
+
+                //修改试验任务状态为未上报
+                String sql;
+                if (StringUtils.isNotEmpty(primaryKeyId)) {
+                    //单个废除
+                    sql = "update u_trial_self_inspection_record set task_status = '未上报' where id in(" + primaryKeyId + ")";
+                } else {
+                    //批量废除直接调的该接口,primaryKeyId为null,ids=当前试验记录的ids
+                    sql = "update u_trial_self_inspection_record set task_status = '未上报' where id in(" + ids + ")";
+                }
+                jdbcTemplate.execute(sql);
+
                 return R.data(true, "废除成功");
                 return R.data(true, "废除成功");
             } catch (Exception e) {
             } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
@@ -911,7 +928,7 @@ public class InformationWriteQueryController extends BladeController {
                         if (taskVO.getUserTasks() != null && taskVO.getUserTasks().size() > 0) {
                         if (taskVO.getUserTasks() != null && taskVO.getUserTasks().size() > 0) {
                             //标记为自定义流程
                             //标记为自定义流程
                             taskVO.setFixedFlowId(Long.parseLong("0"));
                             taskVO.setFixedFlowId(Long.parseLong("0"));
-                        }else{
+                        } else {
                             //标记固定流程
                             //标记固定流程
                             taskVO.setFixedFlowId(startTaskVO.getFixedFlowId());
                             taskVO.setFixedFlowId(startTaskVO.getFixedFlowId());
                         }
                         }
@@ -941,6 +958,12 @@ public class InformationWriteQueryController extends BladeController {
 
 
                             //修改记录
                             //修改记录
                             this.informationQueryService.update(wrappers);
                             this.informationQueryService.update(wrappers);
+
+                            //修改试验记录上报任务状态
+                            if (ObjectUtil.isNotEmpty(startTaskVO.getTrialSelfInspectionRecordId())) {
+                                String sql = "update u_trial_self_inspection_record set task_status = '待审批' where id = " + startTaskVO.getTrialSelfInspectionRecordId();
+                                jdbcTemplate.execute(sql);
+                            }
                         }
                         }
                     }
                     }
                 } catch (Exception e) {
                 } catch (Exception e) {
@@ -1132,9 +1155,9 @@ public class InformationWriteQueryController extends BladeController {
                     //重塑primaryKeyId
                     //重塑primaryKeyId
                     newData.setPKeyId(SnowFlakeUtil.getId());
                     newData.setPKeyId(SnowFlakeUtil.getId());
                     //设置旧ID
                     //设置旧ID
-                    if(StringUtils.isNotEmpty(node.getOldId())){
+                    if (StringUtils.isNotEmpty(node.getOldId())) {
                         newData.setOldId(node.getOldId().toString());
                         newData.setOldId(node.getOldId().toString());
-                    }else{
+                    } else {
                         newData.setOldId(node.getId().toString());
                         newData.setOldId(node.getId().toString());
                     }
                     }
 
 

+ 60 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -9,6 +9,8 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.entity.ConstructionLedger;
+import org.springblade.business.entity.Task;
+import org.springblade.business.feign.TaskClient;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.vo.NeiYeLedgerVO;
 import org.springblade.business.vo.NeiYeLedgerVO;
@@ -42,6 +44,8 @@ public class NeiYeController {
 
 
     private final ContractClient contractClient;
     private final ContractClient contractClient;
 
 
+    private final TaskClient taskClient;
+
     /**
     /**
      * 获取内业台账列表
      * 获取内业台账列表
      * @return 内业台账列表
      * @return 内业台账列表
@@ -85,7 +89,20 @@ public class NeiYeController {
             if (queryDataResult != null && queryDataResult.size() > 0) {
             if (queryDataResult != null && queryDataResult.size() > 0) {
                 //删除掉首件
                 //删除掉首件
                 queryDataResult.removeIf(query -> StringUtils.isNotEmpty(query.getQueryType()) && "3".equals(query.getQueryType()));
                 queryDataResult.removeIf(query -> StringUtils.isNotEmpty(query.getQueryType()) && "3".equals(query.getQueryType()));
-
+                //过滤Evaluate
+                queryDataResult.stream().forEach(qdr->{
+                    if ("2".equals(qdr.getStatus()+"")){
+                        qdr.setEvaluate("true");
+                    }
+                });
+                String isEvaluate = String.valueOf(queryVO.getIsEvaluate());
+                if (!"".equals(isEvaluate) && !"null".equals(isEvaluate) && isEvaluate != null) {
+                        queryDataResult = queryDataResult.stream()
+                                .filter(qdr->isEvaluate.equals(qdr.getEvaluate())).collect(Collectors.toList());
+                }
+                if (queryDataResult.size() <= 0){
+                    return R.data(300, null, "未查询到数据");
+                }
                 //分组
                 //分组
                 List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
                 List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
                 List<QueryProcessDataVO> groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
                 List<QueryProcessDataVO> groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
@@ -120,6 +137,46 @@ public class NeiYeController {
                         }
                         }
                     }
                     }
                     //todo 当前缺少是否关联评定、是否关联试验 =================================
                     //todo 当前缺少是否关联评定、是否关联试验 =================================
+                    //过滤输入框条件
+                String queryStr = queryVO.getQueryStr();
+                if (!"".equals(queryStr) && !"null".equals(queryStr) && queryStr != null){
+                    if (!map.get("unitProject").toUpperCase().contains(queryStr.toUpperCase())){
+                        continue;
+                    }
+                }
+                    //审批状态
+                    String taskStatus = queryVO.getTaskStatus();
+                    if (!"".equals(taskStatus) && !"null".equals(taskStatus) && taskStatus != null) {
+                        String status = Integer.parseInt(taskStatus) - 1 + "";
+                        if (vo.getStatus() == null){
+                            vo.setStatus(0);
+                        }
+                        if (!status.equals(vo.getStatus()+"")){
+                            continue;
+                        }
+                    }
+                    //上报批次
+                    if (vo.getInformationQueryId() != null){
+                        List<Task> tasks = taskClient.queryTaskListByFormDataId(vo.getInformationQueryId());
+                        Task task;
+                        if (tasks == null || tasks.size() <= 0){
+                            task = new Task();
+                            task.setBatch(-1);
+                        }else {
+                            tasks = tasks.stream().sorted(Comparator.comparing(e -> e.getCreateTime())).collect(Collectors.toList());
+                            task = tasks.get(tasks.size() - 1);
+                        }
+                        map.put("reportNumber",task.getBatch()+"");
+                        String reportNumber = queryVO.getReportNumber();
+                        if (!"".equals(reportNumber) && !"null".equals(reportNumber) && reportNumber != null) {
+                            int anInt = Integer.parseInt(reportNumber);
+                            if (task.getBatch() != anInt){
+                                continue;
+                            }
+                        }
+                    }else {
+                        map.put("reportNumber","-1");
+                    }
                     //新增列表数据
                     //新增列表数据
                     neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
                     neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
                             map.get("partProject"),
                             map.get("partProject"),
@@ -131,7 +188,8 @@ public class NeiYeController {
                             map.get("detectionStartToEndTime"),
                             map.get("detectionStartToEndTime"),
                             new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
                             new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
                             vo.getEvaluate(),
                             vo.getEvaluate(),
-                            "false"));
+                            "false",
+                            map.get("reportNumber")));
                 }
                 }
                 //转换为page信息
                 //转换为page信息
                 Query query = new Query();
                 Query query = new Query();

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

@@ -120,7 +120,9 @@ public class OperationLogController extends BladeController {
 	@ApiOperationSupport(order = 1)
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "分页")
 	@ApiOperation(value = "分页")
 	public R<IPage<OperationLogVO>> list(OperationLogVO operationLog, Query query) {
 	public R<IPage<OperationLogVO>> list(OperationLogVO operationLog, Query query) {
-
+		if ("".equals(operationLog.getOperationMedium())){
+			operationLog.setOperationMedium(null);
+		}
 		operationLog.setCreateUser(AuthUtil.getUserId());
 		operationLog.setCreateUser(AuthUtil.getUserId());
 		QueryWrapper<OperationLog> wrapper = Condition.getQueryWrapper(operationLog);
 		QueryWrapper<OperationLog> wrapper = Condition.getQueryWrapper(operationLog);
 		if(StringUtils.isNotEmpty(operationLog.getStartTime()) && StringUtils.isNotEmpty(operationLog.getEndTime())){
 		if(StringUtils.isNotEmpty(operationLog.getStartTime()) && StringUtils.isNotEmpty(operationLog.getEndTime())){

+ 15 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/RecycleBinController.java

@@ -1,6 +1,8 @@
 package org.springblade.business.controller;
 package org.springblade.business.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -25,10 +27,7 @@ import org.springblade.business.entity.RecycleBin;
 import org.springblade.business.service.IRecycleBinService;
 import org.springblade.business.service.IRecycleBinService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
 
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -60,7 +59,8 @@ public class RecycleBinController extends BladeController {
 	public R<Boolean> regain(@RequestBody RecycleBinVO vo){
 	public R<Boolean> regain(@RequestBody RecycleBinVO vo){
 		if(vo.getRegainIds() != null && vo.getRegainIds().size() > 0){
 		if(vo.getRegainIds() != null && vo.getRegainIds().size() > 0){
 			//获取数据
 			//获取数据
-			List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().in(RecycleBin::getId, vo.getRegainIds()));
+			List<Long> longs = vo.getRegainIds().stream().map(i -> i.getId()).collect(Collectors.toList());
+			List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().in(RecycleBin::getId, longs));
 			//恢复数据成功后删除回收站对应记录
 			//恢复数据成功后删除回收站对应记录
 			List<String> recycleBinIds = new ArrayList<>();
 			List<String> recycleBinIds = new ArrayList<>();
 			//划分数据类型
 			//划分数据类型
@@ -90,9 +90,17 @@ public class RecycleBinController extends BladeController {
 					if(fileList.size() > 0){
 					if(fileList.size() > 0){
 						//文件数据包括工程文件及影像资料,这里采用最简单粗暴的方法进行恢复
 						//文件数据包括工程文件及影像资料,这里采用最简单粗暴的方法进行恢复
 						//恢复工程文件数据
 						//恢复工程文件数据
-						regainFile = this.archiveFileService.update(Wrappers.<ArchiveFile>lambdaUpdate().set(ArchiveFile::getIsDeleted, 0).in(ArchiveFile::getId, fileList));
+						//regainFile = this.archiveFileService.update(Wrappers.<ArchiveFile>lambdaUpdate().set(ArchiveFile::getIsDeleted, 0).in(ArchiveFile::getId, fileList));
+						List<ArchiveFile> archiveFiles = this.archiveFileService.getDeleteDataByIds(fileList);
+						if (archiveFiles != null && archiveFiles.size() >0) {
+							regainFile = this.archiveFileService.recoveryByIds(fileList);
+						}
 						//恢复影像资料数据
 						//恢复影像资料数据
-						regainFile = this.imageClassificationFileService.update(Wrappers.<ImageClassificationFile>lambdaUpdate().set(ImageClassificationFile::getIsDeleted, 0).in(ImageClassificationFile::getId, fileList));
+						List<ImageClassificationFile> list = this.imageClassificationFileService.getDeleteDataByIds(fileList);
+						if (list != null && list.size() >0) {
+							//regainFile = this.imageClassificationFileService.update(Wrappers.<ImageClassificationFile>lambdaUpdate().set(ImageClassificationFile::getIsDeleted, 0).in(ImageClassificationFile::getId, fileList));
+							regainFile = this.imageClassificationFileService.recoveryByIds(fileList);
+						}
 					}
 					}
 				}catch (Exception e){
 				}catch (Exception e){
 					e.printStackTrace();
 					e.printStackTrace();

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

@@ -76,8 +76,11 @@ public class TaskController extends BladeController {
 	private final ITaskService iTaskService;
 	private final ITaskService iTaskService;
 
 
 	private final WebSocket webSocket;
 	private final WebSocket webSocket;
+
 	private final CommonFileClient commonFileClient;
 	private final CommonFileClient commonFileClient;
 
 
+	private final ITrialSelfInspectionRecordService iTrialSelfInspectionRecordService;
+
 	/**
 	/**
 	 * 记录短信验证码超时时间
 	 * 记录短信验证码超时时间
 	 */
 	 */
@@ -282,6 +285,11 @@ public class TaskController extends BladeController {
 
 
 				taskApprovalVOS.add(approvalVO);
 				taskApprovalVOS.add(approvalVO);
 			}
 			}
+
+			//修改试验填报状态
+			this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(taskApprovalVOS);
+
+			//审批
 			this.taskService.batchCompleteApprovalTask(taskApprovalVOS,AuthUtil.getUserId());
 			this.taskService.batchCompleteApprovalTask(taskApprovalVOS,AuthUtil.getUserId());
 
 
 			//通过WebSocket推送数量条数
 			//通过WebSocket推送数量条数

+ 22 - 8
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -95,9 +95,9 @@ public class TrialDetectionController extends BladeController {
 
 
     @GetMapping("/sample/list-info")
     @GetMapping("/sample/list-info")
     @ApiOperationSupport(order = 7)
     @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "查询关联样品信息列表", notes = "传入节点id")
-    public R<List<TrialSampleInfoVO3>> sampleListInfo(Long nodeId) {
-        return R.data(iTrialSampleInfoService.sampleListInfo(nodeId));
+    @ApiOperation(value = "查询关联样品信息列表", notes = "传入节点id、当前记录id")
+    public R<List<TrialSampleInfoVO3>> sampleListInfo(Long nodeId, Long id) {
+        return R.data(iTrialSampleInfoService.sampleListInfo(nodeId, id));
     }
     }
 
 
     @GetMapping("/self/sample-list")
     @GetMapping("/self/sample-list")
@@ -125,7 +125,7 @@ public class TrialDetectionController extends BladeController {
     @ApiOperationSupport(order = 11)
     @ApiOperationSupport(order = 11)
     @ApiOperation(value = "自检记录新增或修改", notes = "传入TrialSelfInspectionRecordDTO")
     @ApiOperation(value = "自检记录新增或修改", notes = "传入TrialSelfInspectionRecordDTO")
     public R<Object> selfSubmit(@Valid @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception {
     public R<Object> selfSubmit(@Valid @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception {
-        return R.status(iTrialSelfInspectionRecordService.selfSubmit(dto));
+        return R.data(iTrialSelfInspectionRecordService.selfSubmit(dto));
     }
     }
 
 
     @PostMapping("/self/copy")
     @PostMapping("/self/copy")
@@ -203,13 +203,13 @@ public class TrialDetectionController extends BladeController {
 
 
     @GetMapping("/self/raw-material/list")
     @GetMapping("/self/raw-material/list")
     @ApiOperationSupport(order = 20)
     @ApiOperationSupport(order = 20)
-    @ApiOperation(value = "获取原材料节点下的记录信息", notes = "传入节点nodeId、合同段contractId")
-    public R<List<TrialSelfInspectionRecordVO2>> getRawMaterialInfo(@RequestParam String nodeId, @RequestParam String contractId) {
-        List<TrialSelfInspectionRecordVO2> recordVO2s = iTrialSelfInspectionRecordService.getRawMaterialInfo(nodeId, contractId);
+    @ApiOperation(value = "获取原材料节点下的记录信息", notes = "传入节点nodeId、合同段contractId、当前试验记录id")
+    public R<List<TrialSelfInspectionRecordVO2>> getRawMaterialInfo(@RequestParam String nodeId, @RequestParam String contractId, @RequestParam String id) {
+        List<TrialSelfInspectionRecordVO2> recordVO2s = iTrialSelfInspectionRecordService.getRawMaterialInfo(nodeId, contractId, id);
         return R.data(recordVO2s);
         return R.data(recordVO2s);
     }
     }
 
 
-    @PostMapping("/self/raw-material/submit-relation")
+    @PostMapping("/self/raw-material/submit")
     @ApiOperationSupport(order = 21)
     @ApiOperationSupport(order = 21)
     @ApiOperation(value = "关联原材检测报告保存或修改", notes = "传入RawMaterialSubmitRelationDTO")
     @ApiOperation(value = "关联原材检测报告保存或修改", notes = "传入RawMaterialSubmitRelationDTO")
     public R<Object> rawMaterialSubmitRelation(@RequestBody RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
     public R<Object> rawMaterialSubmitRelation(@RequestBody RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
@@ -264,4 +264,18 @@ public class TrialDetectionController extends BladeController {
         return R.fail(200, "未查询到数据");
         return R.fail(200, "未查询到数据");
     }
     }
 
 
+    @PostMapping("/self/project-position/submit")
+    @ApiOperationSupport(order = 26)
+    @ApiOperation(value = "自检记录关联工程部位信息保存", notes = "传入SelfProjectPositionSubmitDTO")
+    public R<Object> recordProjectPosition(@Valid @RequestBody SelfProjectPositionSubmitDTO dto) throws FileNotFoundException {
+        return R.status(iTrialSelfInspectionRecordService.recordProjectPosition(dto));
+    }
+
+    @PostMapping("/self/record-sample/submit")
+    @ApiOperationSupport(order = 27)
+    @ApiOperation(value = "自检记录关联取样信息保存", notes = "传入RecordSampleSubmitDTO")
+    public R<Object> recordSampleSubmit(@Valid @RequestBody RecordSampleSubmitDTO dto) {
+        return R.status(iTrialSelfInspectionRecordService.recordSampleSubmit(dto));
+    }
+
 }
 }

+ 9 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.service.impl.WeatherInfoServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -40,6 +41,14 @@ public class WeatherController {
 
 
     private final ProjectContractAreaClient projectContractAreaClient;
     private final ProjectContractAreaClient projectContractAreaClient;
 
 
+
+    private final WeatherInfoServiceImpl weatherInfoServiceImpl;
+    //测试定时
+    @GetMapping("/testTask")
+    public void testTask(){
+        weatherInfoServiceImpl.syncHistoryWeatherInfo();
+    }
+
     /**
     /**
      * 单个或批量删除天气台账
      * 单个或批量删除天气台账
      * @param ids 数据id集合
      * @param ids 数据id集合

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

@@ -46,10 +46,10 @@ public class InformationQueryClientImpl implements InformationQueryClient {
     }
     }
 
 
     @Override
     @Override
-    public void saveData(String nodeId, String projectId, String contractId, String classify, String link,String trialProjectName) {
+    public void saveData(String id, String projectId, String contractId, String classify, String link,String trialProjectName) {
         InformationQuery obj = new InformationQuery();
         InformationQuery obj = new InformationQuery();
         obj.setId(SnowFlakeUtil.getId());
         obj.setId(SnowFlakeUtil.getId());
-        obj.setWbsId(Long.valueOf(nodeId));
+        obj.setWbsId(Long.valueOf(id));
         obj.setProjectId(Long.valueOf(projectId));
         obj.setProjectId(Long.valueOf(projectId));
         obj.setContractId(Long.valueOf(contractId));
         obj.setContractId(Long.valueOf(contractId));
         obj.setClassify(Integer.valueOf(classify));
         obj.setClassify(Integer.valueOf(classify));

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

@@ -38,4 +38,14 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 	 */
 	 */
 	List<ArchiveFile> selectArchiveFilePage(@Param("current") Integer current, @Param("size") Integer size, @Param("vo") ArchiveFileVO vo);
 	List<ArchiveFile> selectArchiveFilePage(@Param("current") Integer current, @Param("size") Integer size, @Param("vo") ArchiveFileVO vo);
 
 
+	/**
+	 * 恢复逻辑删除
+	 */
+	Boolean recoveryByIds(@Param("ids") List<String> ids);
+
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	List<ArchiveFile> getDeleteDataByIds(@Param("ids")List<String> ids);
+
 }
 }

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

@@ -32,6 +32,13 @@
         <result column="cite_change_number" property="citeChangeNumber"/>
         <result column="cite_change_number" property="citeChangeNumber"/>
         <result column="e_visa_file" property="eVisaFile"/>
         <result column="e_visa_file" property="eVisaFile"/>
     </resultMap>
     </resultMap>
+    <update id="recoveryByIds">
+        update u_archive_file set is_deleted = 0 where
+        id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
 
 
     <select id="selectArchiveFileCount" resultMap="archiveFileResultMap">
     <select id="selectArchiveFileCount" resultMap="archiveFileResultMap">
         select count(id) from u_archive_file where is_deleted = 0
         select count(id) from u_archive_file where is_deleted = 0
@@ -97,5 +104,11 @@
         </if>
         </if>
         order by create_time DESC
         order by create_time DESC
     </select>
     </select>
+    <select id="getDeleteDataByIds" resultType="org.springblade.business.entity.ArchiveFile">
+        select * from u_archive_file where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
 </mapper>
 </mapper>

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java

@@ -16,6 +16,7 @@
  */
  */
 package org.springblade.business.mapper;
 package org.springblade.business.mapper;
 
 
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -60,4 +61,14 @@ public interface ImageClassificationFileMapper extends BaseMapper<ImageClassific
 	 */
 	 */
 	List<ImageClassificationFile> selectImageClassificationFilePage(@Param("current")long current, @Param("size")long size, @Param("param") ImageClassificationFileVO imageClassificationFile);
 	List<ImageClassificationFile> selectImageClassificationFilePage(@Param("current")long current, @Param("size")long size, @Param("param") ImageClassificationFileVO imageClassificationFile);
 
 
+	/**
+	 * 恢复逻辑删除
+	 */
+	Boolean recoveryByIds(@Param("ids")List<String> ids);
+
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	public List<ImageClassificationFile> getDeleteDataByIds(@Param("ids")List<String> ids);
+
 }
 }

+ 13 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -31,6 +31,13 @@
         <result column="pdf_url" property="pdfUrl"/>
         <result column="pdf_url" property="pdfUrl"/>
         <result column="marge_pdf_url" property="margePdfUrl"/>
         <result column="marge_pdf_url" property="margePdfUrl"/>
     </resultMap>
     </resultMap>
+    <update id="recoveryByIds">
+        update u_image_classification_file set is_deleted = 0 where
+        id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
 
 
     <select id="queryCurrentContractImageFileType" resultType="java.lang.Integer">
     <select id="queryCurrentContractImageFileType" resultType="java.lang.Integer">
         select `type` from u_image_classification_file where contract_id = #{contractId} and is_deleted = 0
         select `type` from u_image_classification_file where contract_id = #{contractId} and is_deleted = 0
@@ -105,5 +112,11 @@
             and files.shootingTimeStr like concat('%',#{param.queryDate},'%')
             and files.shootingTimeStr like concat('%',#{param.queryDate},'%')
         </if>
         </if>
     </select>
     </select>
+    <select id="getDeleteDataByIds" resultType="org.springblade.business.entity.ImageClassificationFile">
+        select * from u_image_classification_file where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
 </mapper>
 </mapper>

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

@@ -7,6 +7,6 @@ import java.util.List;
 
 
 public interface TrialSampleInfoMapper extends BaseMapper<TrialSampleInfo> {
 public interface TrialSampleInfoMapper extends BaseMapper<TrialSampleInfo> {
 
 
-    List<Long> selectTrialSelfSample();
+    List<Long> selectTrialSelfSample(Long id);
 
 
 }
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml

@@ -33,7 +33,7 @@
     </resultMap>
     </resultMap>
 
 
     <select id="selectTrialSelfSample" resultType="java.lang.Long">
     <select id="selectTrialSelfSample" resultType="java.lang.Long">
-        select sampling_id from u_trial_self_sample
+        select sampling_id from u_trial_self_sample where self_id = #{id}
     </select>
     </select>
 
 
 
 

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

@@ -21,6 +21,8 @@ import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 
+import java.util.List;
+
 /**
 /**
  *  服务类
  *  服务类
  *
  *
@@ -34,4 +36,16 @@ public interface IArchiveFileService extends BaseService<ArchiveFile> {
 	 */
 	 */
 	IPage<ArchiveFileVO> selectArchiveFilePage(ArchiveFileVO archiveFile);
 	IPage<ArchiveFileVO> selectArchiveFilePage(ArchiveFileVO archiveFile);
 
 
+	/**
+	 * 恢复删除
+	 */
+	Boolean recoveryByIds(List<String> ids);
+
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	List<ArchiveFile> getDeleteDataByIds(List<String> ids);
+
+
+
 }
 }

+ 10 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java

@@ -1,5 +1,6 @@
 package org.springblade.business.service;
 package org.springblade.business.service;
 
 
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.vo.TreeVo;
 import org.springblade.business.vo.TreeVo;
@@ -43,4 +44,13 @@ public interface IImageClassificationFileService extends BaseService<ImageClassi
 	 */
 	 */
 	IPage<ImageClassificationFileVO> selectImageClassificationFilePage(IPage<ImageClassificationFileVO> page, ImageClassificationFileVO imageClassificationFile);
 	IPage<ImageClassificationFileVO> selectImageClassificationFilePage(IPage<ImageClassificationFileVO> page, ImageClassificationFileVO imageClassificationFile);
 
 
+	/**
+	 * 恢复删除
+	 */
+	Boolean recoveryByIds(List<String> ids);
+
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	List<ImageClassificationFile> getDeleteDataByIds(List<String> ids);
 }
 }

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

@@ -63,7 +63,7 @@ public interface ITaskService extends BaseService<Task> {
     Boolean abolishTask(Task task);
     Boolean abolishTask(Task task);
 
 
     /**
     /**
-     * 获取待办任务数量
+     * 获取任务数量
      */
      */
     Map<String,String> getTaskCount(String projectId, String contractId, String userId);
     Map<String,String> getTaskCount(String projectId, String contractId, String userId);
 
 

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

@@ -30,6 +30,6 @@ public interface ITrialSampleInfoService extends BaseService<TrialSampleInfo> {
 
 
     List<TrialSampleInfoVO2> useDeviceList(Long nodeId);
     List<TrialSampleInfoVO2> useDeviceList(Long nodeId);
 
 
-    List<TrialSampleInfoVO3> sampleListInfo(Long nodeId);
+    List<TrialSampleInfoVO3> sampleListInfo(Long nodeId, Long id);
 
 
 }
 }

+ 10 - 7
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java

@@ -1,13 +1,11 @@
 package org.springblade.business.service;
 package org.springblade.business.service;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.business.dto.RawMaterialSubmitRelationDTO;
-import org.springblade.business.dto.TrialFileSubmitDTO;
-import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
-import org.springblade.business.dto.TrialSelfInspectionRecordPageDTO;
+import org.springblade.business.dto.*;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.vo.*;
 import org.springblade.business.vo.*;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseService;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
@@ -17,17 +15,17 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
 
     IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto);
     IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto);
 
 
-    boolean selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception;
+    String selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception;
 
 
     List<TrialSampleInfoVO> selfSampleList(String id);
     List<TrialSampleInfoVO> selfSampleList(String id);
 
 
     List<SampleAncillaryDocumentsVO> selfAncillaryDocumentsList(String id);
     List<SampleAncillaryDocumentsVO> selfAncillaryDocumentsList(String id);
 
 
-    boolean selfUpdateAncillaryDocuments( SampleAncillaryDocumentsVO vo);
+    boolean selfUpdateAncillaryDocuments(SampleAncillaryDocumentsVO vo);
 
 
     boolean selfCopy(List<Long> toLongList);
     boolean selfCopy(List<Long> toLongList);
 
 
-    List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId);
+    List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId, String id);
 
 
     boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException;
     boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException;
 
 
@@ -35,6 +33,7 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
 
     String selfPrintNullPdf(String ids) throws Exception;
     String selfPrintNullPdf(String ids) throws Exception;
 
 
+    @Async
     void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException;
     void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException;
 
 
     String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String projectId, String classify, String id, String tableType) throws Exception;
     String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String projectId, String classify, String id, String tableType) throws Exception;
@@ -43,4 +42,8 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
 
     boolean fileSubmit(TrialFileSubmitDTO dto) throws FileNotFoundException;
     boolean fileSubmit(TrialFileSubmitDTO dto) throws FileNotFoundException;
 
 
+    boolean recordProjectPosition(SelfProjectPositionSubmitDTO dto) throws FileNotFoundException;
+
+    boolean recordSampleSubmit(RecordSampleSubmitDTO dto);
+
 }
 }

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

@@ -70,4 +70,22 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 		return iPage.setRecords(pageVoList);
 		return iPage.setRecords(pageVoList);
 	}
 	}
 
 
+	/**
+	 * 恢复逻辑删除
+	 * @param ids
+	 * @return
+	 */
+	@Override
+	public Boolean recoveryByIds(List<String> ids) {
+		return baseMapper.recoveryByIds(ids);
+	}
+
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	@Override
+	public List<ArchiveFile> getDeleteDataByIds(List<String> ids) {
+		return baseMapper.getDeleteDataByIds(ids);
+	}
+
 }
 }

+ 18 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -20,6 +20,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.DateFormatUtils;
 import com.alibaba.nacos.common.utils.DateFormatUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.utils.YearTreeUtils;
 import org.springblade.business.utils.YearTreeUtils;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.vo.ImageClassificationFileVO;
@@ -102,4 +103,21 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 		return page;
 		return page;
 	}
 	}
 
 
+	/**
+	 * 恢复删除
+	 * @param ids
+	 * @return
+	 */
+	@Override
+	public Boolean recoveryByIds(List<String> ids) {
+		return baseMapper.recoveryByIds(ids);
+	}
+	/**
+	 * 根据ids查找已经删除的数据
+	 */
+	@Override
+	public List<ImageClassificationFile> getDeleteDataByIds(List<String> ids) {
+		return baseMapper.getDeleteDataByIds(ids);
+	}
+
 }
 }

+ 0 - 6
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -89,9 +89,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
 
     private final ITaskBatchService taskBatchService;
     private final ITaskBatchService taskBatchService;
 
 
-    private final ITrialSelfInspectionRecordService iTrialSelfInspectionRecordService;
-
-
     @Override
     @Override
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
         //返回结果
         //返回结果
@@ -378,9 +375,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatch.getId().toString());
             this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatch.getId().toString());
         }
         }
 
 
-        //修改试验填报状态
-        this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(taskApprovalVOS);
-
     }
     }
 
 
     private void checkIsExsitTaskBatch(List<TaskApprovalVO> taskApprovalVOS, String batchId) {
     private void checkIsExsitTaskBatch(List<TaskApprovalVO> taskApprovalVOS, String batchId) {

+ 15 - 13
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceUseServiceImpl.java

@@ -306,21 +306,23 @@ public class TrialDeviceUseServiceImpl extends BaseServiceImpl<TrialDeviceUseMap
     }
     }
 
 
     public void addDeviceUseInfo(TrialSelfInspectionRecordDTO dto) {
     public void addDeviceUseInfo(TrialSelfInspectionRecordDTO dto) {
-        //获取进场记录
-        List<TrialDeviceInfo> deviceInfos = trialDeviceInfoMapper.selectList(Wrappers.<TrialDeviceInfo>lambdaQuery().in(TrialDeviceInfo::getId, dto.getDeviceUseIds()));
-
-        //构造使用记录
-        List<TrialDeviceUse> list = new ArrayList<>();
-        for (TrialDeviceInfo deviceInfo : deviceInfos) {
-            TrialDeviceUse trialDeviceUses = BeanUtil.copyProperties(deviceInfo, TrialDeviceUse.class);
-            if (trialDeviceUses != null) {
-                trialDeviceUses.setNodeId(dto.getNodeId());
-                trialDeviceUses.setDeviceInfoId(deviceInfo.getId());
-                trialDeviceUses.setId(SnowFlakeUtil.getId());
-                list.add(trialDeviceUses);
+        if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(dto.getDeviceUseIds())) {
+            //获取进场记录
+            List<TrialDeviceInfo> deviceInfos = trialDeviceInfoMapper.selectList(Wrappers.<TrialDeviceInfo>lambdaQuery().in(TrialDeviceInfo::getId, dto.getDeviceUseIds()));
+
+            //构造使用记录
+            List<TrialDeviceUse> list = new ArrayList<>();
+            for (TrialDeviceInfo deviceInfo : deviceInfos) {
+                TrialDeviceUse trialDeviceUses = BeanUtil.copyProperties(deviceInfo, TrialDeviceUse.class);
+                if (trialDeviceUses != null) {
+                    trialDeviceUses.setNodeId(dto.getNodeId());
+                    trialDeviceUses.setDeviceInfoId(deviceInfo.getId());
+                    trialDeviceUses.setId(SnowFlakeUtil.getId());
+                    list.add(trialDeviceUses);
+                }
             }
             }
+            this.saveBatch(list, 1000);
         }
         }
-        this.saveBatch(list, 1000);
     }
     }
 
 
 }
 }

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

@@ -82,7 +82,7 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
     }
     }
 
 
     @Override
     @Override
-    public List<TrialSampleInfoVO3> sampleListInfo(Long nodeId) {
+    public List<TrialSampleInfoVO3> sampleListInfo(Long nodeId, Long id) {
         List<TrialSampleInfo> trialSampleInfos = baseMapper.selectList(Wrappers.<TrialSampleInfo>query().lambda().eq(TrialSampleInfo::getNodeId, nodeId));
         List<TrialSampleInfo> trialSampleInfos = baseMapper.selectList(Wrappers.<TrialSampleInfo>query().lambda().eq(TrialSampleInfo::getNodeId, nodeId));
         List<User> users = iUserClient.selectUserAll();
         List<User> users = iUserClient.selectUserAll();
         List<TrialSampleInfoVO3> list = new ArrayList<>();
         List<TrialSampleInfoVO3> list = new ArrayList<>();
@@ -96,10 +96,10 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
                 }
                 }
             }
             }
         }
         }
-        List<Long> ids = baseMapper.selectTrialSelfSample();
+        List<Long> ids = baseMapper.selectTrialSelfSample(id);
         for (TrialSampleInfoVO3 trialSampleInfoVO3 : list) {
         for (TrialSampleInfoVO3 trialSampleInfoVO3 : list) {
-            for (Long id : ids) {
-                if (trialSampleInfoVO3.getId().equals(id)) {
+            for (Long sid : ids) {
+                if (trialSampleInfoVO3.getId().equals(sid)) {
                     trialSampleInfoVO3.setIsRelation(1);
                     trialSampleInfoVO3.setIsRelation(1);
                 }
                 }
             }
             }

+ 300 - 183
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -10,11 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.spire.xls.*;
 import com.spire.xls.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.time.DateUtils;
 import org.apache.commons.lang.time.DateUtils;
-import org.apache.poi.hssf.record.DVALRecord;
-import org.springblade.business.dto.RawMaterialSubmitRelationDTO;
-import org.springblade.business.dto.TrialFileSubmitDTO;
-import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
-import org.springblade.business.dto.TrialSelfInspectionRecordPageDTO;
+import org.springblade.business.dto.*;
 import org.springblade.business.entity.*;
 import org.springblade.business.entity.*;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.mapper.TrialMaterialMobilizationMapper;
 import org.springblade.business.mapper.TrialMaterialMobilizationMapper;
@@ -126,8 +122,14 @@ public class TrialSelfInspectionRecordServiceImpl
                     record.setProjectPositionName(name);
                     record.setProjectPositionName(name);
                 }
                 }
             }
             }
-        }
 
 
+            //关联取样ids
+            String sql = "select sampling_id from u_trial_self_sample where self_id = " + record.getId();
+            List<Long> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfSample.class)).stream().map(TrialSelfSample::getSamplingId).collect(Collectors.toList());
+            if (query.size() > 0) {
+                record.setSampleIds(org.apache.commons.lang.StringUtils.join(query, ","));
+            }
+        }
         return trialSelfInspectionRecordVOIPage.setRecords(records);
         return trialSelfInspectionRecordVOIPage.setRecords(records);
     }
     }
 
 
@@ -212,103 +214,196 @@ public class TrialSelfInspectionRecordServiceImpl
     }
     }
 
 
     @Override
     @Override
-    public List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId) {
-        List<TrialSelfInspectionRecord> result = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().eq(TrialSelfInspectionRecord::getNodeId, nodeId).eq(TrialSelfInspectionRecord::getContractId, contractId).eq(TrialSelfInspectionRecord::getStatus, 1));
-        List<TrialSelfInspectionRecordVO2> recordVO2s = BeanUtil.copyProperties(result, TrialSelfInspectionRecordVO2.class);
-        List<Long> collect = result.stream().map(TrialSelfInspectionRecord::getId).collect(Collectors.toList());
-        String ids = org.apache.commons.lang.StringUtils.join(collect, ",");
-        String sql = "select raw_material_record_id from u_trial_raw_material_self_record where self_record_id in(" + ids + ")";
-        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
-        List<Object> idsRecord = new ArrayList<>();
-        for (Map<String, Object> map : maps) {
-            for (Map.Entry<String, Object> obj : map.entrySet()) {
-                idsRecord.add(obj.getValue());
+    public List<TrialSelfInspectionRecordVO2> getRawMaterialInfo(String nodeId, String contractId, String id) {
+        List<TrialSelfInspectionRecordVO2> recordVO2s;
+        //编辑
+        if (StringUtils.isNotEmpty(id)) {
+            //获取nodeId节点下的记录信息(排除当前id记录)
+            List<TrialSelfInspectionRecord> result = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                    .eq(TrialSelfInspectionRecord::getNodeId, nodeId)
+                    .eq(TrialSelfInspectionRecord::getContractId, contractId)
+                    .ne(TrialSelfInspectionRecord::getId, id)
+                    .eq(TrialSelfInspectionRecord::getStatus, 1));
+
+            recordVO2s = BeanUtil.copyProperties(result, TrialSelfInspectionRecordVO2.class);
+
+            if (recordVO2s.size() > 0) {
+                //获取当前记录所关联的记录raw_material_record_id
+                String sql = "select raw_material_record_id from u_trial_raw_material_self_record where self_record_id = " + id;
+                List<TrialRawMaterialSelfRecord> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class));
+
+                //是否关联过
+                for (TrialRawMaterialSelfRecord record : list) {
+                    for (TrialSelfInspectionRecordVO2 recordVO2 : recordVO2s) {
+                        if (record.getRawMaterialRecordId().equals(recordVO2.getId())) {
+                            recordVO2.setIsRawMaterialRelation(1);
+                        }
+                    }
+                }
             }
             }
+
+        } else {
+            //新增
+            List<TrialSelfInspectionRecord> result = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                    .eq(TrialSelfInspectionRecord::getNodeId, nodeId)
+                    .eq(TrialSelfInspectionRecord::getContractId, contractId)
+                    .eq(TrialSelfInspectionRecord::getStatus, 1));
+
+            recordVO2s = BeanUtil.copyProperties(result, TrialSelfInspectionRecordVO2.class);
         }
         }
-        for (Object id : idsRecord) {
+
+        //工程部位信息
+        if (recordVO2s.size() > 0) {
             for (TrialSelfInspectionRecordVO2 recordVO2 : recordVO2s) {
             for (TrialSelfInspectionRecordVO2 recordVO2 : recordVO2s) {
-                if (id.equals(recordVO2.getId())) {
-                    recordVO2.setIsRawMaterialRelation(1);
+                if (StringUtils.isNotEmpty(recordVO2.getProjectPosition())) {
+                    List<String> idsP = Func.toStrList(recordVO2.getProjectPosition()); //关联的工程部位ids
+                    List<WbsTreeContract> resultNode = baseMapper.selectWbsTreeContractListByPKeyIds(idsP); //查询工程部位节点名称信息
+                    List<String> projectPositionNames = resultNode.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
+                    String name = projectPositionNames.stream().findAny().orElse(null);
+                    if (projectPositionNames.size() >= 2) {
+                        recordVO2.setProjectPositionName(name + "等" + projectPositionNames.size() + "个工程部位信息");
+                    } else {
+                        recordVO2.setProjectPositionName(name);
+                    }
                 }
                 }
             }
             }
         }
         }
+
         return recordVO2s;
         return recordVO2s;
     }
     }
 
 
     @Override
     @Override
     public boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
     public boolean rawMaterialSubmitRelation(RawMaterialSubmitRelationDTO dto) throws FileNotFoundException {
         if (ObjectUtil.isEmpty(dto.getId())) {
         if (ObjectUtil.isEmpty(dto.getId())) {
-            throw new ServiceException("请先保存填报数据后再关联原材检测报告!");
-        }
-        //删除关系
-        String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
-        jdbcTemplate.execute(sql1);
-
-        List<String> strings = Func.toStrList(dto.getIds());
-        //新增关系
-        for (String s : strings) {
-            String sql2 = "insert into u_trial_raw_material_self_record(id,self_record_id,raw_material_record_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + s + ")";
-            jdbcTemplate.execute(sql2);
-        }
-
-        //获取ids、id下的PDF
-        List<String> ids = new ArrayList<>(strings);
-        ids.add(dto.getId());
-        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, ids).eq(TrialSelfInspectionRecord::getStatus, 1));
-        List<String> listPDFURL = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
-
-        //合并PDF
-        String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String listPdf = filePath + "/pdf/" + dto.getNodeId() + ".pdf";
-        File tabPDF = ResourceUtil.getFile(listPdf);
-        if (tabPDF.exists()) {
-            tabPDF.delete();
-        }
-        FileUtils.mergePdfPublicMethods(listPDFURL, listPdf);
-        BladeFile bladeFile = this.newIOSSClient.uploadFile(dto.getNodeId() + ".pdf", listPdf);
-
-        //获取试验记录id的试验项目名称
-        List<String> collect = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getTrialProjectName).collect(Collectors.toList());
-        String oneName = collect.stream().findAny().orElse(null);
-        String trialProjectName = "";
-        if (StringUtils.isNotEmpty(oneName)) {
-            trialProjectName = oneName + "等" + collect.size() + "个文件";
-        }
-
-        if (ObjectUtil.isNotEmpty(bladeFile)) {
-            //修改pdfURL
-            String querySql = "select * from u_information_query where classify='" + dto.getType() + "' and wbs_id='" + dto.getNodeId() + "' and contract_id ='" + dto.getContractId() + "'";
-            List<Map<String, Object>> resultSQL = jdbcTemplate.queryForList(querySql);
-            if (resultSQL.size() > 0) {
-                String sql3 = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name = '" + trialProjectName + "' where classify= '" + dto.getType() + "' and wbs_id='" + dto.getNodeId() + "' and contract_id ='" + dto.getContractId() + "'";
-                jdbcTemplate.execute(sql3);
+            throw new ServiceException("请先保存填报数据后,再关联原材检测报告信息");
+        } else {
+            TrialSelfInspectionRecord objMain = this.getBaseMapper().selectById(dto.getId());
+            if (ObjectUtil.isNotEmpty(objMain) && (("已审批").equals(objMain.getTaskStatus()) || ("待审批").equals(objMain.getTaskStatus()))) {
+                throw new ServiceException("当前填报数据已上报,无法进行关联操作");
+            }
+            if (StringUtils.isNotEmpty(dto.getIds())) { //新增关系,合并pdf
+                List<String> idsList = Func.toStrList(dto.getIds());
+                //获取ids、id下的pdfUrl
+                List<String> ids = new ArrayList<>();
+                ids.add(dto.getId());
+                ids.addAll(idsList);
+                List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, ids).eq(TrialSelfInspectionRecord::getStatus, 1));
+                TrialSelfInspectionRecord oldObj = recordList.stream().filter(f -> f.getId().equals(Long.parseLong(dto.getId()))).findAny().orElse(null);
+                List<TrialSelfInspectionRecord> oldOther = recordList.stream().filter(f -> !f.getId().equals(Long.parseLong(dto.getId()))).collect(Collectors.toList());
+
+                //获取原始pdfUrl
+                String sql = "select * from u_trial_raw_material_self_record where self_record_id =" + dto.getId();
+                TrialRawMaterialSelfRecord recordOld = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
+                if (recordOld != null) {
+                    assert oldObj != null;
+                    oldObj.setPdfUrl(recordOld.getOldPdfUrl());
+                }
+
+                //当前记录pdfUrl置顶
+                List<TrialSelfInspectionRecord> recordList2 = new ArrayList<>();
+                recordList2.add(oldObj);
+                recordList2.addAll(oldOther);
+                List<String> listPdfUrl = recordList2.stream().map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
+
+                if (listPdfUrl.size() > 0) {
+                    //合并PDF
+                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                    String listPdf = filePath + "/pdf/" + dto.getNodeId() + ".pdf";
+                    File tabPDF = ResourceUtil.getFile(listPdf);
+                    if (tabPDF.exists()) {
+                        tabPDF.delete();
+                    }
+                    FileUtils.mergePdfPublicMethods(listPdfUrl, listPdf);
+                    BladeFile bladeFile = this.newIOSSClient.uploadFile(dto.getNodeId() + ".pdf", listPdf);
+
+                    //获取试验记录id的试验项目名称
+                    List<String> collect = recordList.stream().map(TrialSelfInspectionRecord::getTrialProjectName).collect(Collectors.toList());
+                    String name = collect.stream().findAny().orElse(null);
+                    String trialProjectName;
+                    if (collect.size() > 1) {
+                        trialProjectName = name + "等" + collect.size() + "个文件";
+                    } else {
+                        trialProjectName = name;
+                    }
+
+                    //删除当前记录关系信息
+                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
+                    jdbcTemplate.execute(sql1);
+                    //新增当前记录关系信息
+                    for (String s : idsList) {
+                        assert oldObj != null;
+                        String sql2 = "insert into u_trial_raw_material_self_record(id,self_record_id,raw_material_record_id,old_pdf_url) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + s + ",'" + oldObj.getPdfUrl() + "')";
+                        jdbcTemplate.execute(sql2);
+                    }
+
+                    if (ObjectUtil.isNotEmpty(bladeFile)) {
+                        //修改pdfURL
+                        String querySql = "select * from u_information_query where classify='" + dto.getType() + "' and wbs_id='" + dto.getId() + "' and contract_id ='" + dto.getContractId() + "'";
+                        List<Map<String, Object>> resultSQL = jdbcTemplate.queryForList(querySql);
+                        if (resultSQL.size() > 0) {
+                            String sql3 = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name = '" + trialProjectName + "' where classify= '" + dto.getType() + "' and wbs_id='" + dto.getId() + "' and contract_id ='" + dto.getContractId() + "'";
+                            jdbcTemplate.execute(sql3);
+                        } else {
+                            informationQueryClient.saveData(dto.getId(), dto.getProjectId(), dto.getContractId(), String.valueOf(dto.getType()), bladeFile.getLink(), trialProjectName);
+                        }
+
+                        //修改当前记录pdfUrl
+                        this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, bladeFile.getLink()).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+
+                        return true;
+                    } else {
+                        //删除关系
+                        jdbcTemplate.execute(sql1);
+                        return false;
+                    }
+                }
             } else {
             } else {
-                informationQueryClient.saveData(dto.getNodeId(), dto.getProjectId(), dto.getContractId(), String.valueOf(dto.getType()), bladeFile.getLink(), trialProjectName);
+                //删除关系,恢复当前记录的原始pdfUrl
+                TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
+                String sql = "select * from u_trial_raw_material_self_record where self_record_id =" + dto.getId();
+                TrialRawMaterialSelfRecord record = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
+                if (record != null) {
+                    //修改pdfURL
+                    String querySql = "select * from u_information_query where classify='" + dto.getType() + "' and wbs_id='" + dto.getId() + "' and contract_id ='" + dto.getContractId() + "'";
+                    List<Map<String, Object>> resultSQL = jdbcTemplate.queryForList(querySql);
+                    if (resultSQL.size() > 0) {
+                        String sql3 = "update u_information_query set pdf_url ='" + record.getOldPdfUrl() + "', name = '" + obj.getTrialProjectName() + "' where classify= '" + dto.getType() + "' and wbs_id='" + dto.getId() + "' and contract_id ='" + dto.getContractId() + "'";
+                        jdbcTemplate.execute(sql3);
+                    } else {
+                        informationQueryClient.saveData(dto.getId(), dto.getProjectId(), dto.getContractId(), String.valueOf(dto.getType()), record.getOldPdfUrl(), obj.getTrialProjectName());
+                    }
+
+                    //修改当前记录pdfUrl
+                    this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, record.getOldPdfUrl()).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+
+                    //删除当前记录关系信息
+                    String sql1 = "delete from u_trial_raw_material_self_record where self_record_id ='" + dto.getId() + "'";
+                    jdbcTemplate.execute(sql1);
+                }
+                return true;
             }
             }
-            return true;
-        } else {
-            //删除关系
-            jdbcTemplate.execute(sql1);
-            return false;
         }
         }
+        return false;
     }
     }
 
 
     @Override
     @Override
     public String selfPrintPdf(String ids) throws FileNotFoundException {
     public String selfPrintPdf(String ids) throws FileNotFoundException {
         List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, Func.toLongList(ids)).eq(TrialSelfInspectionRecord::getStatus, 1));
         List<TrialSelfInspectionRecord> recordList = baseMapper.selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery().in(TrialSelfInspectionRecord::getId, Func.toLongList(ids)).eq(TrialSelfInspectionRecord::getStatus, 1));
         List<String> listPdfUrl = recordList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
         List<String> listPdfUrl = recordList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getPdfUrl())).map(TrialSelfInspectionRecord::getPdfUrl).collect(Collectors.toList());
-        //合并PDF
-        Long id = SnowFlakeUtil.getId();
-        String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String listPdf = filePath + "/pdf/" + id + ".pdf";
-        File tabPDF = ResourceUtil.getFile(listPdf);
-        if (tabPDF.exists()) {
-            tabPDF.delete();
-        }
-        FileUtils.mergePdfPublicMethods(listPdfUrl, listPdf);
-        BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
-        if (bladeFile != null) {
-            return bladeFile.getLink();
+        if (listPdfUrl.size() > 0) {
+            //合并PDF
+            Long id = SnowFlakeUtil.getId();
+            String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+            String listPdf = filePath + "/pdf/" + id + ".pdf";
+            File tabPDF = ResourceUtil.getFile(listPdf);
+            if (tabPDF.exists()) {
+                tabPDF.delete();
+            }
+            FileUtils.mergePdfPublicMethods(listPdfUrl, listPdf);
+            BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
+            if (bladeFile != null) {
+                return bladeFile.getLink();
+            }
         }
         }
         return null;
         return null;
     }
     }
@@ -354,50 +449,59 @@ public class TrialSelfInspectionRecordServiceImpl
     public void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException {
     public void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException {
         for (TaskApprovalVO taskApprovalVO : obj) {
         for (TaskApprovalVO taskApprovalVO : obj) {
             if (ObjectUtil.isNotEmpty(taskApprovalVO.getParallelProcessInstanceId())) {
             if (ObjectUtil.isNotEmpty(taskApprovalVO.getParallelProcessInstanceId())) {
-                String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskApprovalVO.getParallelProcessInstanceId());
-                if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
-                    LambdaUpdateWrapper<TrialSelfInspectionRecord> updateWrapper = new LambdaUpdateWrapper<>();
-                    updateWrapper.set(TrialSelfInspectionRecord::getTaskStatus, "OK".equals(taskApprovalVO.getFlag()) ? "已审批" : "已废除");
-                    updateWrapper.eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId);
-                    baseMapper.update(null, updateWrapper);
-
-                    TrialSelfInspectionRecord entity = updateWrapper.getEntity();
-
-                    //把当前试验的PDF合并关联到质检树节点下
-                    if (ObjectUtil.isNotEmpty(entity) && ("已审批").equals(entity.getTaskStatus())) {
-                        List<String> contractNodePKeyIds = baseMapper.selectQualityNodeId(trialSelfInspectionRecordId);
-
-                        for (String id : contractNodePKeyIds) {
-                            WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
-                            if (wbsTreeContract != null) {
-                                List<String> pdfUrlList = new ArrayList<>();
-                                String classify;
-                                if (wbsTreeContract.getTableOwner().contains("1") || wbsTreeContract.getTableOwner().contains("2") || wbsTreeContract.getTableOwner().contains("3")) {
-                                    classify = "1";
-                                } else {
-                                    classify = "2";
-                                }
-                                String pdfUrlAll = baseMapper.selectInformationQuery(id, wbsTreeContract.getContractId(), classify);
-                                //质检节点合并pdfUrl
-                                pdfUrlList.add(pdfUrlAll);
-                                //试验pdfUrl
-                                pdfUrlList.add(ObjectUtil.isNotEmpty(entity.getPdfUrl()) ? entity.getPdfUrl() : "");
-
-                                //合并PDF
-                                String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-                                String listPdf = filePath + "/pdf/" + id + ".pdf";
-                                File tabPDF = ResourceUtil.getFile(listPdf);
-                                if (tabPDF.exists()) {
-                                    tabPDF.delete();
+                String sql = "select process_instance_id from u_task_parallel where parallel_process_instance_id = '" + taskApprovalVO.getParallelProcessInstanceId() + "'";
+                TaskParallel taskParallel = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskParallel.class)).stream().findAny().orElse(null);
+                assert taskParallel != null;
+                if (ObjectUtil.isNotEmpty(taskParallel.getProcessInstanceId())) {
+                    String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskParallel.getProcessInstanceId());
+                    if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
+                        this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                                .set(TrialSelfInspectionRecord::getTaskStatus, "OK".equals(taskApprovalVO.getFlag()) ? "已审批" : "已废除")
+                                .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                        );
+
+                        /*TrialSelfInspectionRecord entity = this.baseMapper.selectById(trialSelfInspectionRecordId);
+                        //把当前试验的PDF合并关联到质检树节点下
+                        if (ObjectUtil.isNotEmpty(entity) && ("已审批").equals(entity.getTaskStatus())) {
+                            List<String> contractNodePKeyIds = baseMapper.selectQualityNodeId(trialSelfInspectionRecordId);
+
+                            for (String id : contractNodePKeyIds) {
+                                if (StringUtils.isEmpty(entity.getPdfUrl())) {
+                                    continue;
                                 }
                                 }
-                                FileUtils.mergePdfPublicMethods(pdfUrlList, listPdf);
-                                BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
-                                if (bladeFile != null) {
-                                    //修改质检合并pdfURL
-                                    baseMapper.updateInformationQuery(id, wbsTreeContract.getContractId(), classify, bladeFile.getLink());
+
+                                WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
+                                if (wbsTreeContract != null) {
+                                    List<String> pdfUrlList = new ArrayList<>();
+                                    String classify;
+                                    if (wbsTreeContract.getTableOwner().contains("1") || wbsTreeContract.getTableOwner().contains("2") || wbsTreeContract.getTableOwner().contains("3")) {
+                                        classify = "1";
+                                    } else {
+                                        classify = "2";
+                                    }
+                                    String pdfUrlAll = baseMapper.selectInformationQuery(id, wbsTreeContract.getContractId(), classify);
+                                    //质检节点合并pdfUrl
+                                    pdfUrlList.add(pdfUrlAll);
+                                    //试验pdfUrl
+                                    pdfUrlList.add(entity.getPdfUrl());
+
+                                    //合并PDF
+                                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                                    String listPdf = filePath + "/pdf/" + id + ".pdf";
+                                    File tabPDF = ResourceUtil.getFile(listPdf);
+                                    if (tabPDF.exists()) {
+                                        tabPDF.delete();
+                                    }
+                                    FileUtils.mergePdfPublicMethods(pdfUrlList, listPdf);
+                                    BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
+                                    if (bladeFile != null) {
+                                        //修改质检合并pdfURL
+                                        baseMapper.updateInformationQuery(trialSelfInspectionRecordId, wbsTreeContract.getContractId(), classify, bladeFile.getLink());
+                                    }
                                 }
                                 }
                             }
                             }
-                        }
+                        }*/
+
                     }
                     }
                 }
                 }
             }
             }
@@ -538,88 +642,91 @@ public class TrialSelfInspectionRecordServiceImpl
     }
     }
 
 
     @Override
     @Override
-    /*@Transactional(rollbackFor = Exception.class)*/
-    public boolean selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception {
+    public String selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception {
         if (ObjectUtil.isEmpty(dto.getId())) {
         if (ObjectUtil.isEmpty(dto.getId())) {
             //构建记录表编号、报告单编号
             //构建记录表编号、报告单编号
             this.buildNumber(dto);
             this.buildNumber(dto);
 
 
-            //任务流程状态初始化
-            dto.setTaskStatus("待审批");
-        }
+            //任务流程状态初始化未上报
+            dto.setTaskStatus("未上报");
 
 
-        JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
-        List<String> tableIds = new ArrayList<>();
-        for (int i = 0; i < dataArray.size(); i++) {
-            String pkeyId = dataArray.getJSONObject(i).getString("pkeyId");
-            tableIds.add(pkeyId);
+            //初始化tabIds
+            JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
+            List<String> tableIds = new ArrayList<>();
+            for (int i = 0; i < dataArray.size(); i++) {
+                String pkeyId = dataArray.getJSONObject(i).getString("pkeyId");
+                tableIds.add(pkeyId);
+            }
+            String join = org.apache.commons.lang.StringUtils.join(tableIds, ",");
+            dto.setTableIds(join);
         }
         }
-        String join = org.apache.commons.lang.StringUtils.join(tableIds, ",");
-        dto.setTableIds(join);
 
 
-        /*//只修改基础信息,未修改表信息
-        if (dataArray.size() == 0) {
-            return this.saveOrUpdate(dto);
-        }*/
+        this.saveOrUpdate(dto);
+
+        if (ObjectUtil.isNotEmpty(dto.getId())) {
+            //获取当前最新的试验记录信息
+            TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
 
 
-        //关联新增或修改了表信息
-        if (this.saveOrUpdate(dto)) {
             try {
             try {
                 //保存实体表数据、记录信息、生成pdf
                 //保存实体表数据、记录信息、生成pdf
-                String pdfURL = excelTabClient.saveTabData(dto.getIsBatchSave(), dto.getDataInfo(), dto.getType(), dto.getTableType(), dto.getId(), dto.getTableIds());
-                //返回合并pdfURL
+                assert obj != null;
+                String pdfURL = excelTabClient.saveTabData(dto.getIsBatchSave(), dto.getDataInfo(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
                 if (StringUtils.isNotEmpty(pdfURL)) {
                 if (StringUtils.isNotEmpty(pdfURL)) {
-                    LambdaUpdateWrapper<TrialSelfInspectionRecord> updateWrapper = new LambdaUpdateWrapper<>();
-                    updateWrapper.set(TrialSelfInspectionRecord::getPdfUrl, pdfURL);
-                    updateWrapper.eq(TrialSelfInspectionRecord::getId, dto.getId());
-                    this.update(null, updateWrapper);
+                    //修改合并pdf
+                    this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                            .set(TrialSelfInspectionRecord::getPdfUrl, pdfURL)
+                            .eq(TrialSelfInspectionRecord::getId, dto.getId()));
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
-                e.printStackTrace();
+                throw new ServiceException("保存实体表数据生成pdf时发生异常 " + e.getMessage());
             }
             }
-        }
-
-        if (ObjectUtil.isNotEmpty(dto.getId())) {
-            //关联样品信息
-            this.recordSample(dto);
 
 
-            //关联工程部位及用途信息
-            this.recordProjectPosition(dto);
-        }
-
-        if (StringUtils.isNotEmpty(dto.getDeviceUseIds())) {
             //新增设备使用记录信息
             //新增设备使用记录信息
-            trialDeviceUseService.addDeviceUseInfo(dto);
+            this.trialDeviceUseService.addDeviceUseInfo(dto);
         }
         }
 
 
-        return true;
+        return dto.getId().toString();
     }
     }
 
 
-    private void recordSample(TrialSelfInspectionRecordDTO dto) {
+    @Override
+    public boolean recordSampleSubmit(RecordSampleSubmitDTO dto) {
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            throw new ServiceException("请先保存填报数据后,再关联取样信息");
+        }
+        //删除关联信息
+        baseMapper.delSelfSample(dto.getId());
         if (StringUtils.isNotEmpty(dto.getSampleIds())) {
         if (StringUtils.isNotEmpty(dto.getSampleIds())) {
-            baseMapper.delSelfSample(dto.getId()); //删除关联信息
             List<String> ids = Func.toStrList(dto.getSampleIds());
             List<String> ids = Func.toStrList(dto.getSampleIds());
-            for (String id : ids) {  //新增关联信息
+            for (String id : ids) {
+                //新增关联信息
                 baseMapper.saveSelfSample(SnowFlakeUtil.getId(), dto.getId(), id);
                 baseMapper.saveSelfSample(SnowFlakeUtil.getId(), dto.getId(), id);
             }
             }
         }
         }
+        return true;
     }
     }
 
 
-    private void recordProjectPosition(TrialSelfInspectionRecordDTO dto) throws FileNotFoundException {
+    @Override
+    public boolean recordProjectPosition(SelfProjectPositionSubmitDTO dto) throws FileNotFoundException {
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            throw new ServiceException("请先保存填报数据后,再关联工程部位及用途信息");
+        }
+        //已审批记录关联
         if (StringUtils.isNotEmpty(dto.getProjectPosition())) {
         if (StringUtils.isNotEmpty(dto.getProjectPosition())) {
-            baseMapper.delSelfQuality(dto.getId()); //删除关联信息
-            List<String> ids = Func.toStrList(dto.getProjectPosition());
-            for (String id : ids) { //新增关联信息
-                baseMapper.saveSelfQuality(SnowFlakeUtil.getId(), dto.getId(), id);
-            }
+            TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
+            if (("已审批").equals(obj.getTaskStatus())) {
+                //删除关联信息
+                baseMapper.delSelfQuality(dto.getId());
+
+                List<String> ids = Func.toStrList(dto.getProjectPosition());
+                //新增关联信息
+                for (String id : ids) {
+                    baseMapper.saveSelfQuality(SnowFlakeUtil.getId(), dto.getId(), id);
+                }
 
 
-            //已审批填报记录
-            if (("已审批").equals(dto.getTaskStatus())) {
                 //把当前试验的PDF合并关联到质检树节点下
                 //把当前试验的PDF合并关联到质检树节点下
-                List<String> contractNodePKeyIds = baseMapper.selectQualityNodeId(String.valueOf(dto.getId()));
-
-                for (String id : contractNodePKeyIds) {
-                    WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
+                List<String> contractNodePKeyIds = baseMapper.selectQualityNodeId(String.valueOf(dto.getId())); //获取合同段质检树的节点PkeyId
+                for (String pKeyId : contractNodePKeyIds) {
+                    WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(pKeyId);
                     if (wbsTreeContract != null) {
                     if (wbsTreeContract != null) {
                         List<String> pdfUrlList = new ArrayList<>();
                         List<String> pdfUrlList = new ArrayList<>();
                         String classify;
                         String classify;
@@ -628,29 +735,40 @@ public class TrialSelfInspectionRecordServiceImpl
                         } else {
                         } else {
                             classify = "2";
                             classify = "2";
                         }
                         }
-                        String pdfUrlAll = baseMapper.selectInformationQuery(id, wbsTreeContract.getContractId(), classify);
+                        String pdfUrlNodeAll = baseMapper.selectInformationQuery(pKeyId, wbsTreeContract.getContractId(), classify);
+
+                        if (StringUtils.isEmpty(pdfUrlNodeAll) || StringUtils.isEmpty(obj.getPdfUrl())) {
+                            continue;
+                        }
+
                         //质检节点合并pdfUrl
                         //质检节点合并pdfUrl
-                        pdfUrlList.add(pdfUrlAll);
+                        pdfUrlList.add(pdfUrlNodeAll);
                         //试验pdfUrl
                         //试验pdfUrl
-                        pdfUrlList.add(ObjectUtil.isNotEmpty(dto.getPdfUrl()) ? dto.getPdfUrl() : "");
+                        pdfUrlList.add(obj.getPdfUrl());
 
 
                         //合并PDF
                         //合并PDF
                         String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
                         String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-                        String listPdf = filePath + "/pdf/" + id + ".pdf";
+                        String listPdf = filePath + "/pdf/" + pKeyId + ".pdf";
                         File tabPDF = ResourceUtil.getFile(listPdf);
                         File tabPDF = ResourceUtil.getFile(listPdf);
                         if (tabPDF.exists()) {
                         if (tabPDF.exists()) {
                             tabPDF.delete();
                             tabPDF.delete();
                         }
                         }
                         FileUtils.mergePdfPublicMethods(pdfUrlList, listPdf);
                         FileUtils.mergePdfPublicMethods(pdfUrlList, listPdf);
-                        BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
+                        BladeFile bladeFile = this.newIOSSClient.uploadFile(pKeyId + ".pdf", listPdf);
                         if (bladeFile != null) {
                         if (bladeFile != null) {
-                            //修改质检合并pdfURL
-                            baseMapper.updateInformationQuery(id, wbsTreeContract.getContractId(), classify, bladeFile.getLink());
+                            //修改质检合并后的pdfURL
+                            baseMapper.updateInformationQuery(pKeyId, wbsTreeContract.getContractId(), classify, bladeFile.getLink());
                         }
                         }
                     }
                     }
                 }
                 }
+            } else {
+                throw new ServiceException("当前试验记录任务未上报审批,关联工程部位及用途信息失败");
             }
             }
+        } else {
+            //删除关联信息
+            baseMapper.delSelfQuality(dto.getId());
         }
         }
+        return true;
     }
     }
 
 
     private void buildNumber(TrialSelfInspectionRecordDTO dto) {
     private void buildNumber(TrialSelfInspectionRecordDTO dto) {
@@ -932,5 +1050,4 @@ public class TrialSelfInspectionRecordServiceImpl
         return false;
         return false;
     }
     }
 
 
-
 }
 }

+ 62 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -1,5 +1,7 @@
 package org.springblade.business.service.impl;
 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.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +13,7 @@ import org.springblade.business.service.WeatherInfoService;
 //import org.springframework.scheduling.annotation.Scheduled;
 //import org.springframework.scheduling.annotation.Scheduled;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ProjectContractArea;
 import org.springblade.manager.entity.ProjectContractArea;
+import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.ProjectContractAreaClient;
 import org.springblade.manager.feign.ProjectContractAreaClient;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -18,6 +21,10 @@ import org.springframework.stereotype.Service;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Condition;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.*;
 
 
 @Slf4j
 @Slf4j
@@ -110,7 +117,6 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                     log.info("今日的天气已经同步完成!contractAreaId:" + area.getId() + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                     log.info("今日的天气已经同步完成!contractAreaId:" + area.getId() + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                     continue;
                     continue;
                 }
                 }
-
                 //获取天气信息(百度天气)
                 //获取天气信息(百度天气)
                 Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(area.getCity_code());
                 Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(area.getCity_code());
                 if(weatherMap != null){
                 if(weatherMap != null){
@@ -159,6 +165,61 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
         }
         }
+        //遍历项目,对比项目的所有合同段天气日期和项目计划开工日期
+        Set<String> keySet = map.keySet();
+        for (String key : keySet) {
+            List<ProjectContractArea> projectContractAreas = map.get(key);
+            for (ProjectContractArea projectContractArea : projectContractAreas) {
+                //根据合同区域id,找到合同最早的天气日期
+                WeatherInfo weatherInfo = baseMapper.selectOne(new LambdaQueryWrapper<WeatherInfo>()
+                        .eq(WeatherInfo::getContractAreaId, projectContractArea.getId())
+                        .orderByAsc(WeatherInfo::getRecordTime)
+                        .last("limit 1"));
+                if (weatherInfo == null){
+                    weatherInfo = new WeatherInfo();
+                    GregorianCalendar calendar = new GregorianCalendar();
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE,1);
+                    weatherInfo.setRecordTime(calendar.getTime());
+                }
+                Date recordTime = weatherInfo.getRecordTime();
+                if (new Date().compareTo(recordTime) == -1){
+                    continue;
+                }
+                LocalDateTime t = LocalDateTime.ofInstant(recordTime.toInstant(), ZoneId.systemDefault());
+                LocalDateTime ContractTime = LocalDateTime.of(t.getYear(),t.getMonthValue(),t.getDayOfMonth(),0,0,0);
+                //获取项目计划开工日期,和合同段天气日期对比
+                ProjectInfo projectInfo = projectClient.getById(key);
+                //有些项目没有计划开工日期
+                if (projectInfo == null || projectInfo.getPlanStartTime() == null){
+                    continue;
+                }
+                LocalDateTime t2 = projectInfo.getPlanStartTime();
+                LocalDateTime plainTime = LocalDateTime.of(t2.getYear(),t2.getMonthValue(),t2.getDayOfMonth(),0,0,0);
+                Duration duration = Duration.between(plainTime, ContractTime);
+                if (duration.toDays() > 0){
+                    List<WeatherInfo> list = new ArrayList<>();
+                    while (Duration.between(plainTime,ContractTime).toDays() != 0){
+                        //获取天气信息(百度天气)
+                        Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(projectContractArea.getCity_code());
+                        if(weatherMap != null){
+                            //计算平均气温
+                            BigDecimal aver = (new BigDecimal(weatherMap.get("high")).add(new BigDecimal(weatherMap.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
+                            WeatherInfo newWeather = new WeatherInfo(String.valueOf(projectContractArea.getId()), weatherMap.get("weather"), aver.toString(), weatherMap.get("high"), weatherMap.get("low"), weatherMap.get("windLevel"));
+                            newWeather.setRecordTime(Date.from( plainTime.atZone( ZoneId.systemDefault()).toInstant()));
+//                            this.save(newWeather);
+                            list.add(newWeather);
+                            log.info("历史天气已经同步完成!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                        } else {
+                            log.info("获取历史天气失败!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                        }
+                        plainTime = plainTime.plusDays(1);
+                    }
+                    this.saveBatch(list);
+                }
+            }
+        }
+
     }
     }
 
 
 }
 }

+ 161 - 29
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 package org.springblade.manager.controller;
 
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
@@ -13,8 +14,12 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
@@ -28,6 +33,8 @@ import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserVO2;
 import org.springblade.system.user.vo.UserVO2;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -37,7 +44,9 @@ import org.springblade.manager.service.IContractInfoService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
 
 
 
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
@@ -50,6 +59,7 @@ public class ContractInfoController extends BladeController {
     private final IUserClient iUserClient;
     private final IUserClient iUserClient;
     private final IWbsTreeContractService wbsTreeContractService;
     private final IWbsTreeContractService wbsTreeContractService;
     private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
     private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
+    private final JdbcTemplate jdbcTemplate;
 
 
     /**
     /**
      * 详情
      * 详情
@@ -145,8 +155,7 @@ public class ContractInfoController extends BladeController {
     @ApiOperationSupport(order = 6)
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "新增或修改", notes = "传入contractInfo")
     @ApiOperation(value = "新增或修改", notes = "传入contractInfo")
     public R submit(@Valid @RequestBody ContractInfoVO contractInfo) {
     public R submit(@Valid @RequestBody ContractInfoVO contractInfo) {
-        boolean b = contractInfoService.saveAndUpdateContract(contractInfo);
-        if (b) {
+        if (contractInfoService.saveAndUpdateContract(contractInfo)) {
             return R.data(contractInfo, "操作成功");
             return R.data(contractInfo, "操作成功");
         }
         }
         return R.fail("操作失败");
         return R.fail("操作失败");
@@ -160,18 +169,13 @@ public class ContractInfoController extends BladeController {
     @ApiOperationSupport(order = 7)
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        List<WbsTreeContract> wbsTreeContracts = wbsTreeContractService.findWbsTreeContract(ids);
-        if (wbsTreeContracts.size() > 0) {
+        if (wbsTreeContractService.findWbsTreeContract(ids).size() > 0) {
             return R.fail("合同段存在关联的WBS树,删除失败");
             return R.fail("合同段存在关联的WBS树,删除失败");
         }
         }
-        Long list = saveUserInfoByProjectMapper.selectCount(Wrappers.<SaveUserInfoByProjectDTO>query().lambda()
-                .eq(SaveUserInfoByProjectDTO::getContractId, ids)
-        );
-        if (list > 0L) {
+        if (saveUserInfoByProjectMapper.selectCount(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getContractId, ids)) > 0L) {
             return R.fail("当前合同段存在关联用户,删除失败");
             return R.fail("当前合同段存在关联用户,删除失败");
         }
         }
-        Integer list2 = saveUserInfoByProjectMapper.selectSGJL(ids);
-        if (list2 > 0) {
+        if (saveUserInfoByProjectMapper.selectSGJL(ids) > 0) {
             return R.fail("当前监理合同段存在关联的施工合同信息,删除失败");
             return R.fail("当前监理合同段存在关联的施工合同信息,删除失败");
         }
         }
         return R.status(contractInfoService.deleteLogic(Func.toLongList(ids)));
         return R.status(contractInfoService.deleteLogic(Func.toLongList(ids)));
@@ -222,7 +226,7 @@ public class ContractInfoController extends BladeController {
 
 
 
 
     /**
     /**
-     * 保存-项目分配维护人员
+     * 保存-项目分配维护人员 - 单保存
      */
      */
     @PostMapping("/save-userInfo-by-project")
     @PostMapping("/save-userInfo-by-project")
     @ApiOperationSupport(order = 12)
     @ApiOperationSupport(order = 12)
@@ -303,12 +307,11 @@ public class ContractInfoController extends BladeController {
 
 
 
 
     /**
     /**
-     * 保存-项目合同段分配人员
+     * 保存-项目合同段分配人员 - 单保存
      */
      */
     @PostMapping("/save-userInfo-by-project-tow")
     @PostMapping("/save-userInfo-by-project-tow")
     @ApiOperationSupport(order = 13)
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "保存-项目合同段分配人员", notes = "传入项目id、合同id、岗位处roleId、用户id")
     @ApiOperation(value = "保存-项目合同段分配人员", notes = "传入项目id、合同id、岗位处roleId、用户id")
-    @Transactional(rollbackFor = Exception.class)
     public R saveUserInfoByProjectTow(@RequestBody List<SaveUserInfoByProjectDTO> list) {
     public R saveUserInfoByProjectTow(@RequestBody List<SaveUserInfoByProjectDTO> list) {
         if (list.size() > 0) {
         if (list.size() > 0) {
             list.forEach((lists) -> {
             list.forEach((lists) -> {
@@ -323,18 +326,73 @@ public class ContractInfoController extends BladeController {
                     throw new ServiceException("当前用户类型已存在合同段,请重新选择项目合同段添加");
                     throw new ServiceException("当前用户类型已存在合同段,请重新选择项目合同段添加");
                 }
                 }
             });
             });
-            //添加userRoleId
-            iUserClient.updateUserRoleId(list);
-            boolean result = saveUserInfoByProjectService.saveBatch(list);
-            if (result) {
-                return R.success("保存成功");
+
+            String contractId = list.stream().map(SaveUserInfoByProjectDTO::getContractId).findAny().orElse(null);
+            ContractInfo contractInfo = contractInfoService.selectById(contractId);
+            //监理、业主、中西试验室合同段新增
+            if (contractInfo.getContractType() == 2 || contractInfo.getContractType() == 3 || contractInfo.getContractType() == 4) {
+                //同步到对应关联的施工合同段中
+                String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+                List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                if (record_SG.size() > 0) {
+                    for (String sgId : record_SG) {
+                        //当前施工合同段所有用户角色信息
+                        String sql2 = "select * from m_project_assignment_user where contract_id = " + sgId + " and post_id is null and status = 1 and is_deleted = 0";
+                        List<SaveUserInfoByProjectDTO> userRoleInfoSG = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+
+                        //去重
+                        List<SaveUserInfoByProjectDTO> lists = BeanUtil.copyProperties(list, SaveUserInfoByProjectDTO.class);
+                        if (lists.size() > 0) {
+                            Iterator<SaveUserInfoByProjectDTO> iterator = lists.iterator();
+                            while (iterator.hasNext()) {
+                                SaveUserInfoByProjectDTO jl = iterator.next();
+                                for (SaveUserInfoByProjectDTO sg : userRoleInfoSG) {
+                                    if (sg.getUserId().equals(jl.getUserId())) {
+                                        //如果监理合同段与施工合同段中有相同的用户信息,就移除,一个用户只能存在一个合同段中
+                                        iterator.remove();
+                                    }
+                                }
+                            }
+                        }
+
+                        //重构入参
+                        List<SaveUserInfoByProjectDTO> addList = new ArrayList<>();
+                        for (SaveUserInfoByProjectDTO jl : lists) {
+                            SaveUserInfoByProjectDTO newObj = BeanUtil.copyProperties(jl, SaveUserInfoByProjectDTO.class);
+                            assert newObj != null;
+                            newObj.setId(SnowFlakeUtil.getId());
+                            newObj.setContractId(sgId);
+                            newObj.setStatus(1);
+                            if (ObjectUtil.isNotEmpty(SecureUtil.getUser())) {
+                                newObj.setCreateUser(SecureUtil.getUser().getUserId());
+                                newObj.setCreateDept(Long.parseLong(SecureUtil.getUser().getDeptId().split(",")[0]));
+                            }
+                            newObj.setCreateTime(new Date());
+                            newObj.setIsRecordJlId(contractInfo.getId()); //从监理合同段关联的数据,用于删除关联时同步删除用户信息
+                            addList.add(newObj);
+                        }
+
+                        //保存监理数据时,同步到对应关联的施工合同段中去
+                        if (addList.size() > 0) {
+                            saveUserInfoByProjectService.saveBatch(addList);
+                        }
+                    }
+                }
             }
             }
+
+            //保存当前合同段数据
+            saveUserInfoByProjectService.saveBatch(list);
+
+            //更新用户roleId
+            iUserClient.updateUserRoleId(list);
+
+            return R.success("保存成功");
         }
         }
         return R.fail("保存失败");
         return R.fail("保存失败");
     }
     }
 
 
     /**
     /**
-     * 项目分配用户删除
+     * 项目分配用户删除 - 全部删除 or 单删除
      */
      */
     @PostMapping("/remove-users-by-ids")
     @PostMapping("/remove-users-by-ids")
     @ApiOperationSupport(order = 14)
     @ApiOperationSupport(order = 14)
@@ -347,32 +405,80 @@ public class ContractInfoController extends BladeController {
         //查询当前角色信息是否存在
         //查询当前角色信息是否存在
         List<Long> idsListTemp = Func.toLongList(ids);
         List<Long> idsListTemp = Func.toLongList(ids);
         String roleIdTemp = "";
         String roleIdTemp = "";
+        String contractId = "";
         for (Long idTemp : idsListTemp) {
         for (Long idTemp : idsListTemp) {
             SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectOne(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getId, idTemp));
             SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectOne(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getId, idTemp));
             roleIdTemp = saveUserInfoByProjectDTO.getRoleId();
             roleIdTemp = saveUserInfoByProjectDTO.getRoleId();
+            contractId = saveUserInfoByProjectDTO.getContractId();
         }
         }
         if (StringUtils.isEmpty(roleIdTemp)) {
         if (StringUtils.isEmpty(roleIdTemp)) {
-            //roleId = null 表示为运营维护人员角色分配 - 物理删除
+            //roleId = null 表示为运营维护人员角色分配
             return R.status(saveUserInfoByProjectService.deleteByIdsPhysical(idsListTemp));
             return R.status(saveUserInfoByProjectService.deleteByIdsPhysical(idsListTemp));
         } else {
         } else {
             //roleId != null 表示合同段人员角色分配
             //roleId != null 表示合同段人员角色分配
-            if (idsListTemp.size() > 1) {
-                //全部删除
-                return R.status(saveUserInfoByProjectService.deleteBatchByIdsList(idsListTemp));
-            } else {
-                //单删除
+            ContractInfo contractInfo = contractInfoService.selectById(contractId);
+
+            if (idsListTemp.size() > 1) { //全部删除
+                if (contractInfo.getContractType() == 2 || contractInfo.getContractType() == 3 || contractInfo.getContractType() == 4) {
+                    //监理合同段同步删除施工合同段下的用户信息
+                    String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+                    List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                    for (String sgId : record_SG) {
+                        //同步删除当前施工合同段下所有关联用户 is_record_jl_id = contractInfo.getId()
+                        String del = "delete from m_project_assignment_user where is_record_jl_id = " + contractInfo.getId() + " and contract_id = " + sgId;
+                        jdbcTemplate.execute(del);
+                    }
+                }
+
+                //更新每一个user的roleId字段
+                List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().in(SaveUserInfoByProjectDTO::getId, idsListTemp));
+                List<String> userIds = list.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList());
+
+                saveUserInfoByProjectService.deleteByIdsPhysical(idsListTemp);
+
+                for (String userId : userIds) {
+                    //物理删除后,再根据userId查询当前用户中的最新角色信息
+                    String sql = "select role_id from m_project_assignment_user where role_id is not null and post_id is null and user_id = " + userId;
+                    List<SaveUserInfoByProjectDTO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+
+                    List<String> collect = query.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
+
+                    if (collect.size() > 0) {
+                        String roleIds = org.apache.commons.lang.StringUtils.join(collect, ",");
+                        String updateSql = "update blade_user set role_id = '" + roleIds + "' where id = " + userId;
+                        jdbcTemplate.execute(updateSql);
+                    }
+                }
+
+            } else { //单删除
                 SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectById(ids);
                 SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectById(ids);
                 String userId = saveUserInfoByProjectDTO.getUserId();
                 String userId = saveUserInfoByProjectDTO.getUserId();
                 String roleId = saveUserInfoByProjectDTO.getRoleId();
                 String roleId = saveUserInfoByProjectDTO.getRoleId();
-                //删除用户RoleId
+
+                if (contractInfo.getContractType() == 2 || contractInfo.getContractType() == 3 || contractInfo.getContractType() == 4) {
+                    //监理合同段同步删除施工合同段下的用户信息
+                    String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+                    List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                    for (String sgId : record_SG) {
+                        //同步删除当前用户
+                        String del = "delete from m_project_assignment_user where is_record_jl_id = " + contractInfo.getId() + " and contract_id = " + sgId + " and project_id = " + contractInfo.getPId() + " and user_id = " + userId + " and role_id = " + roleId;
+                        jdbcTemplate.execute(del);
+                    }
+                }
+
+                //物理删除
+                saveUserInfoByProjectService.deleteByIdsPhysical(idsListTemp);
+
+                //更新当前用户roleId
                 iUserClient.updateUserRoleIdTwo(userId, roleId);
                 iUserClient.updateUserRoleIdTwo(userId, roleId);
-                return R.status(saveUserInfoByProjectService.deleteByIdsPhysical(idsListTemp));
+
             }
             }
+            return R.status(true);
         }
         }
     }
     }
 
 
     /**
     /**
-     * 项目分配用户逻辑删除当前项目下所有合同段角色信息
+     * 项目分配用户 - 删除当前项目下该用户的所有合同段角色信息
      */
      */
     @PostMapping("/remove-userProjectInfo-role-byId")
     @PostMapping("/remove-userProjectInfo-role-byId")
     @ApiOperationSupport(order = 14)
     @ApiOperationSupport(order = 14)
@@ -435,12 +541,38 @@ public class ContractInfoController extends BladeController {
         return R.fail(200, "未查询到信息");
         return R.fail(200, "未查询到信息");
     }
     }
 
 
+    /**
+     * 查询合同段树-全加载
+     */
+    @GetMapping("/tree-all")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "查询合同段私有Wbs节点树形结构", notes = "传入wbsId,项目id,合同段id")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),
+            @ApiImplicitParam(name = "项目id", value = "projectId", required = true),
+            @ApiImplicitParam(name = "合同段id", value = "contractId", required = true)
+    })
+    public R treeAll(String wbsId, String projectId, String contractId) {
+        List<WbsTreeContractVO> tree = contractInfoService.tree3(wbsId, projectId, contractId);
+        if (tree != null && tree.size() > 0) {
+            ContractInfo contractInfo = contractInfoService.getBaseMapper().selectById(contractId);
+            for (WbsTreeContractVO wbsTreeContractVO : tree) {
+                if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                    wbsTreeContractVO.setTitle(contractInfo.getContractName());
+                    break;
+                }
+            }
+            return R.data(tree);
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
     /**
     /**
      * 查询合同段私有Wbs节点树形结构 --- 试验关联工程节点树
      * 查询合同段私有Wbs节点树形结构 --- 试验关联工程节点树
      */
      */
     @GetMapping("/trial/relation/tree")
     @GetMapping("/trial/relation/tree")
     @ApiOperationSupport(order = 18)
     @ApiOperationSupport(order = 18)
-    @ApiOperation(value = "查询合同段私有Wbs节点树形结构", notes = "传入wbsId,项目id,合同段id")
+    @ApiOperation(value = "查询合同段私有Wbs节点树形结构", notes = "传入wbsId,项目id,合同段id,自检记录id")
     @ApiImplicitParams(value = {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),
             @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),
             @ApiImplicitParam(name = "项目id", value = "projectId", required = true),
             @ApiImplicitParam(name = "项目id", value = "projectId", required = true),

+ 10 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -202,7 +202,6 @@ public class ProjectInfoController extends BladeController {
         return R.fail(200, "未查询到信息");
         return R.fail(200, "未查询到信息");
     }
     }
 
 
-
     /**
     /**
      * 保存或修改分配项目级wbs树
      * 保存或修改分配项目级wbs树
      */
      */
@@ -224,4 +223,14 @@ public class ProjectInfoController extends BladeController {
         return R.data(result);
         return R.data(result);
     }
     }
 
 
+    /**
+     * 同步节点树基本信息到项目下的合同段
+     */
+    @PostMapping("/sync-node-info")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "同步节点树基本信息到项目下的合同段", notes = "传入节点pKeyId")
+    public R<Object> syncNodeInfo(@RequestParam Long pKeyId) {
+        return R.status(wbsTreeService.syncNodeInfo(pKeyId));
+    }
+
 }
 }

+ 46 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -16,6 +16,7 @@
  */
  */
 package org.springblade.manager.controller;
 package org.springblade.manager.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -39,11 +40,10 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.entity.WbsFormElement;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
 import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
 import org.springblade.manager.utils.CopyUtil;
 import org.springblade.manager.utils.CopyUtil;
 import org.springblade.manager.vo.TextdictBy345VO;
 import org.springblade.manager.vo.TextdictBy345VO;
@@ -54,7 +54,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.vo.TextdictInfoVO;
 import org.springblade.manager.vo.TextdictInfoVO;
 import org.springblade.manager.service.ITextdictInfoService;
 import org.springblade.manager.service.ITextdictInfoService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -84,6 +83,7 @@ public class TextdictInfoController extends BladeController {
     private final ITextdictInfoService textdictInfoService;
     private final ITextdictInfoService textdictInfoService;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final WbsTreePrivateServiceImpl wbsTreePrivateService;
     private final WbsTreePrivateServiceImpl wbsTreePrivateService;
+    private final WbsTreeContractServiceImpl wbsTreeContractService;
 
 
     private final JdbcTemplate jdbcTemplate;
     private final JdbcTemplate jdbcTemplate;
 
 
@@ -432,8 +432,21 @@ public class TextdictInfoController extends BladeController {
         String replace = str1.replace("\\", "\\\\");
         String replace = str1.replace("\\", "\\\\");
 
 
         //修改所有节点的htmlUrl
         //修改所有节点的htmlUrl
-        String updateSql = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
-        jdbcTemplate.execute(updateSql);
+        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
+        jdbcTemplate.execute(updateSqlP);
+
+        //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
+        List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
+        List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
+                .eq(WbsTreeContract::getStatus, 1)
+                .in(WbsTreeContract::getId, cIdsList)
+        ).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+
+        String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
+        String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
+        jdbcTemplate.execute(updateSqlC);
 
 
         return R.success("操作成功");
         return R.success("操作成功");
     }
     }
@@ -481,9 +494,9 @@ public class TextdictInfoController extends BladeController {
                 .eq(TextdictInfo::getTabId, textdictInfo.getTableId())
                 .eq(TextdictInfo::getTabId, textdictInfo.getTableId())
                 .eq(TextdictInfo::getType, textdictInfo.getType()));
                 .eq(TextdictInfo::getType, textdictInfo.getType()));
 
 
+        List<TextdictInfo> textDictInfosNewAll = new ArrayList<>();
         for (Long pKeyId : pKeyIds) {
         for (Long pKeyId : pKeyIds) {
-
-            List<TextdictInfo> textDictInfosNew = CommonUtil.deepCopy(textDictInfosOld);
+            List<TextdictInfo> textDictInfosNew = JSON.parseArray(JSON.toJSONString(textDictInfosOld), TextdictInfo.class);
 
 
             TextdictInfo textDictBean = new TextdictInfo();
             TextdictInfo textDictBean = new TextdictInfo();
             textDictBean.setColKey(id);
             textDictBean.setColKey(id);
@@ -509,15 +522,18 @@ public class TextdictInfoController extends BladeController {
                     obj.setName("提示信息");
                     obj.setName("提示信息");
                 }
                 }
             }
             }
+            textDictInfosNewAll.addAll(textDictInfosNew);
+        }
 
 
-            //删除当前类型
-            textdictInfoService.getBaseMapper().delete(Wrappers.<TextdictInfo>query().lambda()
-                    .eq(TextdictInfo::getTabId, pKeyId)
-                    .eq(TextdictInfo::getType, textdictInfo.getType()));
+        //删除当前类型
+        List<String> collect = textDictInfosNewAll.stream().map(TextdictInfo::getTabId).distinct().collect(Collectors.toList());
+        this.textdictInfoService.getBaseMapper().delete(Wrappers.<TextdictInfo>query().lambda()
+                .eq(TextdictInfo::getType, textdictInfo.getType())
+                .in(TextdictInfo::getTabId, collect)
+        );
 
 
-            //批量新增
-            textdictInfoService.saveBatch(textDictInfosNew);
-        }
+        //批量新增
+        this.textdictInfoService.saveBatch(textDictInfosNewAll);
 
 
         if (textdictInfo.getType() == 5) { // 提示语
         if (textdictInfo.getType() == 5) { // 提示语
             String lastHtml = "";
             String lastHtml = "";
@@ -535,8 +551,21 @@ public class TextdictInfoController extends BladeController {
         String replace = str1.replace("\\", "\\\\");
         String replace = str1.replace("\\", "\\\\");
 
 
         //修改所有节点的htmlUrl
         //修改所有节点的htmlUrl
-        String updateSql = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
-        jdbcTemplate.execute(updateSql);
+        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
+        jdbcTemplate.execute(updateSqlP);
+
+        //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
+        List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
+        List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
+                .eq(WbsTreeContract::getStatus, 1)
+                .in(WbsTreeContract::getId, cIdsList)
+        ).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+
+        String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
+        String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
+        jdbcTemplate.execute(updateSqlC);
 
 
         return R.success("操作成功");
         return R.success("操作成功");
     }
     }

+ 77 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -3,16 +3,31 @@ package org.springblade.manager.feign;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.feign.InformationQueryClient;
+import org.springblade.business.vo.TrialRawMaterialSelfRecord;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.entity.TrialSelfDataRecord;
 import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.service.IExcelTabService;
+import org.springblade.manager.utils.FileUtils;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.system.cache.ParamCache;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.io.File;
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
@@ -20,6 +35,8 @@ public class ExcelTabClientImpl implements ExcelTabClient {
 
 
     private final IExcelTabService excelTabService;
     private final IExcelTabService excelTabService;
     private final JdbcTemplate jdbcTemplate;
     private final JdbcTemplate jdbcTemplate;
+    private final NewIOSSClient newIOSSClient;
+    private final InformationQueryClient informationQueryClient;
 
 
     @Override
     @Override
     public ExcelTab getById(String id) {
     public ExcelTab getById(String id) {
@@ -38,35 +55,65 @@ public class ExcelTabClientImpl implements ExcelTabClient {
 
 
         String pdfUrl = "";
         String pdfUrl = "";
 
 
-        //单表PDF保存
-        if (isBatchSave == 0) {
-            //保存数据到数据库-试验,当前记录id作为groupId
-            this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
-            try {
-                //公式填充
-                this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
+        //保存数据到数据库-试验,当前记录id作为groupId
+        this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
+        try {
+            //公式填充
+            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
 
 
-            //单表PDF
+        if (isBatchSave == 0) {
+            //单表PDF保存
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
             assert tableInfo != null;
             assert tableInfo != null;
-            if (tableInfo.getPkeyId().equals(tabIds)) {
+            if (tabIds.contains(tableInfo.getPkeyId())) {
+
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
-            }
 
 
-        } else if (isBatchSave == 1) { //多表PDF保存
-            //保存数据到数据库-试验,当前记录id作为groupId
-            this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
-            try {
-                //公式填充
-                this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
-            } catch (Exception e) {
-                e.printStackTrace();
+                //重新合并pdf
+                String sql = "select * from u_trial_self_data_record where record_id = " + id;
+                List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+                List<String> pdfList = query.stream().map(TrialSelfDataRecord::getPdfUrl).collect(Collectors.toList());
+
+                String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                String pdfPath2 = file_path + "/pdf//" + id + "_2.pdf";
+                File tabPdf2 = ResourceUtil.getFile(pdfPath2);
+                if (tabPdf2.exists()) {
+                    tabPdf2.delete();
+                }
+                FileUtils.mergePdfPublicMethods(pdfList, pdfPath2);
+                BladeFile bladeFile = newIOSSClient.uploadFile(id + "2.pdf", pdfPath2);
+
+                String sqlUpdate = "update u_trial_self_inspection_record set pdf_url = '" + bladeFile.getLink() + "' where id = " + id;
+                jdbcTemplate.execute(sqlUpdate);
+
+                //获取试验记录id的试验项目名称
+                String sql2 = "select trial_project_name from u_trial_self_inspection_record where id = " + id;
+                TrialSelfInspectionRecord obj = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
+                assert obj != null;
+                //重新合并pdf集合(解决单表保存后上报找不到题名问题)
+                String querySql = "select * from u_information_query where classify ='" + type + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
+                List<InformationQuery> query2 = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
+                if (query2.size() > 0) {
+                    String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + obj.getTrialProjectName() + "'  where classify='" + type + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
+                    jdbcTemplate.execute(updateSql);
+                } else {
+                    informationQueryClient.saveData(id.toString(), projectId, contractId, type.toString(), bladeFile.getLink(), obj.getTrialProjectName());
+                }
+
+                //修改原材料检测报告原始pdfUrl
+                String sql3 = "select * from u_trial_raw_material_self_record where self_record_id =" + id;
+                TrialRawMaterialSelfRecord record = jdbcTemplate.query(sql3, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
+                if (ObjectUtil.isNotEmpty(record)) {
+                    String sqlUpdate2 = "update u_trial_raw_material_self_record set old_pdf_url = '" + bladeFile.getLink() + "' where self_record_id =" + id;
+                    jdbcTemplate.execute(sqlUpdate2);
+                }
             }
             }
 
 
-            //多表合并PDF
+        } else if (isBatchSave == 1) {
+            //多表PDF保存
             pdfUrl = excelTabService.getBussPDFSTrial(nodeId,
             pdfUrl = excelTabService.getBussPDFSTrial(nodeId,
                     tableType, //tableType=表类型 1=记录表 2=报告单
                     tableType, //tableType=表类型 1=记录表 2=报告单
                     String.valueOf(type), //type=所属方 1=施工质检 2=监理抽检
                     String.valueOf(type), //type=所属方 1=施工质检 2=监理抽检
@@ -75,8 +122,15 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                     id,  //记录id
                     id,  //记录id
                     tabIds //新增的表的pKeyIds
                     tabIds //新增的表的pKeyIds
             );
             );
-        }
 
 
+            //修改原材料检测报告原始pdfUrl
+            String sql = "select * from u_trial_raw_material_self_record where self_record_id =" + id;
+            TrialRawMaterialSelfRecord record = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
+            if (ObjectUtil.isNotEmpty(record)) {
+                String sqlUpdate = "update u_trial_raw_material_self_record set old_pdf_url = '" + pdfUrl + "' where self_record_id =" + id;
+                jdbcTemplate.execute(sqlUpdate);
+            }
+        }
         return pdfUrl;
         return pdfUrl;
     }
     }
 
 

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java

@@ -21,4 +21,9 @@ public class ProjectClientImpl implements ProjectClient {
     public List<ProjectInfo> queryProjectList(List<String> projectIds) {
     public List<ProjectInfo> queryProjectList(List<String> projectIds) {
         return projectInfoService.selectProjectList(projectIds);
         return projectInfoService.selectProjectList(projectIds);
     }
     }
+
+    @Override
+    public ProjectInfo getById(String key) {
+        return projectInfoService.getById(key);
+    }
 }
 }

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java

@@ -84,4 +84,8 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
     @Select("select quality_node_id from u_trial_self_quality_project where self_id = #{selfId}")
     @Select("select quality_node_id from u_trial_self_quality_project where self_id = #{selfId}")
     List<String> queryList(@Param("selfId") String selfId);
     List<String> queryList(@Param("selfId") String selfId);
 
 
+    List<WbsTreeContractVO> tree5(@Param("wbsId") Long wbsId,
+                                  @Param("projectId") Long projectId,
+                                  @Param("contractId") Long contractId);
+
 }
 }

+ 35 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -98,9 +98,7 @@
     </insert>
     </insert>
 
 
     <delete id="deleteContractRelationJLYZ">
     <delete id="deleteContractRelationJLYZ">
-        delete
-        from m_contract_relation_jlyz
-        where contract_id_jlyz = #{id}
+        delete from m_contract_relation_jlyz where contract_id_jlyz = #{id}
     </delete>
     </delete>
 
 
     <select id="selectContractByProjectIds" resultMap="contractInfoResultMap">
     <select id="selectContractByProjectIds" resultMap="contractInfoResultMap">
@@ -409,4 +407,38 @@
         </foreach>
         </foreach>
     </select>
     </select>
 
 
+    <select id="tree5" resultMap="treeNodeResultMap2">
+        SELECT
+        d.p_key_id AS "primaryKeyId",
+        d.wbs_type AS "wbsType",
+        d.id,
+        d.parent_id AS "parentId",
+        IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,
+        d.node_name AS "nodeName",
+        d.full_name AS "fullName",
+        d.import_matching_info AS "importMatchingInfo",
+        d.type AS "type",
+        d.node_type AS "nodeType",
+        d.id AS "value",
+        d.id AS "key",
+        partition_code,
+        old_id,
+        sort
+        FROM m_wbs_tree_contract d
+        WHERE
+        d.is_deleted = 0
+        AND d.status = 1
+        AND d.type = 1
+        <if test="wbsId!=null and wbsId!=''">
+            and wbs_id = #{wbsId}
+        </if>
+        <if test="projectId !=null and projectId!=''">
+            and project_id = #{projectId}
+        </if>
+        <if test="contractId!=null and contractId!=''">
+            and contract_id = #{contractId}
+        </if>
+        ORDER BY d.sort
+    </select>
+
 </mapper>
 </mapper>

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.xml

@@ -21,7 +21,7 @@
     </resultMap>
     </resultMap>
 
 
     <select id="queryAllContractArea" resultMap="imageClassificationConfigResultMap">
     <select id="queryAllContractArea" resultMap="imageClassificationConfigResultMap">
-        select id, city_code from m_project_contract_area where is_deleted = 0
+        select * from m_project_contract_area where is_deleted = 0
     </select>
     </select>
 
 
 </mapper>
 </mapper>

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

@@ -106,7 +106,6 @@
     </resultMap>
     </resultMap>
 
 
 
 
-
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreeContractVO">
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreeContractVO">
         <result column="id" property="id"/>
         <result column="id" property="id"/>
         <result column="wbs_id" property="wbsId"/>
         <result column="wbs_id" property="wbsId"/>
@@ -396,11 +395,11 @@
 
 
     <select id="updateAllNodeTabById" resultType="org.springblade.manager.entity.WbsTreeContract">
     <select id="updateAllNodeTabById" resultType="org.springblade.manager.entity.WbsTreeContract">
         update m_wbs_tree_contract
         update m_wbs_tree_contract
-        set excel_id=#{aPrivate.excelId},
+        set excel_id= #{aPrivate.excelId},
             node_name = #{aPrivate.nodeName},
             node_name = #{aPrivate.nodeName},
             full_name = #{aPrivate.fullName},
             full_name = #{aPrivate.fullName},
-            is_link_table=2,
-            html_url=#{aPrivate.htmlUrl}
+            is_link_table = 2,
+            html_url = #{aPrivate.htmlUrl}
         where type = 2
         where type = 2
           and project_id = #{aPrivate.projectId}
           and project_id = #{aPrivate.projectId}
           and id = #{aPrivate.id};
           and id = #{aPrivate.id};
@@ -581,7 +580,6 @@
             UPDATE m_wbs_tree_contract
             UPDATE m_wbs_tree_contract
             <set>
             <set>
                 node_name = #{item.nodeName},
                 node_name = #{item.nodeName},
-                full_name = #{item.nodeName},
                 node_type = #{item.nodeType},
                 node_type = #{item.nodeType},
                 major_data_type = #{item.majorDataType},
                 major_data_type = #{item.majorDataType},
                 table_type = #{item.tableType},
                 table_type = #{item.tableType},

+ 32 - 37
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -258,20 +258,21 @@
     </select>
     </select>
 
 
     <select id="tree2" resultMap="treeNodeResultMap2">
     <select id="tree2" resultMap="treeNodeResultMap2">
-        SELECT d.id,
-        d.tenant_id AS "tenantId",
-        d.parent_id AS "parentId",
-        d.node_name AS title,
-        d.type AS "type",
-        d.id AS "value",
-        d.id AS "key",
-        d.node_type AS "nodeType",
-        d.is_exist_form AS "isExistForm",
-        a.wbs_type AS "wbsType"
+        SELECT
+            d.id,
+            d.tenant_id AS "tenantId",
+            d.parent_id AS "parentId",
+            d.node_name AS title,
+            d.type AS "type",
+            d.id AS "value",
+            d.id AS "key",
+            d.node_type AS "nodeType",
+            d.is_exist_form AS "isExistForm",
+            a.wbs_type AS "wbsType"
         FROM m_wbs_tree d INNER JOIN m_wbs_info a ON a.id = #{wbsId}
         FROM m_wbs_tree d INNER JOIN m_wbs_info a ON a.id = #{wbsId}
         WHERE
         WHERE
-        d.is_deleted = 0
-        AND d.status = 1
+            d.is_deleted = 0
+            AND d.status = 1
         <if test="wbsId!=null and wbsId!=''">
         <if test="wbsId!=null and wbsId!=''">
             AND d.wbs_id = #{wbsId}
             AND d.wbs_id = #{wbsId}
         </if>
         </if>
@@ -287,35 +288,29 @@
 
 
     <select id="lazyTree" resultMap="treeNodeResultMap">
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
         SELECT
-        t.type AS "type",
-        t.node_type AS "nodeType",
-        t.is_exist_form AS "isExistForm",
-        t.table_type,
-        t.id,
-        t.parent_id,
-        t.node_name AS title,
-        t.id AS "value",
-        t.id AS "key",
-        t.ancestors AS "ancestors",
-        (
-        SELECT
-        CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+            (select wbs_type from m_wbs_info where id = #{wbsId}) AS wbsType,
+            t.type AS "type",
+            t.node_type AS "nodeType",
+            t.is_exist_form AS "isExistForm",
+            t.table_type,
+            t.id,
+            t.parent_id,
+            t.node_name AS title,
+            t.id AS "value",
+            t.id AS "key",
+            t.ancestors AS "ancestors",
+            (select case when count(1) > 0 then 1 else 0 end from m_wbs_tree where parent_id = t.id and is_deleted = 0) AS "has_children"
         FROM
         FROM
-        m_wbs_tree
+            m_wbs_tree t
         WHERE
         WHERE
-        parent_id = t.id and is_deleted = 0
-        ) AS "has_children"
-        FROM
-        m_wbs_tree t
-        WHERE
-        t.parent_id = #{parentId} AND t.is_deleted = 0
+            t.parent_id = #{parentId} AND t.is_deleted = 0
         <if test="tenantId!=null and tenantId!=''">
         <if test="tenantId!=null and tenantId!=''">
-            and t.tenant_id = #{tenantId}
+            AND t.tenant_id = #{tenantId}
         </if>
         </if>
-        AND t.wbs_id = #{wbsId}
-        AND t.type = 1
-        AND status = 1
-        ORDER BY t.sort
+            AND t.wbs_id = #{wbsId}
+            AND t.type = 1
+            AND status = 1
+            ORDER BY t.sort
     </select>
     </select>
 
 
     <select id="selectByNodeTable" resultMap="selectByNodeTableMap">
     <select id="selectByNodeTable" resultMap="selectByNodeTableMap">

+ 18 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -168,7 +168,7 @@
         update m_wbs_tree_private
         update m_wbs_tree_private
         set tenant_id       = #{wbsTP.tenantId},
         set tenant_id       = #{wbsTP.tenantId},
             parent_id       = #{wbsTP.parentId},
             parent_id       = #{wbsTP.parentId},
-            node_type   = #{wbsTP.nodeType},
+            node_type       = #{wbsTP.nodeType},
             node_name       = #{wbsTP.nodeName},
             node_name       = #{wbsTP.nodeName},
             full_name       = #{wbsTP.nodeName},
             full_name       = #{wbsTP.nodeName},
             ancestors       = #{wbsTP.ancestors},
             ancestors       = #{wbsTP.ancestors},
@@ -180,6 +180,7 @@
             create_time     = #{wbsTP.createTime},
             create_time     = #{wbsTP.createTime},
             update_user     = #{wbsTP.updateUser},
             update_user     = #{wbsTP.updateUser},
             update_time     = #{wbsTP.updateTime},
             update_time     = #{wbsTP.updateTime},
+            mix_ratio_test_ids = #{wbsTP.mixRatioTestIds},
             status          = 1,
             status          = 1,
             is_deleted      = 0
             is_deleted      = 0
         where p_key_id = #{pKeyId}
         where p_key_id = #{pKeyId}
@@ -483,34 +484,34 @@
         SELECT * FROM m_wbs_tree_private
         SELECT * FROM m_wbs_tree_private
         WHERE
         WHERE
         (
         (
-            type = 1
+        type = 1
         <if test="id != null and id != ''">
         <if test="id != null and id != ''">
             AND id = #{id}
             AND id = #{id}
         </if>
         </if>
-            AND project_id = #{referencePrivateWbsProjectId}
-            AND wbs_id = #{wbsId}
-            AND STATUS = 1
-            AND is_deleted = 0
+        AND project_id = #{referencePrivateWbsProjectId}
+        AND wbs_id = #{wbsId}
+        AND STATUS = 1
+        AND is_deleted = 0
         )
         )
         OR
         OR
         (
         (
-            type = 2
+        type = 2
         <if test="id != null and id != ''">
         <if test="id != null and id != ''">
             parent_id = #{id}
             parent_id = #{id}
         </if>
         </if>
-            AND project_id = #{referencePrivateWbsProjectId}
-            AND wbs_id = #{wbsId}
-            AND STATUS = 1
-            AND is_deleted = 0
+        AND project_id = #{referencePrivateWbsProjectId}
+        AND wbs_id = #{wbsId}
+        AND STATUS = 1
+        AND is_deleted = 0
         )
         )
         OR
         OR
         (
         (
-            type = 10
-            AND project_id = #{referencePrivateWbsProjectId}
-            AND wbs_id is null
-            AND parent_id = -10
-            AND STATUS = 1
-            AND is_deleted = 0
+        type = 10
+        AND project_id = #{referencePrivateWbsProjectId}
+        AND wbs_id is null
+        AND parent_id = -10
+        AND STATUS = 1
+        AND is_deleted = 0
         )
         )
     </select>
     </select>
 
 

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

@@ -44,6 +44,8 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
 
     List<WbsTreeContractVO> tree2(String wbsId, String projectId, String contractId);
     List<WbsTreeContractVO> tree2(String wbsId, String projectId, String contractId);
 
 
+    List<WbsTreeContractVO> tree3(String wbsId, String projectId, String contractId);
+
     List<WbsTreeContractVO2> treeTwo(String projectId);
     List<WbsTreeContractVO2> treeTwo(String projectId);
 
 
     List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId);
     List<WbsTreeContractTreeVO> queryContractWbsTreeByContractIdAndType(String contractId, Integer wbsType, String parentId);

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

@@ -44,9 +44,9 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
 
     boolean updateStatus(String pKeyId);
     boolean updateStatus(String pKeyId);
 
 
-    boolean updateBatchByIds(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId);
+    boolean updateBatchByIds(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId, Integer wbsType);
 
 
-    boolean updateBatchByIds2(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String projectId, String wbsId);
+    boolean updateBatchByIds2(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String projectId, String wbsId, Integer wbsType);
 
 
     WbsNodeTabAndParamVO getNodeTabAndParam(String id, String wbsId, String projectId);
     WbsNodeTabAndParamVO getNodeTabAndParam(String id, String wbsId, String projectId);
 
 

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

@@ -40,7 +40,7 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
 
     boolean importWbsTree(MultipartFile excelFile, WbsTree wbsTreeFu, WbsTree wbsTree1) throws IOException;
     boolean importWbsTree(MultipartFile excelFile, WbsTree wbsTreeFu, WbsTree wbsTree1) throws IOException;
 
 
-    Boolean submitWbsTreeInProject(WbsTreeContractDTO pawDTO);
+    boolean submitWbsTreeInProject(WbsTreeContractDTO pawDTO);
 
 
     WbsTreeAllListVO findWbsTreeList(Integer type);
     WbsTreeAllListVO findWbsTreeList(Integer type);
 
 
@@ -72,4 +72,6 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
 
     boolean submitFullName(String id, String fullNames);
     boolean submitFullName(String id, String fullNames);
 
 
+    boolean syncNodeInfo(Long pKeyId);
+
 }
 }

+ 119 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -9,7 +9,12 @@ import lombok.AllArgsConstructor;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.entity.*;
@@ -21,8 +26,12 @@ import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserVO2;
 import org.springblade.system.user.vo.UserVO2;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,7 +47,10 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     private final ContractInfoMapper contractInfoMapper;
     private final ContractInfoMapper contractInfoMapper;
     private final ProjectContractAreaMapper projectContractAreaMapper;
     private final ProjectContractAreaMapper projectContractAreaMapper;
     private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
     private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
+    private final SaveUserInfoByProjectServiceImpl saveUserInfoByProjectService;
     private final WbsTreeContractMapper wbsTreeContractMapper;
     private final WbsTreeContractMapper wbsTreeContractMapper;
+    private final JdbcTemplate jdbcTemplate;
+    private final IUserClient iUserClient;
 
 
     @Override
     @Override
     public List<String> getProcessContractByJLContractId(String contractId) {
     public List<String> getProcessContractByJLContractId(String contractId) {
@@ -116,6 +128,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return contractInfoMapper.deleteFile(url);
         return contractInfoMapper.deleteFile(url);
     }
     }
 
 
+    @Override
+    public List<WbsTreeContractVO> tree3(String wbsId, String projectId, String contractId) {
+        List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree5(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
+        return buildWbsTreeByStream(wbsTreeContractVOS);
+    }
+
     @Override
     @Override
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
         List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
         List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
@@ -156,7 +174,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return this.baseMapper.tree(null, null, contractId, wbsType, parentId);
         return this.baseMapper.tree(null, null, contractId, wbsType, parentId);
     }
     }
 
 
-    @Transactional(rollbackFor = Exception.class)
+    @Override
     public boolean saveAndUpdateContract(ContractInfoVO contractInfo) {
     public boolean saveAndUpdateContract(ContractInfoVO contractInfo) {
         if (contractInfo.getId() == null) {
         if (contractInfo.getId() == null) {
             List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
             List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
@@ -164,24 +182,30 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                     .eq(ContractInfo::getPId, contractInfo.getPId())
                     .eq(ContractInfo::getPId, contractInfo.getPId())
             );
             );
             if (contractInfos.size() > 0) {
             if (contractInfos.size() > 0) {
-                throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
+                throw new ServiceException("当前项目下已存在该合同段名称,请重新输入");
             }
             }
             if (StringUtils.isEmpty(String.valueOf(contractInfo.getContractType()))) {
             if (StringUtils.isEmpty(String.valueOf(contractInfo.getContractType()))) {
                 throw new ServiceException("合同类型不能为空");
                 throw new ServiceException("合同类型不能为空");
             }
             }
 
 
-            boolean row = saveOrUpdate(contractInfo);
+            boolean row = this.saveOrUpdate(contractInfo);
 
 
+            //监理、总监办新增
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
                 if (contractInfo.getIdList().size() > 0) {
                 if (contractInfo.getIdList().size() > 0) {
                     List<WbsTreeContractVO3> infos = contractInfo.getIdList();
                     List<WbsTreeContractVO3> infos = contractInfo.getIdList();
                     infos.forEach(info -> {
                     infos.forEach(info -> {
+                        //新增关系记录
                         baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
                         baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
                     });
                     });
                 }
                 }
+
+                //中西试验室
+            } else if (contractInfo.getContractType().equals(4)) {
+                //TODO
             }
             }
 
 
-            return submitContractRelevantInfo(row, contractInfo);
+            return this.submitContractRelevantInfo(row, contractInfo);
 
 
         } else {
         } else {
             List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
             List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
@@ -192,29 +216,108 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
             if (contractInfos.size() > 0) {
             if (contractInfos.size() > 0) {
                 throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
                 throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
             }
             }
-            boolean row = saveOrUpdate(contractInfo);
 
 
+            boolean row = this.saveOrUpdate(contractInfo);
+
+            //监理、总监办编辑
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
-                List<WbsTreeContractVO3> idList = contractInfo.getIdList();
+                //获取当前项目所有施工合同段信息
+                List<Long> contractInfosSGAll = baseMapper.selectList(Wrappers.<ContractInfo>lambdaQuery().eq(ContractInfo::getPId, contractInfo.getPId()).eq(ContractInfo::getContractType, 1).eq(ContractInfo::getStatus, 1)).stream().map(ContractInfo::getId).collect(Collectors.toList());
+
+                List<String> updateId_SG = contractInfo.getIdList().stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
+                //删除新增记录信息
+                baseMapper.deleteContractRelationJLYZ(contractInfo.getId());
+                updateId_SG.forEach(id -> {
+                    baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), id);
+                });
+
+                //当前关联的施工合同段ids
+                String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+                List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+
+                List<String> saveIds = contractInfosSGAll.stream().filter(f -> record_SG.contains(f.toString())).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                List<Long> delIds = contractInfosSGAll.stream().filter(f -> !record_SG.contains(f.toString())).collect(Collectors.toList());
 
 
-                List<ContractRelationJlyz> resultListJLTZ = baseMapper.selectByContractRelationJlyz(contractInfo.getId());
-                if (resultListJLTZ.size() > 0) {
-                    baseMapper.deleteContractRelationJLYZ(contractInfo.getId());
+                if (saveIds.size() > 0) {
+                    //同步
+                    this.syncUserInfoToContract(contractInfo, saveIds);
                 }
                 }
 
 
-                if (idList.size() > 0) {
-                    List<String> idList_SG = idList.stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
-                    idList_SG.forEach(ids -> {
-                        baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), ids);
-                    });
+                if (delIds.size() > 0) {
+                    //删除
+                    List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectService.getBaseMapper().selectList(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery()
+                            .eq(SaveUserInfoByProjectDTO::getProjectId, contractInfo.getPId())
+                            .eq(SaveUserInfoByProjectDTO::getIsRecordJlId, contractInfo.getId())
+                            .eq(SaveUserInfoByProjectDTO::getStatus, 1)
+                            .in(SaveUserInfoByProjectDTO::getContractId, delIds)
+                    );
+                    List<Long> ids = list.stream().map(SaveUserInfoByProjectDTO::getId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        saveUserInfoByProjectService.deleteBatchByIdsList(ids); //物理删除关联记录、用户roleId
+                    }
                 }
                 }
+
+                //中西试验室编辑
+            } else if (contractInfo.getContractType().equals(4)) {
+
             }
             }
 
 
-            return submitContractRelevantInfo(row, contractInfo);
+            return this.submitContractRelevantInfo(row, contractInfo);
+        }
+    }
+
+    @Async
+    void syncUserInfoToContract(ContractInfoVO contractInfo, List<String> saveSGIds) {
+        //当前监理合同段所有用户角色信息
+        String sql1 = "select * from m_project_assignment_user where contract_id = " + contractInfo.getId() + " and post_id is null and status = 1 and is_deleted = 0";
+        List<SaveUserInfoByProjectDTO> userRoleInfoJL = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+
+        if (userRoleInfoJL.size() > 0) {
+            for (String sgId : saveSGIds) {
+                //当前施工合同段所有用户角色信息
+                String sql2 = "select * from m_project_assignment_user where contract_id = " + sgId + " and post_id is null and status = 1 and is_deleted = 0";
+                List<SaveUserInfoByProjectDTO> userRoleInfoSG = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+
+                //去重
+                List<SaveUserInfoByProjectDTO> list = BeanUtil.copyProperties(userRoleInfoJL, SaveUserInfoByProjectDTO.class);
+                if (list.size() > 0) {
+                    Iterator<SaveUserInfoByProjectDTO> iterator = list.iterator();
+                    while (iterator.hasNext()) {
+                        SaveUserInfoByProjectDTO jl = iterator.next();
+                        for (SaveUserInfoByProjectDTO sg : userRoleInfoSG) {
+                            if (sg.getUserId().equals(jl.getUserId())) {
+                                //如果监理合同段与施工合同段中有相同的用户信息,就移除,一个用户只能存在一个合同段中
+                                iterator.remove();
+                            }
+                        }
+                    }
+                }
+
+                //重构入参
+                List<SaveUserInfoByProjectDTO> addList = new ArrayList<>();
+                for (SaveUserInfoByProjectDTO jl : list) {
+                    SaveUserInfoByProjectDTO newObj = BeanUtil.copyProperties(jl, SaveUserInfoByProjectDTO.class);
+                    assert newObj != null;
+                    newObj.setId(SnowFlakeUtil.getId());
+                    newObj.setContractId(sgId);
+                    newObj.setIsRecordJlId(contractInfo.getId()); //从监理合同段关联的数据,用于删除关联时同步删除用户信息
+                    addList.add(newObj);
+                }
+
+
+                if (addList.size() > 0) {
+                    //保存数据
+                    saveUserInfoByProjectService.saveBatch(addList);
+
+                    //更新用户roleId
+                    iUserClient.updateUserRoleId(addList);
+                }
+            }
         }
         }
     }
     }
 
 
-    private boolean submitContractRelevantInfo(boolean row, ContractInfoVO contractInfo) {
+    @Async
+    boolean submitContractRelevantInfo(boolean row, ContractInfoVO contractInfo) {
         if (row) {
         if (row) {
             List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda()
             List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda()
                     .eq(SaveUserInfoByProjectDTO::getProjectId, contractInfo.getPId())
                     .eq(SaveUserInfoByProjectDTO::getProjectId, contractInfo.getPId())

+ 43 - 61
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java

@@ -12,6 +12,8 @@ import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.feign.IUserClient;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
@@ -23,11 +25,9 @@ import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
-public class SaveUserInfoByProjectServiceImpl
-        extends BaseServiceImpl<SaveUserInfoByProjectMapper, SaveUserInfoByProjectDTO>
-        implements SaveUserInfoByProjectService {
+public class SaveUserInfoByProjectServiceImpl extends BaseServiceImpl<SaveUserInfoByProjectMapper, SaveUserInfoByProjectDTO> implements SaveUserInfoByProjectService {
 
 
-    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
 
 
     @Override
     @Override
     public List<User> findMaintenanceUser() {
     public List<User> findMaintenanceUser() {
@@ -50,31 +50,34 @@ public class SaveUserInfoByProjectServiceImpl
     }
     }
 
 
     @Override
     @Override
-    @Transactional(rollbackFor = Exception.class) //Todo
     public boolean deleteBatchByIdsList(List<Long> idsList) {
     public boolean deleteBatchByIdsList(List<Long> idsList) {
-        //获取该idsList信息
-        List<SaveUserInfoByProjectDTO> list = baseMapper.selectByIds(idsList);
+        //更新每一个user的roleId字段
+        List<SaveUserInfoByProjectDTO> list = baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().in(SaveUserInfoByProjectDTO::getId, idsList));
 
 
-        //获取userIdList
-        List<String> userIds = list.stream().map(SaveUserInfoByProjectDTO::getUserId).collect(Collectors.toList());
+        List<String> userIds = list.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList());
 
 
-        //roleIds可以看作同一个roleId
-        List<String> collect = list.stream().map(SaveUserInfoByProjectDTO::getRoleId).collect(Collectors.toList());
+        this.deleteByIdsPhysical(idsList);
 
 
-        String roleIds = "";
-        for (String s : collect) {
-            roleIds = s;
-        }
-
-        boolean b = iUserClient.updateUserRoleIdThree(userIds, roleIds);
+        if (userIds.size() > 0) {
+            for (String userId : userIds) {
+                //物理删除后,再根据userId查询当前用户中的最新角色信息
+                String sql = "select role_id from m_project_assignment_user where role_id is not null and post_id is null and user_id = " + userId;
+                List<SaveUserInfoByProjectDTO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
 
 
-        //物理删除项目合同段关联用户信息
-        int row = baseMapper.deleteByIdsPhysical(idsList);
+                List<String> collect = query.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
 
 
-        if (!b || row <= 0) {
-            throw new ServiceException("操作异常,请重新尝试");
+                if (collect.size() > 0) {
+                    String roleIds = org.apache.commons.lang.StringUtils.join(collect, ",");
+                    String updateSql = "update blade_user set role_id = '" + roleIds + "' where id = " + userId;
+                    jdbcTemplate.execute(updateSql);
+                } else {
+                    String updateSql = "update blade_user set role_id = null where id = " + userId;
+                    jdbcTemplate.execute(updateSql);
+                }
+            }
+            return true;
         }
         }
-        return true;
+        return false;
     }
     }
 
 
     @Override
     @Override
@@ -85,42 +88,27 @@ public class SaveUserInfoByProjectServiceImpl
         String projectId = saveUserInfoByProjectDTO.getProjectId();
         String projectId = saveUserInfoByProjectDTO.getProjectId();
         String userId = saveUserInfoByProjectDTO.getUserId();
         String userId = saveUserInfoByProjectDTO.getUserId();
 
 
-        //获取当前用户所绑定的所有项目角色信息
-        List<SaveUserInfoByProjectDTO> list1 = baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda()
-                .eq(SaveUserInfoByProjectDTO::getUserId, userId)
-                .isNull(SaveUserInfoByProjectDTO::getPostId)
-                .isNotNull(SaveUserInfoByProjectDTO::getRoleId)
-        );
-
-        //获取当前用户其他项目信息List
-        List<SaveUserInfoByProjectDTO> list2 = list1.stream().filter(f -> !f.getProjectId().equals(projectId) && f.getUserId().equals(userId)).collect(Collectors.toList());
-        List<String> roleIdListAllOther = list2.stream().map(SaveUserInfoByProjectDTO::getRoleId).collect(Collectors.toList());
-
-        //获取当前用户选择删除的项目下所有信息List
-        List<SaveUserInfoByProjectDTO> list3 = list1.stream().filter(f -> f.getProjectId().equals(projectId) && f.getUserId().equals(userId)).collect(Collectors.toList());
-        List<String> roleIdListCurrent = list3.stream().map(SaveUserInfoByProjectDTO::getRoleId).collect(Collectors.toList());
-
-        //保留的roleId
-        List<String> saveRoleIdListReally = new ArrayList<>();
-        for (String s : roleIdListAllOther) {
-            for (String s1 : roleIdListCurrent) {
-                if (s.equals(s1)) {
-                    saveRoleIdListReally.add(s);
-                }
-            }
-        }
-        roleIdListAllOther.addAll(saveRoleIdListReally);
-        //去重
-        List<String> resultRoleIds = roleIdListAllOther.stream().distinct().collect(Collectors.toList());
-
-        //物理删除
-        int row = baseMapper.deleteByCondition(projectId, userId);
+        if (com.alibaba.nacos.common.utils.StringUtils.isNotEmpty(userId)) {
+            //物理删除
+            baseMapper.deleteByCondition(projectId, userId);
 
 
-        //修改用户roleId
-        boolean result = this.updateUserRoleIdFour(resultRoleIds, userId);
+            //更新user的roleId字段
+            String sql = "select role_id from m_project_assignment_user where role_id is not null and post_id is null and user_id = " + userId;
+            List<SaveUserInfoByProjectDTO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
 
 
-        return row > 0 && result;
+            List<String> collect = query.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
 
 
+            if (collect.size() > 0) {
+                String roleIds = org.apache.commons.lang.StringUtils.join(collect, ",");
+                String updateSql = "update blade_user set role_id = '" + roleIds + "' where id = " + userId;
+                jdbcTemplate.execute(updateSql);
+            } else {
+                String updateSql = "update blade_user set role_id = null where id = " + userId;
+                jdbcTemplate.execute(updateSql);
+            }
+            return true;
+        }
+        return false;
     }
     }
 
 
     @Override
     @Override
@@ -128,10 +116,4 @@ public class SaveUserInfoByProjectServiceImpl
         return baseMapper.deleteByIdsPhysical(idsListTemp) > 0;
         return baseMapper.deleteByIdsPhysical(idsListTemp) > 0;
     }
     }
 
 
-    private boolean updateUserRoleIdFour(List<String> saveRoleIdListReally, String userId) {
-        String roleIds = StringUtils.join(saveRoleIdListReally, ",");
-        int row = baseMapper.updateUserRoleIdById(roleIds, userId);
-        return row > 0;
-    }
-
 }
 }

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

@@ -185,7 +185,10 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
 				vo.setUserIds(projectUserList.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList()));
 				vo.setUserIds(projectUserList.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList()));
 			}
 			}
 		}
 		}
-
+		//项目下没有人员直接返回
+		if (vo.getUserIds() == null){
+			return page.setRecords(null);
+		}
 		//汇总
 		//汇总
 		Integer count = this.baseMapper.countSignPfxFile(vo);
 		Integer count = this.baseMapper.countSignPfxFile(vo);
 		//设置总数
 		//设置总数

+ 62 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -354,7 +354,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
     }
 
 
     @Override
     @Override
-    public boolean updateBatchByIds(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId) {
+    public boolean updateBatchByIds(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId, Integer wbsType) {
         List<WbsTreePrivate> listPrivate = new ArrayList<>();
         List<WbsTreePrivate> listPrivate = new ArrayList<>();
         List<WbsTreeContract> listContract = new ArrayList<>();
         List<WbsTreeContract> listContract = new ArrayList<>();
         //获取当前项目下所有合同段信息
         //获取当前项目下所有合同段信息
@@ -397,13 +397,42 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             baseMapper.updateBatchWbsPrivate(listPrivate);
             baseMapper.updateBatchWbsPrivate(listPrivate);
         }
         }
         if (listContract.size() > 0) {
         if (listContract.size() > 0) {
-            wbsTreeContractMapper.updateBatchWbsContract(listContract);
+            //获取合同段下的复制、新增节点
+            List<WbsTreeContract> wbsTreeContractsCopyOrAddAll = new ArrayList<>();
+            for (ContractInfo contractInfo : contractInfos) {
+                List<WbsTreeContract> wbsTreeContractsCopyOrAdd = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                        .eq(WbsTreeContract::getProjectId, projectId)
+                        .eq(WbsTreeContract::getContractId, contractInfo.getId())
+                        .eq(WbsTreeContract::getWbsType, wbsType)
+                        .eq(WbsTreeContract::getType, 1)
+                        .isNotNull(WbsTreeContract::getOldId)
+                );
+                wbsTreeContractsCopyOrAddAll.addAll(wbsTreeContractsCopyOrAdd);
+            }
+
+            List<WbsTreeContract> listContractAdd = new ArrayList<>();
+
+            for (WbsTreeContract obj1 : listContract) {
+                for (WbsTreeContract obj2 : wbsTreeContractsCopyOrAddAll) {
+                    if (obj1.getId().toString().equals(obj2.getOldId()) && obj1.getProjectId().equals(obj2.getProjectId()) && obj1.getContractId().equals(obj2.getContractId())) {
+                        obj2.setNodeName(obj1.getNodeName());
+                        obj2.setNodeType(obj1.getNodeType());
+                        obj2.setMajorDataType(obj1.getMajorDataType());
+                        obj2.setTableType(obj1.getTableType());
+                        obj2.setTableOwner(obj1.getTableOwner());
+                        listContractAdd.add(obj2);
+                    }
+                }
+            }
+
+            listContractAdd.addAll(listContract);
+            wbsTreeContractMapper.updateBatchWbsContract(listContractAdd);
         }
         }
         return true;
         return true;
     }
     }
 
 
     @Override
     @Override
-    public boolean updateBatchByIds2(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String projectId, String wbsId) {
+    public boolean updateBatchByIds2(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String projectId, String wbsId, Integer wbsType) {
         List<WbsTreePrivate> listPrivate = new ArrayList<>();
         List<WbsTreePrivate> listPrivate = new ArrayList<>();
         List<WbsTreeContract> listContract = new ArrayList<>();
         List<WbsTreeContract> listContract = new ArrayList<>();
         //获取当前项目下所有合同段信息
         //获取当前项目下所有合同段信息
@@ -447,7 +476,36 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             baseMapper.updateBatchWbsPrivate(listPrivate);
             baseMapper.updateBatchWbsPrivate(listPrivate);
         }
         }
         if (listContract.size() > 0) {
         if (listContract.size() > 0) {
-            wbsTreeContractMapper.updateBatchWbsContract(listContract);
+            //获取合同段下的复制、新增节点
+            List<WbsTreeContract> wbsTreeContractsCopyOrAddAll = new ArrayList<>();
+            for (ContractInfo contractInfo : contractInfos) {
+                List<WbsTreeContract> wbsTreeContractsCopyOrAdd = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                        .eq(WbsTreeContract::getProjectId, projectId)
+                        .eq(WbsTreeContract::getContractId, contractInfo.getId())
+                        .eq(WbsTreeContract::getWbsType, wbsType)
+                        .eq(WbsTreeContract::getType, 1)
+                        .isNotNull(WbsTreeContract::getOldId)
+                );
+                wbsTreeContractsCopyOrAddAll.addAll(wbsTreeContractsCopyOrAdd);
+            }
+
+            List<WbsTreeContract> listContractAdd = new ArrayList<>();
+
+            for (WbsTreeContract obj1 : listContract) {
+                for (WbsTreeContract obj2 : wbsTreeContractsCopyOrAddAll) {
+                    if (obj1.getId().toString().equals(obj2.getOldId()) && obj1.getProjectId().equals(obj2.getProjectId()) && obj1.getContractId().equals(obj2.getContractId())) {
+                        obj2.setNodeName(obj1.getNodeName());
+                        obj2.setNodeType(obj1.getNodeType());
+                        obj2.setMajorDataType(obj1.getMajorDataType());
+                        obj2.setTableType(obj1.getTableType());
+                        obj2.setTableOwner(obj1.getTableOwner());
+                        listContractAdd.add(obj2);
+                    }
+                }
+            }
+
+            listContractAdd.addAll(listContract);
+            wbsTreeContractMapper.updateBatchWbsContract(listContractAdd);
         }
         }
         return true;
         return true;
     }
     }
@@ -1519,7 +1577,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return R.data(table + "");
         return R.data(table + "");
     }
     }
 
 
-
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
     public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
         try {
         try {

+ 87 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -1,6 +1,5 @@
 package org.springblade.manager.service.impl;
 package org.springblade.manager.service.impl;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -37,7 +36,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
-import javax.xml.soap.Text;
 import java.io.File;
 import java.io.File;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.*;
 import java.util.*;
@@ -53,6 +51,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final WbsTreePrivateServiceImpl wbsTreePrivateService;
     private final WbsTreePrivateServiceImpl wbsTreePrivateService;
     private final ProjectInfoMapper projectInfoMapper;
     private final ProjectInfoMapper projectInfoMapper;
+    private final WbsTreeContractServiceImpl wbsTreeContractService;
     private final WbsTreeContractMapper wbsTreeContractMapper;
     private final WbsTreeContractMapper wbsTreeContractMapper;
     private final ContractInfoMapper contractInfoMapper;
     private final ContractInfoMapper contractInfoMapper;
     private final TextdictInfoServiceImpl textDictInfoService;
     private final TextdictInfoServiceImpl textDictInfoService;
@@ -73,7 +72,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         if (AuthUtil.isAdministrator()) {
         if (AuthUtil.isAdministrator()) {
             tenantId = StringPool.EMPTY;
             tenantId = StringPool.EMPTY;
         }
         }
-        return ForestNodeMerger.merge(baseMapper.lazyTree(wbsId, tenantId, parentId));
+        List<WbsTreeVO> wbsTreeVOS = baseMapper.lazyTree(wbsId, tenantId, parentId);
+        return ForestNodeMerger.merge(wbsTreeVOS);
     }
     }
 
 
     @Override
     @Override
@@ -305,6 +305,75 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return false;
         return false;
     }
     }
 
 
+    @Override
+    public boolean syncNodeInfo(Long pKeyId) {
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, pKeyId).eq(WbsTreePrivate::getStatus, 1));
+
+        //获取当前项目引用
+        String sql = "select reference_wbs_template_id,reference_wbs_template_type,reference_wbs_template_id_trial,reference_wbs_template_type_trial from m_project_info where id = " + wbsTreePrivate.getProjectId();
+        ProjectInfo projectInfo = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ProjectInfo.class)).stream().findAny().orElse(null);
+        assert projectInfo != null;
+        if (("1").equals(wbsTreePrivate.getWbsType())) {
+            //质检公有
+            if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateId()) && (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateType()) && ("public").equals(projectInfo.getReferenceWbsTemplateType()))) {
+                //获取公有树
+                List<WbsTree> wbsTreeListAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, projectInfo.getReferenceWbsTemplateId()).eq(WbsTree::getType, 1).eq(WbsTree::getStatus, 1));
+                //获取项目私节点、元素表
+                List<WbsTreePrivate> wbsTreePrivatesAll = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateId()).eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getStatus, 1));
+                //同步修改
+                this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, wbsTreePrivate.getProjectId(), Integer.parseInt(wbsTreePrivate.getWbsType()));
+
+                //质检私有
+            } else if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateId()) && ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateType()) && ("private").equals(projectInfo.getReferenceWbsTemplateType())) {
+                //获取私有引用根节点
+                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateId()));
+                //获取私有引用项目树
+                List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRecord.getProjectId())
+                        .eq(WbsTreePrivate::getStatus, 1)
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, wbsTreePrivateRecord.getWbsId()).or().isNull(WbsTreePrivate::getWbsId))
+                );
+                //获取当前项目私有树、元素表
+                List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateId()).or().isNull(WbsTreePrivate::getWbsId))
+                );
+                //同步修改
+                this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, wbsTreePrivate.getProjectId(), projectInfo.getReferenceWbsTemplateId().toString(), Integer.parseInt(wbsTreePrivate.getWbsType()));
+            }
+
+        } else if (("2").equals(wbsTreePrivate.getWbsType())) {
+            //试验公有
+            if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateIdTrial()) && (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateTypeTrial()) && ("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial()))) {
+
+                List<WbsTree> wbsTreeListAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, projectInfo.getReferenceWbsTemplateId()).eq(WbsTree::getType, 1).eq(WbsTree::getStatus, 1));
+
+                List<WbsTreePrivate> wbsTreePrivatesAll = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateId()).eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getStatus, 1));
+
+                this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, wbsTreePrivate.getProjectId(), Integer.parseInt(wbsTreePrivate.getWbsType()));
+
+                //试验私有
+            } else if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateIdTrial()) && (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateTypeTrial()) && ("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial()))) {
+
+                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateIdTrial()));
+
+                List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .eq(WbsTreePrivate::getStatus, 1)
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, wbsTreePrivateRecord.getWbsId()).or().isNull(WbsTreePrivate::getWbsId))
+                );
+
+                List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateIdTrial()).or().isNull(WbsTreePrivate::getWbsId))
+                );
+
+                this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, wbsTreePrivate.getProjectId(), projectInfo.getReferenceWbsTemplateIdTrial().toString(), Integer.parseInt(wbsTreePrivate.getWbsType()));
+            }
+        }
+        return true;
+    }
+
 
 
     @Override
     @Override
     public List<WbsNodeTableVO> selectByNodeTable(String id) {
     public List<WbsNodeTableVO> selectByNodeTable(String id) {
@@ -455,8 +524,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
     }
 
 
     @Override
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean submitWbsTreeInProject(WbsTreeContractDTO pawDTO) {
+    public boolean submitWbsTreeInProject(WbsTreeContractDTO pawDTO) {
         try {
         try {
             if (StringUtils.isEmpty(pawDTO.getWbsId())) {
             if (StringUtils.isEmpty(pawDTO.getWbsId())) {
                 throw new ServiceException("请正确选择一个wbs模板");
                 throw new ServiceException("请正确选择一个wbs模板");
@@ -474,11 +542,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 idList2.addAll(collect);
                 idList2.addAll(collect);
             } else if (pawDTO.getReferenceType().equals("private")) {
             } else if (pawDTO.getReferenceType().equals("private")) {
                 //当前私有引用ids
                 //当前私有引用ids
-                List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
-                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                        .eq(WbsTreePrivate::getType, 1)
-                );
+                List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
                 List<String> collect = wbsTreePrivates2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
                 List<String> collect = wbsTreePrivates2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
                 idList2.addAll(collect);
                 idList2.addAll(collect);
             }
             }
@@ -486,9 +550,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
             List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
             List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
             List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
 
-            //1.同步修改节点基础信息、私有电签默认信息
+            //1.同步私有电签默认信息
             if (saveIds.size() == 0 && delIds.size() == 0) {
             if (saveIds.size() == 0 && delIds.size() == 0) {
-                if (pawDTO.getReferenceType().equals("public")) {
+                /*if (pawDTO.getReferenceType().equals("public")) {
                     //获取公有wbs树所有的节点、元素表
                     //获取公有wbs树所有的节点、元素表
                     List<WbsTree> wbsTreeListAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, Long.parseLong(pawDTO.getWbsId())).eq(WbsTree::getStatus, 1));
                     List<WbsTree> wbsTreeListAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, Long.parseLong(pawDTO.getWbsId())).eq(WbsTree::getStatus, 1));
 
 
@@ -498,7 +562,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     //修改公有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
                     //修改公有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
                     this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, pawDTO.getProjectId());
                     this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, pawDTO.getProjectId());
 
 
-                }
+                }*/
 
 
                 if (pawDTO.getReferenceType().equals("private")) {
                 if (pawDTO.getReferenceType().equals("private")) {
 
 
@@ -525,7 +589,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);
                     this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);
 
 
                     //同步私有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
                     //同步私有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
-                    this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, pawDTO.getProjectId(), pawDTO.getPrimaryKeyId());
+                    //this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, pawDTO.getProjectId(), pawDTO.getPrimaryKeyId());
 
 
                 }
                 }
 
 
@@ -593,6 +657,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 //3.新增
                 //3.新增
                 if (saveIds.size() > 0) {
                 if (saveIds.size() > 0) {
                     if (saveIds.size() >= 1000) {
                     if (saveIds.size() >= 1000) {
+                        //加锁
                         String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
                         String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
                         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
                         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
                             throw new ServiceException("请勿重复提交,请60秒后再尝试");
                             throw new ServiceException("请勿重复提交,请60秒后再尝试");
@@ -654,7 +719,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         List<Long> pIdsDL = wbsTreePrivates.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                         List<Long> pIdsDL = wbsTreePrivates.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                         String pKeyIds = StringUtils.join(pIdsDL, ",");
                         String pKeyIds = StringUtils.join(pIdsDL, ",");
                         String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + pKeyIds + ") and is_deleted = 0";
                         String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + pKeyIds + ") and is_deleted = 0";
-                        List<TextdictInfo> textDictInfosAll = jdbcTemplate.query(sql, new BeanPropertyRowMapper<TextdictInfo>(TextdictInfo.class));
+                        List<TextdictInfo> textDictInfosAll = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
 
 
                         for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
                         for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
@@ -737,11 +802,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
 
                         this.insertBatch(insertData1, 1000);
                         this.insertBatch(insertData1, 1000);
 
 
-                        //修改质检关联信息
                         if (pawDTO.getWbsType() == 1) {
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
                         }
-                        //修改试验关联信息
                         if (pawDTO.getWbsType() == 2) {
                         if (pawDTO.getWbsType() == 2) {
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
                         }
@@ -753,16 +816,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         //电签
                         //电签
                         textDictInfoService.insertBatch(insertData3, 1000);
                         textDictInfoService.insertBatch(insertData3, 1000);
 
 
-                        //修改质检关联信息
                         if (pawDTO.getWbsType() == 1) {
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
                         }
-                        //修改试验关联信息
                         if (pawDTO.getWbsType() == 2) {
                         if (pawDTO.getWbsType() == 2) {
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
                         }
                     }
                     }
                     if (saveIds.size() >= 1000) {
                     if (saveIds.size() >= 1000) {
+                        //解锁
                         bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
                         bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
                         bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
                         bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
                     }
                     }
@@ -801,14 +863,14 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
     }
 
 
     @Async
     @Async
-    public boolean updateWbsInfoPrivateAsync(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId) {
-        return wbsTreePrivateService.updateBatchByIds(wbsTreeListAll, wbsTreePrivatesAll, projectId);
+    public boolean updateWbsInfoPrivateAsync(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId, Integer wbsType) {
+        return wbsTreePrivateService.updateBatchByIds(wbsTreeListAll, wbsTreePrivatesAll, projectId, wbsType);
     }
     }
 
 
     @Async
     @Async
     public boolean updateWbsInfoContractAsync(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String
     public boolean updateWbsInfoContractAsync(List<WbsTreePrivate> wbsTreePrivates, List<WbsTreePrivate> wbsTreePrivatesAllNow, String
-            projectId, String primaryKeyId) {
-        return wbsTreePrivateService.updateBatchByIds2(wbsTreePrivates, wbsTreePrivatesAllNow, projectId, primaryKeyId);
+            projectId, String primaryKeyId, Integer wbsType) {
+        return wbsTreePrivateService.updateBatchByIds2(wbsTreePrivates, wbsTreePrivatesAllNow, projectId, primaryKeyId, wbsType);
     }
     }
 
 
     //新增独立表单库数据
     //新增独立表单库数据
@@ -899,7 +961,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<Long> pIdsDL = wbsTreePrivateOldTables.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
             List<Long> pIdsDL = wbsTreePrivateOldTables.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
             String ids = StringUtils.join(pIdsDL, ",");
             String ids = StringUtils.join(pIdsDL, ",");
             String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + ids + ") and is_deleted = 0";
             String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + ids + ") and is_deleted = 0";
-            List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<TextdictInfo>(TextdictInfo.class));
+            List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
 
 
             for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateOldTables) {
             for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateOldTables) {
                 //私有引用-电签匹配数据、默认信息数据,根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
                 //私有引用-电签匹配数据、默认信息数据,根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
@@ -931,7 +993,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<Long> pIdsDLNew = wbsTreePrivateNewTables.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
             List<Long> pIdsDLNew = wbsTreePrivateNewTables.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
             String ids = StringUtils.join(pIdsDLNew, ",");
             String ids = StringUtils.join(pIdsDLNew, ",");
             String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + ids + ") and is_deleted = 0";
             String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + ids + ") and is_deleted = 0";
-            List<TextdictInfo> textDictInfosNew = jdbcTemplate.query(sql, new BeanPropertyRowMapper<TextdictInfo>(TextdictInfo.class));
+            List<TextdictInfo> textDictInfosNew = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
 
 
             Iterator<TextdictInfo> iterator = insertData.iterator();
             Iterator<TextdictInfo> iterator = insertData.iterator();
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {

+ 0 - 6
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -27,7 +27,6 @@ import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
 import org.springblade.system.user.entity.UserOauth;
 import org.springblade.system.user.enums.UserEnum;
 import org.springblade.system.user.enums.UserEnum;
 import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.service.IUserService;
-import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -115,11 +114,6 @@ public class UserClient implements IUserClient {
         return service.updateUserRoleIdTwo(userId, roleId);
         return service.updateUserRoleIdTwo(userId, roleId);
     }
     }
 
 
-    @Override
-    public boolean updateUserRoleIdThree(List<String> userIds, String roleIds) {
-        return service.updateUserRoleIdThree(userIds, roleIds);
-    }
-
     @Override
     @Override
     public List<User> selectUserAll() {
     public List<User> selectUserAll() {
         return service.selectUserAll();
         return service.selectUserAll();

+ 0 - 2
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -237,8 +237,6 @@ public interface IUserService extends BaseService<User> {
 
 
     boolean updateUserRoleIdTwo(String userId, String roleId);
     boolean updateUserRoleIdTwo(String userId, String roleId);
 
 
-    boolean updateUserRoleIdThree(List<String> userIds, String roleIds);
-
     List<UserVO> selectUserListByCondition();
     List<UserVO> selectUserListByCondition();
 
 
     List<User> selectUserAll();
     List<User> selectUserAll();

+ 39 - 78
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -61,11 +61,14 @@ import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserContractInfoVO;
 import org.springblade.system.user.vo.UserVO;
 import org.springblade.system.user.vo.UserVO;
 import org.springblade.system.user.wrapper.UserWrapper;
 import org.springblade.system.user.wrapper.UserWrapper;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import sun.security.rsa.RSASignature;
 import sun.security.rsa.RSASignature;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 
 
@@ -85,6 +88,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     private final BladeTenantProperties tenantProperties;
     private final BladeTenantProperties tenantProperties;
     private final ContractClient contractClient;
     private final ContractClient contractClient;
     private final SaveUserInfoByProjectClient saveUserInfoByProjectClient;
     private final SaveUserInfoByProjectClient saveUserInfoByProjectClient;
+    private final JdbcTemplate jdbcTemplate;
 
 
 
 
     @Override
     @Override
@@ -591,102 +595,59 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
      */
      */
     @Override
     @Override
     public boolean updateUserRoleId(List<SaveUserInfoByProjectDTO> list) {
     public boolean updateUserRoleId(List<SaveUserInfoByProjectDTO> list) {
-        String roleId1 = "";
-        String id = "";
-        for (SaveUserInfoByProjectDTO l : list) {
-            roleId1 = l.getRoleId();
-            id = l.getUserId();
-        }
-        //去重
-        User user = baseMapper.selectById(id);
-        String roleId2 = user.getRoleId();
-        boolean b = false;
-        if (roleId2 != null && roleId2.contains(roleId1)) {
-            //存在
-            b = false;
-        } else {
-            if (StringUtils.isEmpty(roleId2) || ("").equals(roleId2)) {
-                //第一次新增
-                int row = baseMapper.updateRoleId(id, roleId1);
-                if (row > 0) {
-                    b = true;
-                }
-            } else {
-                int row = baseMapper.updateRoleIdById(id, roleId1);
-                if (row > 0) {
-                    b = true;
+        List<String> userIds = list.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList());
+        if (userIds.size() > 0) {
+            for (String userId : userIds) {
+                //更新user的roleId字段
+                String sql = "select role_id from m_project_assignment_user where role_id is not null and post_id is null and user_id = " + userId;
+                List<SaveUserInfoByProjectDTO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+
+                List<String> collect = query.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
+
+                if (collect.size() > 0) {
+                    String roleIds = org.apache.commons.lang.StringUtils.join(collect, ",");
+                    String updateSql = "update blade_user set role_id = '" + roleIds + "' where id = " + userId;
+                    jdbcTemplate.execute(updateSql);
+
+                } else {
+                    String updateSql = "update blade_user set role_id = null where id = " + userId;
+                    jdbcTemplate.execute(updateSql);
                 }
                 }
             }
             }
+            return true;
         }
         }
-        return b;
+        return false;
     }
     }
 
 
     /**
     /**
      * 删除RoleId
      * 删除RoleId
      *
      *
-     * @param id
-     * @param roleId
+     * @param id     = userId
+     * @param roleId = roleId
      * @return
      * @return
      */
      */
     @Override
     @Override
     public boolean updateUserRoleIdTwo(String id, String roleId) {
     public boolean updateUserRoleIdTwo(String id, String roleId) {
-        User user = baseMapper.selectById(id);
-        if (user.getRoleId() != null && !user.getRoleId().equals("")) {
-            if (user.getRoleId().contains(roleId)) {
-                String[] split = user.getRoleId().split(",");
-                String replace = "";
-                if (split[0].equals(roleId)) {
-                    replace = user.getRoleId().replace(roleId, "");
-                } else {
-                    replace = user.getRoleId().replace("," + roleId, "");
-                }
-                //查询当前项目不同合同段中删除的角色是否存在多条引用同种角色,RoleId相同
-                List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectClient.searchUserInfoAndProject(id, roleId);
-                if (list.size() >= 2) {
-                    //不删除,还有合同段引用中
-                    return true;
-                } else {
-                    //删除
-                    int i = baseMapper.updateRoleIdByIdTwo(id, replace);
-                    return i > 0;
-                }
+        if (StringUtils.isNotEmpty(id)) {
+            //更新user的roleId字段
+            String sql = "select role_id from m_project_assignment_user where role_id is not null and post_id is null and user_id = " + id;
+            List<SaveUserInfoByProjectDTO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
 
 
+            List<String> collect = query.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
+
+            if (collect.size() > 0) {
+                String roleIds = org.apache.commons.lang.StringUtils.join(collect, ",");
+                String updateSql = "update blade_user set role_id = '" + roleIds + "' where id = " + id;
+                jdbcTemplate.execute(updateSql);
+            } else {
+                String updateSql = "update blade_user set role_id = null where id = " + id;
+                jdbcTemplate.execute(updateSql);
             }
             }
+            return true;
         }
         }
         return false;
         return false;
     }
     }
 
 
-    @Override
-    public boolean updateUserRoleIdThree(List<String> userIds, String roleIds) {
-        //获取userList
-        List<User> userList = baseMapper.selectBatchIds(userIds);
-        userList.forEach(user -> {
-            if ((user.getRoleId() != null) && (!user.getRoleId().equals(""))) {
-                if (user.getRoleId().contains(roleIds)) {
-                    String[] split = user.getRoleId().split(",");
-                    String replace = "";
-                    if (split[0].equals(roleIds)) {
-                        replace = user.getRoleId().replace(roleIds, "");
-                    } else {
-                        replace = user.getRoleId().replace("," + roleIds, "");
-                    }
-                    List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectClient.searchUserInfoAndProject(String.valueOf(user.getId()), roleIds);
-                    if (list.size() >= 2) {
-                        //不删除,还有合同段引用中
-                        return;
-                    } else {
-                        //删除
-                        int i = baseMapper.updateRoleIdByIdTwo(String.valueOf(user.getId()), replace);
-                        if (i > 0) {
-                            return;
-                        }
-                    }
-                }
-            }
-        });
-        return true;
-    }
-
     @Override
     @Override
     public List<UserVO> selectUserListByCondition() {
     public List<UserVO> selectUserListByCondition() {
         return baseMapper.selectUserListByCondition();
         return baseMapper.selectUserListByCondition();