Browse Source

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

huangtf 2 years ago
parent
commit
a9912ba389
42 changed files with 692 additions and 132 deletions
  1. 10 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ArchiveFile.java
  2. 13 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialLaboratoryUserArchives.java
  3. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ArchiveTreeContractAutoRuleMapDTO.java
  4. 8 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java
  5. 0 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveAutoRuleWbs.java
  6. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialClassificationConfiguration.java
  7. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  8. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialClassificationConfigurationTree.java
  9. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO.java
  10. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDeviceClassificationController.java
  11. 7 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java
  12. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSievePoreController.java
  13. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  14. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialDeviceClassificationService.java
  15. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialMaterialMobilizationService.java
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSampleInfoService.java
  17. 9 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  18. 33 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceClassificationServiceImpl.java
  19. 26 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDeviceInfoServiceImpl.java
  20. 4 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java
  21. 5 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java
  22. 23 9
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  23. 4 10
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  24. 9 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  25. 7 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java
  26. 14 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialClassificationConfigurationController.java
  27. 13 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java
  28. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  29. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveAutoRuleWbsMapper.java
  30. 11 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveAutoRuleWbsMapper.xml
  31. 6 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java
  32. 7 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml
  33. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TrialClassificationConfigurationMapper.java
  34. 13 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TrialClassificationConfigurationMapper.xml
  35. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
  36. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ITrialClassificationConfigurationService.java
  37. 227 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleWbsServiceImpl.java
  38. 152 20
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  39. 23 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  40. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TrialClassificationConfigurationServiceImpl.java
  41. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  42. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ForestNodeMerger.java

+ 10 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ArchiveFile.java

@@ -243,4 +243,14 @@ public class ArchiveFile extends BaseEntity {
 	//是否案卷收集上传的案卷
 	@ApiModelProperty("是否案卷收集上传的案卷")
 	private Integer isAutoFile;
+
+
+	/**
+	 * 是否已组卷  0或null 未组卷  1已组卷
+	 */
+	@ApiModelProperty("是否组卷")
+	private Integer isArchive;
+
+
+
 }

+ 13 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialLaboratoryUserArchives.java

@@ -7,6 +7,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.util.Date;
 
 /**
@@ -28,6 +31,7 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 姓名
      */
     @ApiModelProperty("姓名")
+    @Size(max = 5, min = 2, message = "长度必须大于等于5或小于等于2")
     private String name;
 
     /**
@@ -52,6 +56,7 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 身份证
      */
     @ApiModelProperty("身份证")
+    @Size(max = 18, min = 18, message = "长度必须等于18个字符长度")
     private String idCard;
 
     /**
@@ -65,6 +70,7 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 毕业院校
      */
     @ApiModelProperty("毕业院校")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String graduationSchool;
 
     /**
@@ -78,30 +84,35 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 职称
      */
     @ApiModelProperty("职称")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String jobTitleName;
 
     /**
      * 部门
      */
     @ApiModelProperty("部门")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String department;
 
     /**
      * 专业
      */
     @ApiModelProperty("专业")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String major;
 
     /**
      * 工作职务
      */
     @ApiModelProperty("工作职务")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String jobTitlePost;
 
     /**
      * 从事检测工作时间(月)
      */
     @ApiModelProperty("从事检测工作时间(月)")
+    @Max(value = 10, message = "长度必须在范围0-10之间")
     private Integer workingTime;
 
     /**
@@ -143,6 +154,7 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 证书编号
      */
     @ApiModelProperty("证书编号")
+    @Size(max = 100, message = "长度必须小于100个字符长度")
     private String certificateNo;
 
     /**
@@ -174,6 +186,7 @@ public class TrialLaboratoryUserArchives extends BaseEntity {
      * 工作内容
      */
     @ApiModelProperty("工作内容")
+    @Size(max = 1000, message = "长度必须小于1000个字符长度")
     private String workContent;
 
     /**

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

@@ -15,4 +15,6 @@ public class ArchiveTreeContractAutoRuleMapDTO {
 
     private String selectNodeIds; //分类并卷设置选择的节点(鼠标点着的节点,不要父节点和子节点)
 
+    private Long projectId;
+
 }

+ 8 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java

@@ -3,11 +3,14 @@ package org.springblade.manager.dto;
 import com.alibaba.fastjson.annotation.JSONField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -74,22 +77,23 @@ public class RangeInfo {
 
     public void build(){
         if(Func.isNotBlank(this.design)){
-            this.gDesign= Arrays.stream(this.design.split("[^\\d.]+")).filter(Func::isNumeric).map(Func::toDouble).collect(Collectors.toList());
+            this.gDesign= Arrays.stream(this.design.split("[^\\d.]+")).filter(BaseUtils::isNumber).map(Func::toDouble).collect(Collectors.toList());
         }
         if(Func.isNotBlank(this.size)){
-            this.gSize= Arrays.stream(this.size.split("[^\\d.]+")).filter(Func::isNumeric).map(Func::toInt).collect(Collectors.toList());
+            this.gSize= Arrays.stream(this.size.split("[^\\d.]+")).filter(BaseUtils::isNumber).map(Func::toInt).collect(Collectors.toList());
         }
         if(Func.isNotBlank(this.dev)){
             this.gDev= Arrays.stream(this.dev.split("/+")).collect(Collectors.toList());
         }
         if(Func.isNotBlank(this.pass)){
-            this.gPass= Arrays.stream(this.pass.split("[^\\d.%]+")).filter(Func::isNumeric).map(Func::toInt).collect(Collectors.toList());
+            this.gPass= Arrays.stream(this.pass.split("[^\\d.%]+")).filter(BaseUtils::isNumber).map(Func::toInt).collect(Collectors.toList());
         }
         if(Func.isNotBlank(this.capacity)){
-            this.gCapacity= Arrays.stream(this.capacity.split("[^\\d.]+")).filter(Func::isNumeric).map(Func::toInt).collect(Collectors.toList());
+            this.gCapacity= Arrays.stream(this.capacity.split("[^\\d.]+")).filter(BaseUtils::isNumber).map(Func::toInt).collect(Collectors.toList());
         }
     }
 
+
     public void setSize(String size) {
         this.size = size;
     }

+ 0 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveAutoRuleWbs.java

@@ -55,10 +55,6 @@ public class ArchiveAutoRuleWbs extends BaseEntity {
 	* 项目id 系统级的为0
 	*/
 		private Long projectId;
-	/**
-	* 1删除  0正常
-	*/
-		private Integer delete;
 
 
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialClassificationConfiguration.java

@@ -17,6 +17,12 @@ public class TrialClassificationConfiguration extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 节点名
+     */
+    @ApiModelProperty(value = "合同段id")
+    private String contractId;
+
     /**
      * 节点名
      */

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -193,4 +193,6 @@ public class ArchiveTreeVO2 implements INodeEx<ArchiveTreeVO2> {
 
     private boolean iswbsNode;  //是否为关联的wbs节点
 
+    private Long wbsNode2ArchiveTreeNodeId;  //wbs节点关联归档树节点ID
+
 }

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialClassificationConfigurationTree.java

@@ -9,6 +9,8 @@ public class TrialClassificationConfigurationTree extends BaseNode<TrialClassifi
 
     private Long id;
 
+    private Long contractId;
+
     private String nodeName;
 
     private Integer nodeType;
@@ -21,4 +23,7 @@ public class TrialClassificationConfigurationTree extends BaseNode<TrialClassifi
 
     private boolean hasChildren;
 
+    //是否存在数据 1=存在 0=不存在
+    private Integer isData;
+
 }

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

@@ -58,5 +58,9 @@ public class WbsTreePrivateVO extends WbsTreePrivate implements INode<WbsTreePri
      */
     private String mixRatioTestIds;
 
+    /**
+     * title名称
+     */
+    private String title;
 
 }

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDeviceClassificationController.java

@@ -24,6 +24,13 @@ public class TrialDeviceClassificationController extends BladeController {
 
     private final ITrialDeviceClassificationService iTrialDeviceClassificationService;
 
+    @PostMapping("/class-init")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "分类初始化", notes = "传入合同段id")
+    public String classInit(@RequestParam Long contractId) {
+        return iTrialDeviceClassificationService.classInit(contractId);
+    }
+
     @PostMapping("/class-submit")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "分类新增或修改", notes = "传入TrialDeviceClassification对象")

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

@@ -43,9 +43,9 @@ public class TrialMaterialController extends BladeController {
 
     @GetMapping("/mobilization/verification")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "进场材料校验编号唯一", notes = "传入materialNumber,id")
-    public R<Object> mobilizationVerification(@Valid @RequestParam String materialNumber, @RequestParam String id) {
-        return R.data(iTrialMaterialMobilizationService.mobilizationVerification(materialNumber, id));
+    @ApiOperation(value = "进场材料校验编号唯一", notes = "传入materialNumber,id,contractId")
+    public R<Object> mobilizationVerification(@Valid @RequestParam String materialNumber, @RequestParam String id, @RequestParam String contractId) {
+        return R.data(iTrialMaterialMobilizationService.mobilizationVerification(materialNumber, id, contractId));
     }
 
     @GetMapping("/mobilization/sampling-record")
@@ -58,7 +58,7 @@ public class TrialMaterialController extends BladeController {
     @PostMapping("/mobilization/upload-file")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "附件上传", notes = "传入材料id、type、url地址")
-    public R<Object> uploadFiles(@RequestParam("id") String id,@RequestParam("type") Integer type,@RequestParam("url") String url) {
+    public R<Object> uploadFiles(@RequestParam("id") String id, @RequestParam("type") Integer type, @RequestParam("url") String url) {
         return R.data(iTrialMaterialMobilizationService.uploadFile(id, type, url));
     }
 
@@ -173,9 +173,9 @@ public class TrialMaterialController extends BladeController {
 
     @GetMapping("/sample/verification")
     @ApiOperationSupport(order = 17)
-    @ApiOperation(value = "样品材料校验编号唯一", notes = "传入specificationNumber,id")
-    public R<Object> sampleVerification(@Valid @RequestParam String specificationNumber, @RequestParam String id) {
-        return R.data(iTrialSampleInfoService.sampleVerification(specificationNumber, id));
+    @ApiOperation(value = "样品材料校验编号唯一", notes = "传入specificationNumber,id,contractId")
+    public R<Object> sampleVerification(@Valid @RequestParam String specificationNumber, @RequestParam String id, @RequestParam String contractId, @RequestParam String nodeId) {
+        return R.data(iTrialSampleInfoService.sampleVerification(specificationNumber, id, contractId, nodeId));
     }
 
 }

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

@@ -9,10 +9,13 @@ import org.springblade.business.entity.TrialSievePoreClassificationData;
 import org.springblade.business.service.ITrialSievePoreClassificationDataService;
 import org.springblade.business.service.ITrialSievePoreClassificationService;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -26,6 +29,7 @@ public class TrialSievePoreController extends BladeController {
 
     private final ITrialSievePoreClassificationService iTrialSievePoreClassificationService;
     private final ITrialSievePoreClassificationDataService iTrialSievePoreClassificationDataService;
+    private final JdbcTemplate jdbcTemplate;
 
     @GetMapping("/classification/detail")
     @ApiOperationSupport(order = 1)
@@ -45,6 +49,10 @@ public class TrialSievePoreController extends BladeController {
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "筛孔分类删除", notes = "传入id")
     public R<Object> classificationRemove(@Valid @RequestParam String id) {
+        List<TrialSievePoreClassificationData> query = jdbcTemplate.query("select id from u_trial_sieve_pore_classification_data where class_id =" + id, new BeanPropertyRowMapper<>(TrialSievePoreClassificationData.class));
+        if (query.size() > 0) {
+            throw new ServiceException("当前分类下存在数据,删除失败");
+        }
         return R.status(iTrialSievePoreClassificationService.deleteLogic(Func.toLongList(id)));
     }
 

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

@@ -50,6 +50,7 @@
         <result column="box_name" property="boxName"/>
         <result column="box_number" property="boxNumber"/>
         <result column="is_auto_file" property="isAutoFile"/>
+        <result column="is_archive" property="isArchive"/>
     </resultMap>
     <update id="recoveryByIds">
         update u_archive_file set is_deleted = 0 where

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

@@ -9,6 +9,8 @@ import java.util.Map;
 
 public interface ITrialDeviceClassificationService extends BaseService<TrialDeviceClassification> {
 
+    String classInit(Long contractId);
+
     boolean classSubmit(TrialDeviceClassification obj);
 
     TrialDeviceClassification classDetail(Long id);

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

@@ -7,6 +7,7 @@ import org.springblade.business.excel.TrialMaterialMobilizationExcel;
 import org.springblade.business.vo.TrialMaterialMobilizationVO;
 import org.springblade.business.vo.TrialSamplingRecordVO;
 import org.springblade.core.mp.base.BaseService;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.HttpServletResponse;
 import java.text.ParseException;
@@ -15,7 +16,7 @@ import java.util.List;
 
 public interface ITrialMaterialMobilizationService extends BaseService<TrialMaterialMobilization> {
 
-    boolean mobilizationVerification(String number, String id);
+    boolean mobilizationVerification(String number, String id, String contractId);
 
     boolean mobilizationSubmit(TrialMaterialMobilization obj);
 

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

@@ -26,7 +26,7 @@ public interface ITrialSampleInfoService extends BaseService<TrialSampleInfo> {
 
     String sampleExportPdf(String ids, HttpServletResponse response);
 
-    boolean sampleVerification(String specificationNumber, String id);
+    boolean sampleVerification(String specificationNumber, String id, String contractId, String nodeId);
 
     List<TrialSampleInfoVO2> useDeviceList(Long nodeId);
 

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

@@ -52,17 +52,22 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
 
     @Override
     public boolean dataSubmit(TrialDetectionData obj) {
+        if (ObjectUtil.isEmpty(obj.getReportNo()) || ObjectUtil.isEmpty(obj.getEntrustNo())) {
+            throw new ServiceException("委托编号、报告编号不能为空");
+        }
         List<TrialDetectionData> trialDetectionData = baseMapper.selectList(Wrappers.<TrialDetectionData>lambdaQuery()
                 .select(TrialDetectionData::getId)
                 .isNotNull(TrialDetectionData::getReportNo)
+                .eq(TrialDetectionData::getContractId, obj.getContractId())
+                .eq(TrialDetectionData::getNodeId, obj.getNodeId())
                 .eq(TrialDetectionData::getReportNo, obj.getReportNo()));
         if (ObjectUtil.isEmpty(obj.getId()) && trialDetectionData.size() > 0) {
-            throw new ServiceException("报告编号已存在,请重新填写");
+            throw new ServiceException("报告编号在当前合同段节点下已存在,请重新填写");
         }
         if (ObjectUtil.isNotEmpty(obj.getId()) && trialDetectionData.size() > 0) {
             TrialDetectionData data = trialDetectionData.stream().findAny().orElse(null);
             if (!obj.getId().equals(data.getId())) {
-                throw new ServiceException("报告编号已存在,请重新填写");
+                throw new ServiceException("报告编号在当前合同段节点下已存在,请重新填写");
             }
         }
 
@@ -71,12 +76,12 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                 .isNotNull(TrialDetectionData::getEntrustNo)
                 .eq(TrialDetectionData::getEntrustNo, obj.getEntrustNo()));
         if (ObjectUtil.isEmpty(obj.getId()) && trialDetectionData2.size() > 0) {
-            throw new ServiceException("委托编号已存在,请重新填写");
+            throw new ServiceException("委托编号在当前合同段节点下已存在,请重新填写");
         }
         if (ObjectUtil.isNotEmpty(obj.getId()) && trialDetectionData2.size() > 0) {
             TrialDetectionData data = trialDetectionData2.stream().findAny().orElse(null);
             if (!obj.getId().equals(data.getId())) {
-                throw new ServiceException("委托编号已存在,请重新填写");
+                throw new ServiceException("委托编号在当前合同段节点下已存在,请重新填写");
             }
         }
 

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

@@ -8,13 +8,13 @@ import org.springblade.business.mapper.TrialDeviceClassificationMapper;
 import org.springblade.business.mapper.TrialDeviceInfoMapper;
 import org.springblade.business.service.ITrialDeviceClassificationService;
 import org.springblade.business.vo.TrialDeviceInfoVO2;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.security.Security;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -23,6 +23,35 @@ public class TrialDeviceClassificationServiceImpl extends BaseServiceImpl<TrialD
 
     private final TrialDeviceInfoMapper trialDeviceInfoMapper;
 
+    @Override
+    public String classInit(Long contractId) {
+        List<String> names = Arrays.asList("力学室", "集料室", "土工室", "水泥室", "外检室", "标养室", "其他");
+        List<TrialDeviceClassification> trialDeviceClassifications = baseMapper.selectList(Wrappers.<TrialDeviceClassification>lambdaQuery().in(TrialDeviceClassification::getClassName, names));
+        if (trialDeviceClassifications.size() == 0) {
+            //初始化
+            int sort = 1;
+            List<TrialDeviceClassification> data = new ArrayList<>();
+            for (String name : names) {
+                TrialDeviceClassification obj = new TrialDeviceClassification();
+                obj.setId(SnowFlakeUtil.getId());
+                obj.setClassName(name);
+                obj.setContractId(contractId);
+                obj.setSort(sort++);
+                obj.setStatus(1);
+                obj.setIsDeleted(0);
+                obj.setCreateTime(new Date());
+                obj.setUpdateTime(new Date());
+                obj.setCreateUser(SecureUtil.getUserId());
+                data.add(obj);
+            }
+            if (data.size() > 0) {
+                this.saveBatch(data);
+                return "初始化成功";
+            }
+        }
+        return "无需初始化";
+    }
+
     @Override
     public boolean classSubmit(TrialDeviceClassification obj) {
         return this.saveOrUpdate(obj);

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

@@ -31,6 +31,8 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
@@ -43,6 +45,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service
@@ -51,14 +54,18 @@ public class TrialDeviceInfoServiceImpl extends BaseServiceImpl<TrialDeviceInfoM
 
     private final NewIOSSClient newIOSSClient;
     private final TrialDeviceClassificationMapper trialDeviceClassificationMapper;
+    private final JdbcTemplate jdbcTemplate;
 
     @Override
     public boolean submit(TrialDeviceInfo obj) {
-        TrialDeviceInfo selectOne = baseMapper.selectOne(Wrappers.<TrialDeviceInfo>lambdaQuery().select(TrialDeviceInfo::getId, TrialDeviceInfo::getDeviceName).eq(TrialDeviceInfo::getDeviceNumber, obj.getDeviceNumber()));
+        TrialDeviceInfo selectOne = baseMapper.selectOne(Wrappers.<TrialDeviceInfo>lambdaQuery()
+                .select(TrialDeviceInfo::getId, TrialDeviceInfo::getDeviceName)
+                .eq(TrialDeviceInfo::getDeviceClassId, obj.getDeviceClassId())
+                .eq(TrialDeviceInfo::getDeviceNumber, obj.getDeviceNumber()));
 
         if (ObjectUtil.isNotEmpty(obj.getId())) { //编辑
             if (ObjectUtil.isNotEmpty(selectOne) && !selectOne.getId().equals(obj.getId())) {
-                throw new ServiceException("当前设备编号已存在,请重新填写");
+                throw new ServiceException("当前设备编号在当前分类中已存在,请重新填写");
             }
 
             TrialDeviceInfo trialDeviceInfo = baseMapper.selectById(obj.getId());
@@ -69,7 +76,7 @@ public class TrialDeviceInfoServiceImpl extends BaseServiceImpl<TrialDeviceInfoM
             }
         } else { //新增
             if (ObjectUtil.isNotEmpty(selectOne)) {
-                throw new ServiceException("当前设备编号已存在,请重新填写");
+                throw new ServiceException("当前设备编号在当前分类中已存在,请重新填写");
             }
         }
 
@@ -348,11 +355,26 @@ public class TrialDeviceInfoServiceImpl extends BaseServiceImpl<TrialDeviceInfoM
             }
         }
         if (listData.size() > 0) {
-            List<String> numbers = listData.stream().map(TrialDeviceInfo::getDeviceNumber).collect(Collectors.toList());
+            /*List<String> numbers = listData.stream().map(TrialDeviceInfo::getDeviceNumber).collect(Collectors.toList());
             List<TrialDeviceInfo> trialDeviceInfos = baseMapper.selectList(Wrappers.<TrialDeviceInfo>lambdaQuery().select(TrialDeviceInfo::getId, TrialDeviceInfo::getDeviceName).in(TrialDeviceInfo::getDeviceNumber, numbers));
             if (trialDeviceInfos.size() > 0) {
                 List<String> collect = trialDeviceInfos.stream().map(TrialDeviceInfo::getDeviceName).collect(Collectors.toList());
                 throw new ServiceException("【" + StringUtils.join(collect, ",") + "】的设备编号重复,请重新填写设备编号");
+            }*/
+
+            Map<Long, List<TrialDeviceInfo>> collect = listData.stream().collect(Collectors.groupingBy(TrialDeviceInfo::getDeviceClassId));
+            for (Map.Entry<Long, List<TrialDeviceInfo>> longListEntry : collect.entrySet()) {
+                Long classId = longListEntry.getKey();
+                TrialDeviceClassification trialDeviceClassification = jdbcTemplate.query("select class_name from u_trial_device_classification where id = " + classId, new BeanPropertyRowMapper<>(TrialDeviceClassification.class)).stream().findAny().orElse(null);
+                List<String> numbers = longListEntry.getValue().stream().map(TrialDeviceInfo::getDeviceNumber).collect(Collectors.toList());
+                List<TrialDeviceInfo> trialDeviceInfos = baseMapper.selectList(Wrappers.<TrialDeviceInfo>lambdaQuery()
+                        .select(TrialDeviceInfo::getId, TrialDeviceInfo::getDeviceName)
+                        .eq(TrialDeviceInfo::getDeviceClassId, classId)
+                        .in(TrialDeviceInfo::getDeviceNumber, numbers));
+                if (trialDeviceInfos.size() > 0 && trialDeviceClassification != null) {
+                    List<String> deviceNames = trialDeviceInfos.stream().map(TrialDeviceInfo::getDeviceName).collect(Collectors.toList());
+                    throw new ServiceException(trialDeviceClassification.getClassName() + "中的【" + StringUtils.join(deviceNames, ",") + "】设备编号重复,请重新填写该设备编号");
+                }
             }
 
             return this.saveBatch(listData, 1000);

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

@@ -67,8 +67,10 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
     private final JdbcTemplate jdbcTemplate;
 
     @Override
-    public boolean mobilizationVerification(String number, String id) {
-        List<TrialMaterialMobilization> list = baseMapper.selectList(Wrappers.<TrialMaterialMobilization>query().lambda());
+    public boolean mobilizationVerification(String number, String id, String contractId) {
+        List<TrialMaterialMobilization> list = baseMapper.selectList(Wrappers.<TrialMaterialMobilization>lambdaQuery()
+                .eq(TrialMaterialMobilization::getContractId, contractId)
+        );
         if (StringUtils.isEmpty(id)) {
             TrialMaterialMobilization trialMaterialMobilization1 = list.stream().filter(f -> f.getMaterialNumber().equals(number)).findAny().orElse(null);
             return trialMaterialMobilization1 != null;
@@ -301,7 +303,6 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
                 }
                 PDFUtil.createTableCell(materialTypeName, textFont, table, lineHeight, colSpan);
 
-
                 PDFUtil.createTableCell(ObjectUtil.isNotEmpty(pdfDatum.getSpecificationModel()) ? pdfDatum.getSpecificationModel() : "", textFont, table, lineHeight, colSpan);
                 PDFUtil.createTableCell(ObjectUtil.isNotEmpty(pdfDatum.getSupplierUnit()) ? pdfDatum.getSupplierUnit() : "", textFont, table, lineHeight, colSpan);
                 PDFUtil.createTableCell(ObjectUtil.isNotEmpty(pdfDatum.getMaterialPrice()) ? pdfDatum.getMaterialPrice().toString() : "", textFont, table, lineHeight, colSpan);

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

@@ -63,8 +63,11 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
     private final JdbcTemplate jdbcTemplate;
 
     @Override
-    public boolean sampleVerification(String specificationNumber, String id) {
-        List<TrialSampleInfo> list = baseMapper.selectList(Wrappers.<TrialSampleInfo>query().lambda());
+    public boolean sampleVerification(String specificationNumber, String id, String contractId, String nodeId) {
+        List<TrialSampleInfo> list = baseMapper.selectList(Wrappers.<TrialSampleInfo>lambdaQuery()
+                .eq(TrialSampleInfo::getContractId, contractId)
+                .eq(TrialSampleInfo::getNodeId, nodeId)
+        );
         if (StringUtils.isEmpty(id)) {
             TrialSampleInfo trialSampleInfo = list.stream().filter(f -> f.getSpecificationNumber().equals(specificationNumber)).findAny().orElse(null);
             return trialSampleInfo != null;

+ 23 - 9
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -172,9 +172,8 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         if (mobilizationIds.size() > 0) {
             List<Long> collect = mobilizationIds.stream().map(TrialSamplingRecord::getMobilizationId).collect(Collectors.toList());
             String join = org.apache.commons.lang.StringUtils.join(collect, ",");
-            List<TrialMaterialMobilization> mobilizations = jdbcTemplate.query("select production_certificate from u_trial_material_mobilization where id in(" + join + ")", new BeanPropertyRowMapper<>(TrialMaterialMobilization.class));
-            List<TrialMaterialMobilization> notUpdate = mobilizations.stream().filter(f -> ObjectUtils.isEmpty(f.getProductionCertificate())).collect(Collectors.toList());
-            if (notUpdate.size() != 0) {
+            List<TrialMaterialMobilization> mobilizations = jdbcTemplate.query("select production_certificate from u_trial_material_mobilization where production_certificate is not null and id in(" + join + ")", new BeanPropertyRowMapper<>(TrialMaterialMobilization.class));
+            if (mobilizations.size() > 0) {
                 record.setIsUploadCertificate(1);
                 record.setIsUploadCertificateName("是");
             } else {
@@ -596,16 +595,31 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (taskParallel != null && ObjectUtil.isNotEmpty(taskParallel.getProcessInstanceId())) {
                 //获取当前任务的状态为以已审批status=2,再修改试验状态以及关联的pdf
                 Task task = jdbcTemplate.query("select status from u_task where process_instance_id = '" + taskParallel.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
-                if (ObjectUtils.isNotEmpty(task) && new Integer(2).equals(task.getStatus())) {
+                if (ObjectUtils.isNotEmpty(task)) {
 
                     //试验状态
                     String trialSelfInspectionRecordId = baseMapper.selectTaskByTaskId(taskParallel.getProcessInstanceId());
                     if (StringUtils.isNotEmpty(trialSelfInspectionRecordId)) {
-                        this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
-                                .set(TrialSelfInspectionRecord::getTaskStatus, "已审批")
-                                .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
-                                .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
-                        );
+
+                        if (new Integer(2).equals(task.getStatus())) {
+                            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                                    .set(TrialSelfInspectionRecord::getTaskStatus, "已审批")
+                                    .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
+                                    .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                            );
+                        } else if (new Integer(1).equals(task.getStatus())) {
+                            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                                    .set(TrialSelfInspectionRecord::getTaskStatus, "待审批")
+                                    .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
+                                    .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                            );
+                        } else if (new Integer(3).equals(task.getStatus())) {
+                            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate()
+                                    .set(TrialSelfInspectionRecord::getTaskStatus, "已废除")
+                                    .set(TrialSelfInspectionRecord::getPdfUrl, pdfUrlEVisa) //pdfUrlEVisa=电签后的pdf
+                                    .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
+                            );
+                        }
 
                         TrialSelfInspectionRecord record = baseMapper.selectById(trialSelfInspectionRecordId);
 

+ 4 - 10
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -321,6 +321,9 @@ public class CustomFunction {
 	public static Object count(Object data) {
 		List<Object> list=obj2ListNe(data);
 		if(ListUtils.isNotEmpty(list)){
+			if(list.stream().anyMatch(e->StringUtils.handleNull(e).contains(":"))){
+				return list.stream().filter(StringUtils::isNotEmpty).count();
+			}
 			return   list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).count();
 		}
 		return "";
@@ -1634,6 +1637,7 @@ public class CustomFunction {
 			double designD=Double.parseDouble(design.toString());
 			double xND=Double.parseDouble(xN.toString());
 			String devStr = dev.toString();
+			devStr=devStr.replaceAll("[\\[\\]]+","");
 			double min=0;
 			double max=0;
 			devStr=devStr.replaceAll("\\s+","");
@@ -2762,16 +2766,6 @@ public class CustomFunction {
 		return "";
 	}
 
-	public static void main11(String[] args) {
-		Map<String,Object> map =new HashMap<>();
-		map.put("A","13.3");
-		map.put("B","13.5");
-//		map.put("A","17*20");
-//		map.put("B","18*18");
-//		Expression.parse("(A-B)*10").calculate(map);
-		System.out.println(Expression.parse("(A-B)*10").calculate(map).toString());
-
-	}
 
 
 }

+ 9 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -269,6 +269,14 @@ public class FormulaUtils {
 
     /*从元素名称中解析项目名称*/
     public static  String parseItemName(String eName){
-        return StringUtils.handleNull(eName).replaceAll("^[^\\u4e00-\\u9fa5\\s]+","").split("[((].+[))]|_")[0];
+        String[] candidate= StringUtils.handleNull(eName).replaceAll("^[^\\u4e00-\\u9fa5]+","").replaceAll("\\s+","").split("[((].+[))]|_");
+        if(candidate.length>0){
+           return Arrays.stream(candidate).filter(e->!e.contains("实测项目")&&!e.contains("△")).findFirst().orElse(eName);
+        }
+        return eName;
     }
+
+//    public static void main(String[] args) {
+//        System.out.println(parseItemName("实 测 项 目_3△_内轮廓高度(mm)_不小于设计值_实测值或实测偏差值"));
+//    }
 }

+ 7 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java

@@ -217,8 +217,9 @@ public class ArchiveTreeController extends BladeController {
     @ApiOperation(value = "保存立卷规则设置", notes = "传入archiveAutoType规则类型,nodeIds逗号拼接选择节点id")
     public R saveArchiveAutoRule(@ApiParam(value = "立卷规则", required = true) @RequestParam Integer archiveAutoType,
                                  @ApiParam(value = "主键集合", required = true) @RequestParam String selectNodeIds,
-                                 @ApiParam(value = "是否wbs节点", required = true) @RequestParam Boolean iswbsNode) {
-        return R.status(archiveTreeService.saveArchiveAutoRule(archiveAutoType,selectNodeIds,iswbsNode));
+                                 @ApiParam(value = "是否wbs节点", required = true) @RequestParam Boolean iswbsNode,
+                                 Long projectId) {
+        return R.status(archiveTreeService.saveArchiveAutoRule(archiveAutoType,selectNodeIds,iswbsNode,projectId));
     }
 
 
@@ -234,8 +235,8 @@ public class ArchiveTreeController extends BladeController {
      * 取消立卷规则设置
      */
     @PostMapping("/removeArchiveAutoRule")
-    public R removeArchiveAutoRule(Long nodeId,boolean iswbsNode) {
-        Map<String, String> map = archiveTreeService.removeArchiveAutoRule(nodeId, iswbsNode);
+    public R removeArchiveAutoRule(Long nodeId,boolean iswbsNode,Long projectId) {
+        Map<String, String> map = archiveTreeService.removeArchiveAutoRule(nodeId, iswbsNode,projectId);
         return R.data(map);
     }
 
@@ -243,8 +244,8 @@ public class ArchiveTreeController extends BladeController {
      * 查看立卷规则设置
      */
     @PostMapping("/getArchiveAutoRule")
-    public R getArchiveAutoRule(Long nodeId,boolean iswbsNode) {
-        Map<String, Object> ruleMap=archiveTreeService.getArchiveAutoRule(nodeId,iswbsNode);
+    public R getArchiveAutoRule(Long nodeId,boolean iswbsNode,Long projectId,Long wbsNode2ArchiveTreeNodeId,String wbsId) {
+        Map<String, Object> ruleMap=archiveTreeService.getArchiveAutoRule(nodeId,iswbsNode,projectId,wbsNode2ArchiveTreeNodeId,wbsId);
         return R.data(ruleMap);
     }
 

+ 14 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialClassificationConfigurationController.java

@@ -5,17 +5,23 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialDetectionData;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.manager.entity.TrialClassificationConfiguration;
 import org.springblade.manager.service.ITrialClassificationConfigurationService;
 import org.springblade.manager.vo.TrialClassificationConfigurationTreeVO;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 
+import java.util.List;
+
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
 
@@ -26,6 +32,7 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 public class TrialClassificationConfigurationController extends BladeController {
 
     private final ITrialClassificationConfigurationService iTrialClassificationConfigurationService;
+    private final JdbcTemplate jdbcTemplate;
 
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "详情", notes = "传入节点id")
@@ -50,14 +57,18 @@ public class TrialClassificationConfigurationController extends BladeController
     @ApiOperation(value = "删除节点", notes = "传入节点id")
     @RequestMapping(value = "/remove", method = RequestMethod.GET)
     public R<Object> remove(@Valid @RequestParam Long id) {
+        List<TrialDetectionData> query = jdbcTemplate.query("select id from m_trial_detection_data where is_deleted = 0 and node_id = " + id, new BeanPropertyRowMapper<>(TrialDetectionData.class));
+        if (query.size() > 0) {
+            throw new ServiceException("当前节点下存在数据,删除失败");
+        }
         return R.status(iTrialClassificationConfigurationService.removeById(id));
     }
 
     @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "加载外委、第三方树", notes = "null")
+    @ApiOperation(value = "加载外委、第三方树", notes = "传入合同段id")
     @RequestMapping(value = "/tree-all", method = RequestMethod.GET)
-    public R<TrialClassificationConfigurationTreeVO> treeAll() {
-        return R.data(iTrialClassificationConfigurationService.treeAll());
+    public R<TrialClassificationConfigurationTreeVO> treeAll(String contractId) {
+        return R.data(iTrialClassificationConfigurationService.treeAll(contractId));
     }
 
 

+ 13 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -7,7 +7,6 @@ import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 
 import java.util.*;
-import java.util.logging.Handler;
 import java.util.stream.Collectors;
 
 /**
@@ -63,19 +62,27 @@ public class SubTable {
                    String key = entry.getKey();
                    String[] nameAndDesign=key.split("@");
                    List<String> values=entry.getValue();
+                   /*写人的行数*/
                    int count = (int)Math.ceil((double)values.size()/(double)ROW_SIZE);
-                   int count2=count/STEP[0];
-                   itemNameList.addAll(Collections.nCopies(count2,nameAndDesign[0]));
-                   designList.addAll(Collections.nCopies(count2,nameAndDesign[1]));
+//                   int count2=count/STEP[0];
+                   itemNameList.addAll(Collections.nCopies(count,nameAndDesign[0]));
+                   if(nameAndDesign.length>=2) {
+                       designList.addAll(Collections.nCopies(count, nameAndDesign[1]));
+                   }else{
+                       designList.addAll(Collections.nCopies(count, ""));
+                   }
                    dataList.addAll(values);
-                   if(count>values.size()){
-                       dataList.addAll(Collections.nCopies(count-values.size(),""));
+                   if(count*ROW_SIZE>values.size()){
+                       dataList.addAll(Collections.nCopies(count*ROW_SIZE-values.size(),""));
                    }
                }
                /*写入元素*/
                FormulaUtils.write(itemName,itemNameList,true);
                FormulaUtils.write(design,designList,true);
                FormulaUtils.write(data,dataList,true);
+               itemName.setUpdate(1);
+               design.setUpdate(1);
+               data.setUpdate(1);
            }
    }
 

+ 0 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -168,7 +168,6 @@ public class TableElementConverter implements ITableElementConverter {
                                  eds.add(new ElementData(Func.toInt(sa[2]),Func.toInt(sa[1]),val,Func.toInt(sa[3]),Func.toInt(sa[4])));
                             });
                             log.append(fd.getEName()).append(fd.getCode()).append("定位信息不存在;");
-                           // StaticLog.error("FORMULA_LOG@元素{}定位信息不存在,请检查配置",fd.getTableName()+StringPool.COLON+fd.getKey());
                         }
                     }
                 }

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

@@ -21,6 +21,8 @@ import org.springblade.manager.entity.ArchiveAutoRuleWbs;
 import org.springblade.manager.vo.ArchiveAutoRuleWbsVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -43,4 +45,6 @@ public interface ArchiveAutoRuleWbsMapper extends BaseMapper<ArchiveAutoRuleWbs>
 	int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId,
 										   @Param("projectId") Long projectId);
 
+	int removeArchiveAutoRule(@Param("id") Long id, @Param("time") Date time);
+
 }

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

@@ -14,7 +14,7 @@
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
         <result column="project_id" property="projectId"/>
-        <result column="delete" property="delete"/>
+        <result column="is_deleted" property="isDeleted"/>
     </resultMap>
 
 
@@ -33,4 +33,14 @@
           and archive_auto_group_id = #{archiveAutoGroupId}
     </update>
 
+    <update id="removeArchiveAutoRule">
+        /**取消同一组的分类并卷规则*/
+        update m_archive_auto_rule_wbs
+        set
+            is_deleted = 1,
+            update_time = #{time}
+        where
+            id = #{id}
+    </update>
+
 </mapper>

+ 6 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java

@@ -39,11 +39,14 @@ public interface ArchiveTreeMapper extends BaseMapper<ArchiveTree> {
      * @return
      */
     int removeAllSonNodeIdsForArchiveAutoRule_1(@Param("archiveAutoType") Integer archiveAutoType,
-                                                @Param("ancestors") String ancestors);
+                                                @Param("ancestors") String ancestors,
+                                                @Param("nodeId") Long nodeId);
     int removeAllSonNodeIdsForArchiveAutoRule_2(@Param("archiveAutoType") Integer archiveAutoType,
-                                                @Param("ancestors") String ancestors);
+                                                @Param("ancestors") String ancestors,
+                                                @Param("nodeId") Long nodeId);
     int removeAllSonNodeIdsForArchiveAutoRule_3(@Param("archiveAutoType") Integer archiveAutoType,
-                                                @Param("ancestors") String ancestors);
+                                                @Param("ancestors") String ancestors,
+                                                @Param("nodeId") Long nodeId);
     int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId);
     /**
      * 查看分类并卷规则-获取大类所有节点

+ 7 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml

@@ -315,8 +315,9 @@
         set
             archive_auto_node_id = NULL
         where
-            is_deleted = 0
-          and ancestors like concat('', #{ancestors}, '%');
+          is_deleted = 0
+          and ancestors like concat('', #{ancestors}, '%')
+          or id=#{nodeId} ;
 
 
         update m_archive_tree
@@ -326,7 +327,8 @@
             is_deleted = 0
           and ancestors like concat('', #{ancestors}, '%')
             /*取消规则 只取消规则与自己一致的*/
-          and archive_auto_type = #{archiveAutoType} ;
+          and archive_auto_type = #{archiveAutoType}
+          or id=#{nodeId} ;
     </update>
 
     <update id="removeAllSonNodeIdsForArchiveAutoRule_3">
@@ -339,6 +341,7 @@
           and ancestors like concat('', #{ancestors}, '%')
             /*取消规则 只取消规则与自己一致的*/
           and archive_auto_type = #{archiveAutoType}
+          or id=#{nodeId} ;
     </update>
     <update id="removeAllSonNodeIdsForArchiveAutoRule_2">
         /*取消单个节点的分类并卷规则*/
@@ -353,6 +356,7 @@
           and ancestors like concat('', #{ancestors}, '%')
             /*取消规则 只取消规则与自己一致的*/
           and archive_auto_type = #{archiveAutoType}
+          or id=#{nodeId} ;
     </update>
 
     <update id="removeNodeForArchiveAutoRule_Group">

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

@@ -8,6 +8,6 @@ import java.util.List;
 
 public interface TrialClassificationConfigurationMapper extends BaseMapper<TrialClassificationConfiguration> {
 
-    List<TrialClassificationConfigurationTree> treeAll();
+    List<TrialClassificationConfigurationTree> treeAll(String contractId);
 
 }

+ 13 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TrialClassificationConfigurationMapper.xml

@@ -3,6 +3,7 @@
 <mapper namespace="org.springblade.manager.mapper.TrialClassificationConfigurationMapper">
     <resultMap id="ResultMap" type="org.springblade.manager.entity.TrialClassificationConfiguration">
         <result column="id" property="id"/>
+        <result column="contractId})" property="id"/>
         <result column="node_name" property="nodeName"/>
         <result column="node_type" property="nodeType"/>
         <result column="ancestors" property="ancestors"/>
@@ -18,8 +19,18 @@
     </resultMap>
 
     <select id="treeAll" resultType="org.springblade.manager.vo.TrialClassificationConfigurationTree">
-        SELECT * FROM m_trial_classification_configuration WHERE is_deleted = 0 AND status = 1 ORDER BY sort
+        SELECT b.contract_id,b.id,b.node_name,b.node_type,b.parent_id,b.ancestors,b.sort,b.status,b.is_deleted,
+            (select CASE WHEN count(1) > 0 THEN 1 ELSE 0 END from m_trial_detection_data a
+                where is_deleted = 0 and a.node_id = b.id and (a.contract_id is null or a.contract_id = #{contractId})) as isData
+        FROM m_trial_classification_configuration b
+        WHERE is_deleted = 0 AND status = 1
+        <if test="contractId == null">
+            and contract_id is null
+        </if>
+        <if test="contractId != null and contractId != ''">
+            and (contract_id is null OR (contract_id = #{contractId}))
+        </if>
+        ORDER BY sort
     </select>
 
-
 </mapper>

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

@@ -44,11 +44,11 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 	 *项目级立卷规则新增
 	 * @return
 	 */
-	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds,boolean iswbsNode);
+	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds,boolean iswbsNode,Long projectId);
 
 
 
-	Map<String,Object> getArchiveAutoRule(Long id,boolean iswbsNode);
+	Map<String,Object> getArchiveAutoRule(Long id,boolean iswbsNode,Long projectId,Long wbsNode2ArchiveTreeNodeId,String wbsId);
 
 	/**
 	 *项目级立卷规则更新
@@ -63,5 +63,5 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 	 * @param iswbsNode
 	 * @return
 	 */
-	Map<String,String> removeArchiveAutoRule(Long nodeId,boolean iswbsNode);
+	Map<String,String> removeArchiveAutoRule(Long nodeId,boolean iswbsNode,Long projectId);
 }

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

@@ -10,6 +10,6 @@ public interface ITrialClassificationConfigurationService extends BaseService<Tr
 
     boolean submit(TrialClassificationConfiguration obj);
 
-    TrialClassificationConfigurationTreeVO treeAll();
+    TrialClassificationConfigurationTreeVO treeAll(String contractId);
 
 }

+ 227 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleWbsServiceImpl.java

@@ -16,7 +16,13 @@
  */
 package org.springblade.manager.service.impl;
 
+import com.alibaba.druid.sql.dialect.h2.visitor.H2ASTVisitor;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.manager.entity.ArchiveAutoRuleWbs;
+import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.vo.ArchiveAutoRuleWbsVO;
 import org.springblade.manager.mapper.ArchiveAutoRuleWbsMapper;
 import org.springblade.manager.service.IArchiveAutoRuleWbsService;
@@ -24,6 +30,8 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.*;
+
 /**
  *  服务实现类
  *
@@ -33,6 +41,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 @Service
 public class ArchiveAutoRuleWbsServiceImpl extends BaseServiceImpl<ArchiveAutoRuleWbsMapper, ArchiveAutoRuleWbs> implements IArchiveAutoRuleWbsService {
 
+	private ArchiveFileClient archiveFileClient;
+
 	@Override
 	public IPage<ArchiveAutoRuleWbsVO> selectArchiveAutoRuleWbsPage(IPage<ArchiveAutoRuleWbsVO> page, ArchiveAutoRuleWbsVO archiveAutoRuleWbs) {
 		return page.setRecords(baseMapper.selectArchiveAutoRuleWbsPage(page, archiveAutoRuleWbs));
@@ -45,29 +55,233 @@ public class ArchiveAutoRuleWbsServiceImpl extends BaseServiceImpl<ArchiveAutoRu
 		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
 	}
 
+
+	/**
+	 * 检查当前案卷的文件集合是否在规格内,能否开始组卷。
+	 * return
+	 * 0不能组卷,当前文件入待组卷集合,还能试加文件。
+	 * 1可以组卷,当前文件加入待组卷集合后开始组卷。
+	 * -1 不可组卷,当前文件不能加入待组卷集合, 待组卷集合要组卷了。
+	 * null 程序出错了
+	 */
+	private Integer checkSpecificationSize(int SpecificationSize,int archivesSize){
+		//按照当前目录节点的参数(卷盒规格)进行页数组合,
+		// 30MM默认为300页组成一卷、400MM默认为400页组成一卷、50MM默认为500页组成一卷、60MM默认为600组成一卷。
+		//注意:允许组卷上浮区间为100页
+		//意思是如果A\B两个文件进行并卷组卷,总页数规格为300页,但是A+B的文件数为350页,已经超过固定规格,但是上浮区间在100以内,则允许这样组卷。
+		//超过300之后,则不在继续与其他文件进行并卷组卷了。
+		int SpecificationSizeMax =SpecificationSize+100;
+
+		if(archivesSize<SpecificationSize){
+			//小于规格的 返回true ,当前文件加入待组卷集合,还可以试加文件,未到组卷规格
+			return 0;
+		}
+		if(archivesSize==SpecificationSize){
+			//等于规则的  当前文件加入待组卷集合,待组卷集合可以组卷了。
+			return 1;
+		}
+		if(archivesSize<=SpecificationSizeMax){
+			//小于等于规格上浮区间,当前文件加入待组卷集合,当前文件集合可以组卷了
+			return 1;
+		}
+		if(archivesSize>SpecificationSizeMax){
+			//大于规格上浮区间,当前文件不能加入当前待组卷集合,先把当前待组卷集合的文件先组卷完成,清空待组卷集合后再重新计算检查当前文件。
+			return -1;
+		}
+
+		return null;
+	}
+
+	/**
+	 * 单独组卷规则组卷
+	 * @param waitArchiveFiles
+	 * @param node
+	 */
+	private void createArchive3(List<ArchiveFile> waitArchiveFiles,ArchiveTreeContract node){
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = new ArchivesAuto();
+		//archivesAuto.setProjectId();
+		//archivesAuto.setContractId();
+		//archivesAuto.setName();//案卷题名
+		//archivesAuto.setFileNumber();//档号
+		//archivesAuto.setMicron();//微缩号
+		//archivesAuto.setUnit();//单位
+		//archivesAuto.setQuantity();//数量/单位
+		//archivesAuto.setSpecification();//规格
+		//archivesAuto.setStartDate();
+		//archivesAuto.setEndDate();
+		//archivesAuto.setStorageTime();//保管时间
+		//archivesAuto.setSecretLevel();//保密级别
+		//archivesAuto.setCarrierType();//载体类型
+		//archivesAuto.setKeywords();//主题词
+		//archivesAuto.setStorageLocation();//存放位置
+		//archivesAuto.setIsArchive(1);//已归档
+		//archivesAuto.setRemark();//备注
+		//archivesAuto.setRollDate();//立卷日期
+		//archivesAuto.setRollor();//立卷人
+		//archivesAuto.setNodeId();//归档树节点
+		//archivesAuto.setOutUrl();
+		//archivesAuto.setFileN();//文件数量
+		//archivesAuto.setPageN();//案卷页数
+		//archivesAuto.setMileage();
+		//archivesAuto.setFileType();
+		//archivesAuto.setSize();
+		//archivesAuto.setTreeSort();
+		//archivesAuto.setIsOpen();
+		//archivesAuto.setIscheck();
+		//archivesAuto.setIsAutoFile();
+
+		//2.设置文件所属案卷,组卷状态
+	}
+
+
 	/**
 	 * 单租组卷流程  节点下的文件只在当前节点下组卷
 	 */
-	private void archiveAutoMethod3(){
+	private void archiveAutoMethod3(List<ArchiveTreeContract> list){
 		//步骤1:遍历节点集合
-		//步骤2:获取当前节点的案卷规格
-		//步骤3:查询节点下的未归档文件
-		//步骤4:遍历未归档文件
-		//步骤5:判断文件是否存在分盒设置-》走分盒组卷流程
-		//步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
+		for(ArchiveTreeContract node:list){
+			//步骤2:获取当前节点的案卷规格
+			int specificationSize=300;//TODO
+			//步骤3:查询节点下的未归档文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.listWrappers(Wrappers.<ArchiveFile>lambdaQuery()
+					.eq(ArchiveFile::getNodeId, node)
+					.eq(ArchiveFile::getIsArchive, 0)
+					.eq(ArchiveFile::getIsDeleted,0)
+					.orderByAsc(ArchiveFile::getSort));
+			//步骤4:遍历未归档文件
+			//待组卷文件集合
+			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
+			//待组卷文件总页数
+			int archivesSize=0;
+			if(archiveFiles!=null){
+				int archiveFilesSize=0;
+				for(ArchiveFile file:archiveFiles){
+					archiveFilesSize++;
+					//步骤5:判断文件是否存在分盒设置
+					if(file.getBoxNumber()!=null){
+						//TODO 走分盒组卷流程
+					}else{
+						//单独组卷流程
+						//步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
+						Integer filePage = file.getFilePage();
+						archivesSize=archivesSize+filePage;
+						Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
+						//步骤6.1未到规格 不组卷
+						if(checkStatus==0){
+							waitArchiveFiles.add(file);
+							//判断是否最后一个文件
+							if(archiveFilesSize==archiveFiles.size()){
+								//TODO 最后一个文件直接将waitArchiveFiles组卷
+							}else{
+								continue;
+							}
+						}
+						//步骤6.2达到规格 可以组一卷
+						if(checkStatus==1){
+							waitArchiveFiles.add(file);
+							//TODO 将waitArchiveFiles组卷
+							//将待组卷文件集合,总页数还原初始值,
+							waitArchiveFiles.clear();
+							archivesSize=0;
+						}
+						//步骤6.3超出规格---开始
+						if(checkStatus==-1){
+							//步骤6.3.1如果waitArchiveFiles集合size>0,先将集合中文件组卷。再重新计算当前文件
+							if(waitArchiveFiles.size()>0){
+								//步骤6.3.1_1 TODO 将waitArchiveFiles组卷,然后将待组卷文件集合,总页数还原初始值,
+								waitArchiveFiles.clear();
+								//步骤6.3.1_2保存当前文件进入待组卷集合,待组卷页数=当前文件页数
+								waitArchiveFiles.add(file);
+								archivesSize=filePage;
+								//步骤6.3.1_3当前文件再次检查规格
+								Integer checkStatusAgain = checkSpecificationSize(specificationSize, archivesSize);
+								//步骤6.3.1_3_1未到规格
+								if(checkStatusAgain==0){
+									//判断是否最后一个文件
+									if(archiveFilesSize==archiveFiles.size()){
+										//TODO 最后一个文件直接将waitArchiveFiles组卷
+									}else{
+										continue;
+									}
+								}else{
+									//步骤6.3.1_3_2单个文件 就达到规格或超出规格 直接组卷
+									if(checkStatusAgain!=null){
+										//TODO 直接将waitArchiveFiles组卷
+										//将待组卷文件集合,总页数还原初始值,
+										waitArchiveFiles.clear();
+										archivesSize=0;
+									}
+								}
+							}else{
+								//步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
+								waitArchiveFiles.add(file);
+								//TODO 直接将waitArchiveFiles组卷
+								waitArchiveFiles.clear();
+								archivesSize=0;
+							}
+						}
+						//步骤6.3超出规格---结束
+					}
+				}
+			}
+
+		}
+
+
+
+
+
 	}
 
 	/**
 	 * 分类并卷组卷  设置分类的节点下只有一个案卷,节点下的所有文件都组成这个案卷。如果设置分类节点(select=1的)多个,案卷归属排序第一个节点。
 	 */
-	private void archiveAutoMethod2(){
+	private void archiveAutoMethod2(List<ArchiveTreeContract> list){
+
+		//分类并卷集合<groupId,List<文件>>
+		Map<Long,List<ArchiveFile>> archiveMap = new HashMap<>();
+
 		//步骤1:遍历节点集合
-		//步骤2:查询节点下的未归档文件
-		//步骤4:遍历未归档文件
-		//步骤5:判断文件是否存在分盒设置-》走分盒组卷流程
-		//步骤6:将文件按照<groupId,List<文件>>放入集合
-		//步骤7:将文件按照<groupId,List<文件>>放入集合
-		//步骤8:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
+		for(ArchiveTreeContract node:list) {
+			//根据分组ID来创建唯一案卷
+			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
+			//步骤2:查询节点下的未归档文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.listWrappers(Wrappers.<ArchiveFile>lambdaQuery()
+					.eq(ArchiveFile::getNodeId, node)
+					.eq(ArchiveFile::getIsArchive, 0)
+					.eq(ArchiveFile::getIsDeleted,0)
+					.orderByAsc(ArchiveFile::getSort));
+			//步骤3:遍历未归档文件
+			if(archiveFiles!=null){
+				for(ArchiveFile file:archiveFiles){
+					//步骤4:判断文件是否存在分盒设置
+					if(file.getBoxNumber()!=null){
+						//走分盒流程
+					}else{
+						//分类并卷流程
+						//步骤5:将文件按照<groupId,List<文件>>放入集合
+						if(archiveMap.containsKey(archiveAutoGroupId)){
+							List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
+							groupList.add(file);
+							archiveMap.put(archiveAutoGroupId,groupList);
+						}else{
+							List<ArchiveFile> groupList= new ArrayList<>();
+							groupList.add(file);
+							archiveMap.put(archiveAutoGroupId,groupList);
+						}
+					}
+				}
+			}
+		}
+		//步骤6:按集合创建案卷,每个group类的案卷归属顺序排第一个节点
+		Set<Map.Entry<Long, List<ArchiveFile>>> entries = archiveMap.entrySet();
+		for(Map.Entry<Long, List<ArchiveFile>> entry:entries){
+			Long key = entry.getKey();
+			List<ArchiveFile> archiveFiles = entry.getValue();
+			//TODO 一个key 组成一个案卷  案卷归属同个key的归档树节点select=1的第一个
+		}
+
 	}
 
 	/**

+ 152 - 20
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -380,6 +380,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             archiveTree.setTitle(wbsTreeVO2.getTitle());
 
             archiveTree.setIswbsNode(true);
+            archiveTree.setWbsNode2ArchiveTreeNodeId(parentId);
             archiveTree.setId(wbsTreeVO2.getId());
             archiveTree.setParentId(wbsTreeVO2.getParentId());
             archiveTree.setExtId(wbsTreeVO2.getId());
@@ -414,9 +415,9 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
      * @return
      */
     @Override
-    public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds,boolean iswbsNode) {
+    public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds,boolean iswbsNode,Long projectId) {
         if(iswbsNode){
-            return saveArchiveAutoRule_WbsTreeNode(archiveAutoType, nodeIds);
+            return saveArchiveAutoRule_WbsTreeNode(archiveAutoType, nodeIds,projectId);
         }else{
             return saveArchiveAutoRule_ArchiveTreeNode(archiveAutoType, nodeIds);
         }
@@ -477,7 +478,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
      * @param nodeIds
      * @return
      */
-    private Boolean saveArchiveAutoRule_WbsTreeNode(Integer archiveAutoType, String nodeIds){
+    private Boolean saveArchiveAutoRule_WbsTreeNode(Integer archiveAutoType, String nodeIds,Long projectId){
         try{
             String[] ids = nodeIds.split(",");
             Long archiveAutoGroupId=null;
@@ -492,14 +493,14 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                 //步骤1:保存选择节点的立卷规则。
                 long nodeIdLong = Long.parseLong(nodeId);
                 //1.1最高规则和单独规则 将选择的wbs节点ID(wbsId),规则类型(archive_auto_type), 保存表m_archive_auto_rule_wbs
-                WbsTree wbsTree = wbsTreeService.getById(nodeIdLong);
+                //WbsTree wbsTree = wbsTreeService.getById(nodeIdLong);
                 ArchiveAutoRuleWbs autoRuleWbs = new ArchiveAutoRuleWbs();
                 autoRuleWbs.setWbsId(nodeIdLong);
                 autoRuleWbs.setArchiveAutoType(archiveAutoType);
                 if(archiveAutoType==2){
                     autoRuleWbs.setArchiveAutoGroupId(archiveAutoGroupId);
                 }
-                autoRuleWbs.setProjectId(0L);//TODO
+                autoRuleWbs.setProjectId(projectId);//项目ID  系统级为0
                 autoRuleWbs.setWbsRootId(null);//TODO
                 archiveAutoRuleWbsMapper.insert(autoRuleWbs);
             }
@@ -577,7 +578,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                     String selectNodeIds = dto.getSelectNodeIds();
                     List<String> selectNodeIdlist = Arrays.asList(selectNodeIds);
                     //先将同一分组的节点删除配置,。
-                    archiveAutoRuleWbsMapper.removeNodeForArchiveAutoRule_Group(groupId,0L);
+                    archiveAutoRuleWbsMapper.removeNodeForArchiveAutoRule_Group(groupId,dto.getProjectId());
                     //然后再按照选择节点保存新的设置
                     for(String nodeId:selectNodeIdlist){
                         long nodeIdLong = Long.parseLong(nodeId);
@@ -587,8 +588,8 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                         if(archiveAutoType==2){
                             autoRuleWbs.setArchiveAutoGroupId(groupId);
                         }
-                        autoRuleWbs.setProjectId(0L);//TODO
-                        autoRuleWbs.setWbsRootId(null);//TODO
+                        autoRuleWbs.setProjectId(dto.getProjectId()==null?0L:dto.getProjectId());
+                        autoRuleWbs.setWbsRootId(null);//TODO 不懂有没有这个东西
                         archiveAutoRuleWbsMapper.insert(autoRuleWbs);
                     }
                 }
@@ -604,22 +605,24 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
      * 移除节点规则
      * @param nodeId
      */
-    public Map<String,String> removeArchiveAutoRule(Long nodeId,boolean iswbsNode){
+    public Map<String,String> removeArchiveAutoRule(Long nodeId,boolean iswbsNode,Long projectId){
         Map<String,String> returnMap= new HashMap<>();
         returnMap.put("code","1");
         try{
             if(iswbsNode){
-                ArchiveAutoRuleWbs archiveAutoRuleWbs = archiveAutoRuleWbsMapper.selectById(nodeId);
-                archiveAutoRuleWbs.setDelete(1);
-                archiveAutoRuleWbs.setUpdateTime(new Date());
-                archiveAutoRuleWbsMapper.updateById(archiveAutoRuleWbs);
+                ArchiveAutoRuleWbs autoRuleWbs = archiveAutoRuleWbsMapper.selectOne(Wrappers.<ArchiveAutoRuleWbs>lambdaQuery()
+                        .eq(ArchiveAutoRuleWbs::getWbsId, nodeId)
+                        .eq(ArchiveAutoRuleWbs::getIsDeleted, 0)
+                        .eq(ArchiveAutoRuleWbs::getProjectId, projectId));
+                archiveAutoRuleWbsMapper.removeArchiveAutoRule(autoRuleWbs.getId(),new Date());
             }else{
                 ArchiveTree node = baseMapper.selectById(nodeId);
                 Integer archiveAutoType = node.getArchiveAutoType();
                 if(archiveAutoType!=null){
                     //删除默认规则
                     if(archiveAutoType==1){
-                        baseMapper.removeAllSonNodeIdsForArchiveAutoRule_1(node.getArchiveAutoType(),node.getAncestors());
+                        String ancestors = node.getAncestors()+","+nodeId;
+                        baseMapper.removeAllSonNodeIdsForArchiveAutoRule_1(node.getArchiveAutoType(),ancestors,nodeId);
                     }
                     //删除节点及所有子节点 分类并卷规则
                     if(archiveAutoType==2){
@@ -627,7 +630,8 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                             //删除规则  只能修改archive_auto_group_select=1的节点,
                             // 因为分类并卷规则影响范围包括下面所有子节点,如果给archive_auto_group_select=0的节点也就是范围内的子节点单独取消规则,会造成案卷归属节点错乱。
                             // (不理那么多,就这样限制先 。如业务非要发神经就要 TODO 验证节点的父节点是否为分类并卷规则,如是则取消。若无其他兄弟节点,继续往上验证。)
-                            baseMapper.removeAllSonNodeIdsForArchiveAutoRule_2(node.getArchiveAutoType(),node.getAncestors());
+                            String ancestors = node.getAncestors()+","+nodeId;
+                            baseMapper.removeAllSonNodeIdsForArchiveAutoRule_2(node.getArchiveAutoType(),ancestors,nodeId);
                         }else{
                             returnMap.put("code","0");
                             returnMap.put("msg","只能取消设置的节点,不能取消设置节点范围下节点");
@@ -635,7 +639,8 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                     }
                     //删除节点及所有子节点 单独并卷规则
                     if(archiveAutoType==3){
-                        baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node.getArchiveAutoType(),node.getAncestors());
+                        String ancestors = node.getAncestors()+","+nodeId;
+                        baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node.getArchiveAutoType(),ancestors,nodeId);
                     }
                 }
             }
@@ -653,10 +658,10 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
      * @return
      */
     @Override
-    public Map<String,Object> getArchiveAutoRule(Long id,boolean iswbsNode) {
+    public Map<String,Object> getArchiveAutoRule(Long id,boolean iswbsNode,Long projectId,Long wbsNode2ArchiveTreeNodeId,String wbsId) {
 
         if(iswbsNode){
-            return getArchiveAutoRule_WbsTreeNode(id);
+            return getArchiveAutoRule_WbsTreeNode(id,projectId,wbsNode2ArchiveTreeNodeId,wbsId);
         }else{
             return getArchiveAutoRule_ArchiveTreeNode(id);
         }
@@ -757,10 +762,137 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
      * @param id
      * @return
      */
-    private Map<String,Object> getArchiveAutoRule_WbsTreeNode(Long id) {
+    private Map<String,Object> getArchiveAutoRule_WbsTreeNode(Long id,Long projectId,Long wbsNode2ArchiveTreeNodeId,String wbsId) {
         Map<String,Object> map= new HashMap<>();
         try{
-            //TODO 需要了解关联的wbs节点
+            ArchiveTree archiveTree = baseMapper.selectById(wbsNode2ArchiveTreeNodeId);
+
+            //步骤1:找出wbs的规则设置
+                ArchiveAutoRuleWbs autoRuleWbs = archiveAutoRuleWbsMapper.selectOne(Wrappers.<ArchiveAutoRuleWbs>lambdaQuery()
+                        .eq(ArchiveAutoRuleWbs::getWbsId, id)
+                        .eq(ArchiveAutoRuleWbs::getIsDeleted, 0)
+                        .eq(ArchiveAutoRuleWbs::getProjectId, projectId));
+
+                if(autoRuleWbs!=null){
+                    Integer archiveAutoType = autoRuleWbs.getArchiveAutoType();
+
+
+                    if(archiveAutoType!=null){
+
+                        //获取wbs关联树
+                        ArchiveTreeVO2 archiveTreeVO2 = getWbsArchiveTree(AuthUtil.getTenantId(),projectId,wbsNode2ArchiveTreeNodeId,wbsId,"1",Long.parseLong(archiveTree.getDisplayHierarchy()));
+                        List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
+                        ForestNodeMerger.getTreeListEx(archiveTreeVO2,archiveTreeVO2List);
+                        Map<Long,ArchiveTreeVO2> ArchiveTreeVO2Map = new HashMap<>();
+                        for(ArchiveTreeVO2 vo2:archiveTreeVO2List){
+                            ArchiveTreeVO2Map.put(vo2.getId(),vo2);
+                        }
+
+                        if(archiveAutoType==1){
+                            //最高并卷层级 默认规则的节点 显示最高并卷层级节点
+                            StringBuffer allName= new StringBuffer();
+                            ArchiveTreeVO2 nameVo2 = ArchiveTreeVO2Map.get(id);
+                            while (nameVo2.getParentId()!=0L){
+                                allName.insert(0,nameVo2.getTitle());
+                                allName.insert(0,"/");
+                                Long parentId = nameVo2.getParentId();
+                                nameVo2 = ArchiveTreeVO2Map.get(parentId);
+                            }
+                            //nameVo2.getParentId()==0L时加上名字
+                            allName.insert(0,nameVo2.getTitle());
+
+                            ArchiveTreeAutoRuleVO vo= new ArchiveTreeAutoRuleVO();
+                            vo.setAllName(allName.toString());
+                            vo.setNodeId(id);
+                            vo.setArchiveAutoType(archiveAutoType);
+                            map.put("type",archiveAutoType);
+                            map.put("data",vo);
+                            return map;
+                        }
+                        if(archiveAutoType==2){
+                            Long archiveAutoGroupId = autoRuleWbs.getArchiveAutoGroupId();
+                            //用于分类并卷编辑树
+                            List<ArchiveTreeAutoRuleVO> nodetree = new ArrayList<>();
+
+                            //遍历wbs关联树 生成分类并将编辑树
+                            for(ArchiveTreeVO2 vo2:archiveTreeVO2List){
+                                //查询wbs节点是否有规则设置
+                                ArchiveAutoRuleWbs autoRuleWbs2 = archiveAutoRuleWbsMapper.selectOne(Wrappers.<ArchiveAutoRuleWbs>lambdaQuery()
+                                        .eq(ArchiveAutoRuleWbs::getWbsId, vo2.getId())
+                                        .eq(ArchiveAutoRuleWbs::getIsDeleted, 0)
+                                        .eq(ArchiveAutoRuleWbs::getProjectId, projectId));
+                                if(autoRuleWbs2!=null){
+                                    //如有规则,需过滤单独规则节点,和不同组的分类规则节点
+                                    if(autoRuleWbs2.getArchiveAutoType()!=3){
+
+                                        if(autoRuleWbs2.getArchiveAutoType()==1){
+                                            ArchiveTreeAutoRuleVO vo=new ArchiveTreeAutoRuleVO();
+                                            vo.setNodeId(vo2.getId());
+                                            vo.setParentId(vo2.getParentId());
+                                            vo.setNodeName(vo2.getTitle());
+                                            nodetree.add(vo);
+                                        }
+                                        //如有规则,需过滤不同组的分类规则节点
+                                        if(autoRuleWbs2.getArchiveAutoType()==2 && autoRuleWbs2.getArchiveAutoGroupId().equals(archiveAutoGroupId)){
+                                            ArchiveTreeAutoRuleVO vo=new ArchiveTreeAutoRuleVO();
+                                            vo.setNodeId(vo2.getId());
+                                            vo.setParentId(vo2.getParentId());
+                                            vo.setNodeName(vo2.getTitle());
+                                            nodetree.add(vo);
+                                        }
+                                    }
+                                }else{
+                                    //没有规则的直接加上
+                                    ArchiveTreeAutoRuleVO vo=new ArchiveTreeAutoRuleVO();
+                                    vo.setNodeId(vo2.getId());
+                                    vo.setParentId(vo2.getParentId());
+                                    vo.setNodeName(vo2.getTitle());
+                                    nodetree.add(vo);
+                                }
+                            }
+
+                            List<ArchiveTreeAutoRuleVO> merge = ForestNodeMerger.merge(nodetree);
+                            //获取与当前节点设置同一分类分组的节点
+                            List<ArchiveAutoRuleWbs> archiveAutoRuleWbs = archiveAutoRuleWbsMapper.selectList(Wrappers.<ArchiveAutoRuleWbs>lambdaQuery()
+                                    .eq(ArchiveAutoRuleWbs::getArchiveAutoGroupId,archiveAutoGroupId)
+                                    .eq(ArchiveAutoRuleWbs::getIsDeleted, 0)
+                                    .eq(ArchiveAutoRuleWbs::getProjectId, projectId));
+                            StringBuffer nodeSelect = new StringBuffer();
+
+                            for(ArchiveAutoRuleWbs node:archiveAutoRuleWbs){
+                                nodeSelect.append(node.getWbsId()+",");
+                            }
+
+                            map.put("archiveAutoType",archiveAutoType);
+                            map.put("archiveAutoGroupId",archiveAutoGroupId);
+                            map.put("tree",merge);
+                            map.put("selectNodeIds",nodeSelect.toString());
+                            return map;
+                        }
+                        if(archiveAutoType==3){
+                            StringBuffer allName= new StringBuffer();
+                            ArchiveTreeVO2 nameVo2 = ArchiveTreeVO2Map.get(id);
+                            while (nameVo2.getParentId()!=0L){
+                                allName.insert(0,nameVo2.getTitle());
+                                allName.insert(0,"/");
+                                Long parentId = nameVo2.getParentId();
+                                nameVo2 = ArchiveTreeVO2Map.get(parentId);
+                            }
+                            //nameVo2.getParentId()==0L时加上名字
+                            allName.insert(0,nameVo2.getTitle());
+
+                            ArchiveTreeAutoRuleVO vo= new ArchiveTreeAutoRuleVO();
+                            vo.setAllName(allName.toString());
+                            vo.setNodeId(id);
+                            vo.setArchiveAutoType(archiveAutoType);
+                            map.put("type",archiveAutoType);
+                            map.put("data",vo);
+                            return map;
+                        }
+                    }
+                }
+
+
         }catch (Exception e){
             e.printStackTrace();
             return map;

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

@@ -201,16 +201,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         if(Func.isNotEmpty(cki)){
            /*检验内容*/
-            StringBuilder sb = new StringBuilder();
+            List<String> sb = new ArrayList<>();
             for(String s:cki){
                 FormData fdTmp=this.formDataMap.get(s);
                 if(fdTmp!=null&&fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
-                    sb.append(FormulaUtils.parseItemName(fdTmp.getEName())).append(",");
+                   sb.add(FormulaUtils.parseItemName(fdTmp.getEName()));
                 }
             }
-            if(sb.length()>1){
-                sb.deleteCharAt(sb.length()-1);
-                this.constantMap.put(CHECK_ITEMS,sb.toString());
+            if(sb.size()>0){
+                this.constantMap.put(CHECK_ITEMS,sb.stream().distinct().filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
             }
         }
         if(Func.isNotBlank(ckd.get())){
@@ -571,7 +570,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
 
 /*###############################附表的处理##################################*/
-        if(true) {
+        if(true) {//临时开关,稳定后移除
             try {
                 /*检验单附表处理*/
                 List<FormData> inspectionList = new ArrayList<>();
@@ -610,17 +609,21 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         /*找不到附表表单数据,则从数据库加载*/
                         JSONArray dataArray = new JSONArray();
                         for (WbsTreeContract data : subTabList) {
+                            /*自动挂载附表情况下,装配TableInfo数据*/
                             R bussDataInfo = this.getBussDataInfo(data.getPKeyId(), 1);
-                            Object data1 = bussDataInfo.getData();
+                            Map<String, Object>  data1 = (Map<String, Object>) bussDataInfo.getData();
+                            data1.put("pkeyId",data.getPKeyId());
                             dataArray.add(data1);
                         }
                         List<TableInfo> subTableInfo = FormulaUtils.getTableInfoList(dataArray);
                         tec.getTableInfoList().addAll(subTableInfo);
+                        /*获取附表元素定位集*/
                         tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), CustomFunction.getElementCell(first.getHtmlUrl()));
-                        List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name name , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
+                        /*附表元素关键信息*/
+                        List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name ename , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
                         if (Func.isNotEmpty(elementMaps)) {
                             elementMaps.forEach(e->{
-                                /*生成附表元素*/
+                                /*装配元素*/
                                 String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
                                 FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
                                 if(tmp!=null){
@@ -628,7 +631,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     this.formDataList.add(tmp);
                                 }
                             });
-                            /*生成元素数据*/
+                            /*生成元素映射关系*/
                             subTabList.forEach(s->{
                                 elementMaps.forEach(e->{
                                     KeyMapper km = new KeyMapper();
@@ -642,20 +645,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
                         }
                     }
-                    List<FormData> subTableFds=this.formDataList.stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
+                    /*获取封装好的附表元素*/
+                    List<FormData> subTableFds=this.formDataMap.values().stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
+                    /*初始化附表对象*/
                     SubTable sta=new SubTable(subTableFds);
-                    /*检验单或者评定表存在超页数据*/
+
                     inspectionList.forEach(f -> {
+                        /*检验单或者评定表存的超页数据汇总到附表对象*/
                            List<ElementData> overList = f.getValues().stream().skip(f.getCoordsList().size()).collect(Collectors.toList());
+                           f.setValues(f.getValues().stream().limit(f.getCoordsList().size()).collect(Collectors.toList()));
+                           f.setAddPages(0);
                            String itemName=FormulaUtils.parseItemName(f.getEName());
                            String key=itemName.trim();
-                           Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))).findAny();
+                           /*同项目*/
+                           Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))&&o.getEName().contains("设计值")&&!o.getEName().contains("判定")).findAny();
                            if(designFdOp.isPresent()){
                                key+="@"+designFdOp.get().getValues().stream().map(ElementData::stringValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
                            }
                            sta.put(key,overList);
                     });
                     if(sta.checked()){
+                        /*把附表数据刷入对应的附表元素对象*/
                         sta.flush();
                     }
                 }

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

@@ -70,8 +70,8 @@ public class TrialClassificationConfigurationServiceImpl
     }
 
     @Override
-    public TrialClassificationConfigurationTreeVO treeAll() {
-        List<TrialClassificationConfigurationTree> all = baseMapper.treeAll();
+    public TrialClassificationConfigurationTreeVO treeAll(String contractId) {
+        List<TrialClassificationConfigurationTree> all = baseMapper.treeAll(contractId);
         for (TrialClassificationConfigurationTree tree1 : all) {
             for (TrialClassificationConfigurationTree tree2 : all) {
                 if (tree1.getId().equals(tree2.getParentId())) {

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1537,6 +1537,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private void recursionFnTree(List<WbsTreePrivateVO> list, Map<Long, List<WbsTreePrivateVO>> map) {
         for (WbsTreePrivateVO wbsTreePrivateVO : list) {
             List<WbsTreePrivateVO> childrenList = map.get(wbsTreePrivateVO.getId());
+            wbsTreePrivateVO.setTitle(wbsTreePrivateVO.getNodeName());
             wbsTreePrivateVO.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
                 wbsTreePrivateVO.setHasChildren(true);

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ForestNodeMerger.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.utils;
 
+import org.springblade.common.utils.INodeEx;
 import org.springblade.core.tool.node.ForestNodeManager;
 import org.springblade.core.tool.node.INode;
 
@@ -37,5 +38,20 @@ public class ForestNodeMerger {
         }
     }
 
+    public static <T extends INodeEx<T>> void getTreeListEx(T tree, List<T> nodes){
+        if (tree == null) {
+            return;
+        }
+
+        nodes.add(tree);
+
+        List<T> childrens = tree.getChildren();
+        if (childrens!= null) {
+            for (T child :childrens) {
+                getTreeListEx(child,nodes);
+            }
+        }
+    }
+
 
 }