Przeglądaj źródła

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

“zhifk” 2 lat temu
rodzic
commit
2c65c4884e
47 zmienionych plików z 1131 dodań i 614 usunięć
  1. 2 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordDTO.java
  2. 0 23
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOption.java
  3. 43 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java
  4. 7 5
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  5. 27 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java
  6. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  7. 4 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeAutoRuleVO.java
  8. 23 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  9. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  10. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java
  11. 7 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  12. 70 24
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  13. 13 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MaterialProgressController.java
  14. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  15. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  16. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  17. 23 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  18. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml
  19. 6 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  20. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  21. 7 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  22. 169 61
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  23. 4 2
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java
  24. 1 31
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  25. 35 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java
  26. 24 28
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  27. 4 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TableFileController.java
  28. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  29. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeClientImpl.java
  30. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  31. 0 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  32. 12 113
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  33. 25 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java
  34. 116 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml
  35. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/FormulaOptionMapper.java
  36. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  37. 0 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  38. 20 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
  39. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  40. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java
  41. 97 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  42. 14 189
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  43. 193 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  44. 3 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  45. 73 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java
  46. 59 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  47. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

+ 2 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSelfInspectionRecordDTO.java

@@ -14,8 +14,8 @@ public class TrialSelfInspectionRecordDTO extends TrialSelfInspectionRecord {
     @ApiModelProperty("样品信息ids")
     private String sampleIds;
 
-    @ApiModelProperty(value = "表类型 1=记录表 2=报告单")
-    private Integer tableType;
+    @ApiModelProperty(value = "表类型 1=记录表 2=报告单 ,字符串拼接")
+    private String tableType;
 
     @ApiModelProperty(value = "引用设备仪器ids")
     private String deviceUseIds;

+ 0 - 23
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOption.java

@@ -1,23 +0,0 @@
-package org.springblade.manager.dto;
-
-import lombok.Data;
-
-/**
- * @author yangyj
- * @Date 2023/3/1 17:35
- * @description TODO
- */
-@Data
-public class FormulaOption {
-    private Long id;
-    private Long parentId;
-    private String ekey;
-    private Long contractId;
-    private String value;
-    private Long pKeyId;
-    private Integer scope;
-
-    public String toSql(){
-        return ","+parentId+",'"+ekey+"',"+contractId+",'"+value+"',"+pKeyId+","+scope;
-    }
-}

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

@@ -0,0 +1,43 @@
+package org.springblade.manager.dto;
+
+import lombok.Data;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.FormulaOption;
+
+/**
+ * @author yangyj
+ * @Date 2023/3/1 17:35
+ * @description TODO
+ */
+@Data
+public class FormulaOptionVo {
+    private Long id;
+    private Long parentId;
+    private String key;
+    private Long contractId;
+    private String value;
+    private Long pKeyId;
+    private Integer scope;
+    public boolean saveChecked(){
+        if( Func.isNotBlank(value)&&contractId!=null&&parentId!=null&&pKeyId!=null&&key!=null&&scope!=null){
+            if(scope==0){
+                /*scope==0是元素范围,1是单元格范围*/
+                this.key=key.replaceAll("__[\\d_]+","");
+            }
+            return true;
+        }
+        return false;
+    }
+    public FormulaOption toFo(){
+        FormulaOption   formulaOption=new FormulaOption();
+        formulaOption.setParentId(this.parentId);
+        formulaOption.setContractId(this.contractId);
+        return formulaOption;
+    }
+    public boolean isElementScope(){
+        return this.scope==0;
+    }
+    public boolean isCellScope(){
+        return this.scope==1;
+    }
+}

+ 7 - 5
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -47,9 +47,10 @@ public class ArchiveTreeContract extends BaseEntity {
 	@ApiModelProperty(value = "租户id")
 	private String tenantId;
 
+
 	/**
-	* 项目ID
-	*/
+	 *  项目ID
+	 */
 	private Long projectId;
 	/**
 	* 合同段ID
@@ -155,9 +156,9 @@ public class ArchiveTreeContract extends BaseEntity {
 	 */
 	private Integer archiveAutoGroupSelect;
 
-//
-//	//系统级模板Id
-//	private Long originId;
+
+	//系统级模板Id
+	private Long baseId;
 	/**
 	 * 来源id,项目级,用于后续同步更新
 	 */
@@ -188,6 +189,7 @@ public class ArchiveTreeContract extends BaseEntity {
 		try {
 			BeanUtils.copyProperties(archiveTree,this);
 			this.fromId = archiveTree.getId();
+			this.baseId = archiveTree.getFromId();
 		} catch (BeansException e) {
 			e.printStackTrace();
 		}

+ 27 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java

@@ -0,0 +1,27 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author yangyj
+ * @Date 2023/3/6 9:17
+ * @description TODO
+ */
+@Data
+@TableName("m_formula")
+public class FormulaOption {
+    @ApiModelProperty("主键id")
+    @TableId(
+            value = "id",
+            type = IdType.ASSIGN_ID
+    )
+    private Long id;
+    private Long parentId;
+    private Long contractId;
+    private String val;
+}

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

@@ -24,7 +24,7 @@ public interface ExcelTabClient {
     String saveTabData(@RequestParam Integer isBatchSave,
                        @RequestBody JSONObject dataInfo,
                        @RequestParam Integer type,
-                       @RequestParam Integer tableType,
+                       @RequestParam String tableType,
                        @RequestParam Long id,
                        @RequestParam String tabIds) throws Exception;
 

+ 4 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractAutoRuleVO.java → blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeAutoRuleVO.java

@@ -7,7 +7,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 @Data
-public class ArchiveTreeContractAutoRuleVO implements INode<ArchiveTreeContractAutoRuleVO> {
+public class ArchiveTreeAutoRuleVO implements INode<ArchiveTreeAutoRuleVO> {
+
 
     private Long nodeId;//节点id
 
@@ -24,7 +25,7 @@ public class ArchiveTreeContractAutoRuleVO implements INode<ArchiveTreeContractA
 
     private Integer archiveAutoGroupSelect;
 
-    private List<ArchiveTreeContractAutoRuleVO> children=new ArrayList<>();
+    private List<ArchiveTreeAutoRuleVO> children=new ArrayList<>();
 
     @Override
     public Long getId() {
@@ -37,7 +38,7 @@ public class ArchiveTreeContractAutoRuleVO implements INode<ArchiveTreeContractA
     }
 
     @Override
-    public List<ArchiveTreeContractAutoRuleVO> getChildren() {
+    public List<ArchiveTreeAutoRuleVO> getChildren() {
         return children;
     }
 }

+ 23 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -44,7 +44,14 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 	@JsonSerialize(using = ToStringSerializer.class)
 	@ApiModelProperty(value = "主键id")
 	private Long id;
-
+	/**
+	 * 项目ID
+	 */
+	private Long projectId;
+	/**
+	 * 合同段ID
+	 */
+	private Long contractId;
 	/**
 	 * 父节点ID
 	 */
@@ -73,6 +80,11 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 	@ApiModelProperty(value = "是否有子孙节点")
 	private Boolean hasChildren;
 
+	/**
+	 * 关联类型
+	 */
+	private Integer associationType;
+
 	@Override
 	public List<ArchiveTreeContractVO2> getChildren() {
 		if (this.children == null) {
@@ -158,6 +170,16 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 
 	private String expDataType;
 
+	/**
+	 * 分类并卷的分类ID,当archiveAutoType=2时,用来确定同一类型。新增时随机生成,一同提交设置的节点都是同一类。 编辑时 采用已有的
+	 */
+	private Long archiveAutoGroupId;
+
+	/**
+	 * 设置分类并卷选择的节点设为1,其下范围内节点设为0
+	 */
+	private Integer archiveAutoGroupSelect;
+
 	public String toString() {
 		return "TreeNode(parentId=" + this.getParentId()
 				+ ",ancestors" + this.getAncestors()

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

@@ -175,4 +175,9 @@ public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
 
     private String expDataType;
 
+    /**
+     * 来源ID
+     */
+    private Long fromId;
+
 }

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

@@ -89,4 +89,6 @@ public class WbsNodeTableVO implements Serializable {
      */
     private String fillRate;
 
+    private String htmlUrl;
+
 }

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

@@ -163,8 +163,8 @@ public class ImageClassificationFileController extends BladeController {
                     //需要删除的本地文件集合
                     List<String> removeList = new ArrayList<>();
 
-                    // 压缩到小于指定文件大小500kb
-                    double targetSize = 500 * 1024;
+                    //压缩到小于指定文件大小100kb
+                    //double targetSize = 100 * 1024;
 
                     for (ImageClassificationFile file : fileResult) {
                         //获取图片文件流
@@ -204,16 +204,16 @@ public class ImageClassificationFileController extends BladeController {
 
                                             //获取文件流
                                             byte[] bytes = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(urls.get(i)));
-                                            byte[] a = new byte[(int) targetSize];
+
                                             //压缩文件大小
-                                            while (bytes.length > targetSize) {
+                                            /*while (bytes.length > targetSize) {
                                                 float reduceMultiple = 0.5f;
                                                 bytes = FileUtils.resizeImage(bytes, reduceMultiple);
-                                                a = bytes;
-                                            }
+                                            }*/
+                                            bytes = FileUtils.resizeImage(bytes, 0f);
 
                                             //创建图片
-                                            drawing.createPicture(anchor, workbook.addPicture(a, Workbook.PICTURE_TYPE_JPEG));
+                                            drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG));
                                             //图片定位
                                             FileUtils.imageOrientation(sheet, anchor, i == 1 ? new DataVO(1, 28) : new DataVO(0, 0));
 

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

@@ -38,6 +38,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.evisa.vo.CertBeanVO;
 import org.springblade.manager.entity.*;
@@ -356,6 +357,15 @@ public class InformationWriteQueryController extends BladeController {
         if (StringUtils.isNotEmpty(copyVO.getNeedCopyPrimaryKeyId()) && copyVO.getCopyBatchToPaths().size() > 0) {
             //查询被复制节点
             WbsTreeContract wbsTreeContract = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(copyVO.getNeedCopyPrimaryKeyId());
+
+            //获取数据写入的节点信息
+            List<CopyContractTreeNodeVO.CopyBatch> batchPathList = copyVO.getCopyBatchToPaths();
+            //获取数据源节点
+            CopyContractTreeNodeVO.CopyBatch copyBatchResource = batchPathList.stream().filter(f -> f.getPrimaryKeyId().equals(wbsTreeContract.getPKeyId().toString())).findAny().orElse(null);
+            if (copyBatchResource != null) {
+                return R.fail("请选择除【" + wbsTreeContract.getNodeName() + "】源节点之外的节点进行复制");
+            }
+
             String tabOwner;
             if (("1,2").equals(copyVO.getClassify()) || ("2,1").equals(copyVO.getClassify())) {
                 tabOwner = "1,2,3,4,5,6";
@@ -378,31 +388,51 @@ public class InformationWriteQueryController extends BladeController {
                 //获取源数据
                 Map<String, List<List<Map<String, Object>>>> tableBusinessDataMap = new HashMap<>();
                 for (WbsTreeContract treeContract : tableList) {
-                    List<Map<String, Object>> tableBusinessData = this.jdbcTemplate.queryForList("select * from " + treeContract.getInitTableName() + " where p_key_id = " + treeContract.getPKeyId());
-                    if (tableBusinessData.size() > 0) {
-                        //设置参数
-                        List<List<Map<String, Object>>> list;
-                        if (tableBusinessDataMap.containsKey(treeContract.getId().toString())) {
-                            list = tableBusinessDataMap.get(treeContract.getId().toString());
-                        } else {
-                            list = new ArrayList<>();
+                    if (StringUtils.isNotEmpty(treeContract.getInitTableName())) {
+                        //判断表是否存在
+                        String isExitSql = "select * from information_schema.TABLES where TABLE_NAME='" + treeContract.getInitTableName() + "'";
+                        List<Map<String, Object>> tabList = this.jdbcTemplate.queryForList(isExitSql);
+                        if (tabList.size() == 0) {
+                            continue; //未找到实体表跳过
+                        }
+
+                        String sql = "select * from " + treeContract.getInitTableName() + " where p_key_id = " + treeContract.getPKeyId();
+                        List<Map<String, Object>> tableBusinessData = this.jdbcTemplate.queryForList(sql);
+                        if (tableBusinessData.size() > 0) {
+                            //设置参数
+                            List<List<Map<String, Object>>> list;
+                            if (tableBusinessDataMap.containsKey(treeContract.getId().toString())) {
+                                list = tableBusinessDataMap.get(treeContract.getId().toString());
+                            } else {
+                                list = new ArrayList<>();
+                            }
+                            list.add(tableBusinessData);
+                            tableBusinessDataMap.put(treeContract.getId().toString(), list);
                         }
-                        list.add(tableBusinessData);
-                        tableBusinessDataMap.put(treeContract.getId().toString(), list);
                     }
                 }
 
-                //获取数据写入的节点信息
-                List<CopyContractTreeNodeVO.CopyBatch> batchPathList = copyVO.getCopyBatchToPaths();
                 //删除数据SQL
                 List<String> removeSqlList = new ArrayList<>();
                 //新增数据SQL
                 List<String> saveSqlList = new ArrayList<>();
+                //已上报状态的节点名称
+                Map<String, String> taskStatusMap = new HashMap<>();
 
                 for (CopyContractTreeNodeVO.CopyBatch copyBatch : batchPathList) {
                     //获取选择的节点信息
                     WbsTreeContract selectNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(copyBatch.getPrimaryKeyId());
 
+                    //判断该节点是否已上报,1=待审批,2=已审批均属于已上报
+                    String sqlSb = "select classify from u_information_query where type = 1 and status in (1,2) and wbs_id = " + selectNode.getPKeyId() + " and classify in (" + copyVO.getClassify() + ")";
+                    List<InformationQuery> query = jdbcTemplate.query(sqlSb, new BeanPropertyRowMapper<>(InformationQuery.class));
+                    if (query.size() > 0) {
+                        for (InformationQuery informationQuery : query) {
+                            taskStatusMap.put((new Integer(1)).equals(informationQuery.getClassify()) ? "施工" : "监理", selectNode.getNodeName());
+                        }
+                        continue;
+                    }
+
                     //实际获取的数据
                     Map<String, List<List<Map<String, Object>>>> currentDataMap = new HashMap<>();
 
@@ -468,6 +498,16 @@ public class InformationWriteQueryController extends BladeController {
                         }
                     }
                 }
+
+                if (taskStatusMap.size() > 0) {
+                    List<String> str = new ArrayList<>();
+                    for (Map.Entry<String, String> map : taskStatusMap.entrySet()) {
+                        str.add("【" + map.getValue() + "-" + map.getKey() + "】");
+                    }
+                    String join = StringUtils.join(str, "、");
+                    return R.fail(StringUtil.format("节点{}已上报,无法复制数据,请重新选择", join));
+                }
+
                 //删除原本填写的数据,覆盖
                 if (removeSqlList.size() > 0) {
                     for (String sql : removeSqlList) {
@@ -486,7 +526,7 @@ public class InformationWriteQueryController extends BladeController {
 
             //复制附件信息
             for (WbsTreeContract sourceDataObj : tableList) {
-                if (sourceDataObj.getTabFileType() == 2) {
+                if (ObjectUtils.isNotEmpty(sourceDataObj.getTabFileType()) && sourceDataObj.getTabFileType() == 2) {
                     //获取源表中的附件信息
                     String sql = "select * from m_table_file where is_deleted = 0 and type = 2 and tab_id =" + sourceDataObj.getPKeyId();
                     List<TableFile> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TableFile.class));
@@ -502,8 +542,8 @@ public class InformationWriteQueryController extends BladeController {
                                 //新增源数据附件到复制节点下对应表中
                                 tableFileClient.saveBatchFile(query, next.getPKeyId());
 
-                                //修改复制节点下对应表的按钮状态
-                                String updateStatus = "update m_wbs_tree_contract set tab_file_type = " + sourceDataObj.getTabFileType() + " ,is_tab_pdf = " + sourceDataObj.getIsTabPdf() + " ,pdf_url = '" + sourceDataObj.getPdfUrl() + "' ,is_buss_show = " + sourceDataObj.getIsBussShow() + " where p_key_id = " + next.getPKeyId();
+                                //修改复制节点下对应表的文件上传的按钮状态
+                                String updateStatus = "update m_wbs_tree_contract set tab_file_type = " + sourceDataObj.getTabFileType() + " where p_key_id = " + next.getPKeyId();
                                 jdbcTemplate.execute(updateStatus);
 
                                 iterator.remove();
@@ -512,7 +552,6 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 }
             }
-
             return R.data(true);
         }
 
@@ -1310,7 +1349,7 @@ public class InformationWriteQueryController extends BladeController {
                     String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
                     List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                     List<Integer> collect = query.stream().filter(f -> ObjectUtils.isNotEmpty(f.getSort())).collect(Collectors.toList()).stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
-                    Integer max=1;
+                    Integer max = 1;
                     if (collect.size() > 0) {
                         max = collect.stream().reduce(collect.get(0), Integer::max);
                     } else {
@@ -1363,7 +1402,7 @@ public class InformationWriteQueryController extends BladeController {
                             newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
 
                             //划分编号
-                            newData.setPartitionCode(StringUtils.isNotEmpty(node.getPartitionCode()) ? node.getPartitionCode() : null);
+                            newData.setPartitionCode(StringUtils.isNotEmpty(copyBatch.getPartitionCode()) ? copyBatch.getPartitionCode() : null);
                         }
                         //设置父节点ID
                         if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
@@ -1391,7 +1430,7 @@ public class InformationWriteQueryController extends BladeController {
                         String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
                         List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                         List<Integer> collect = query.stream().filter(f -> ObjectUtils.isNotEmpty(f.getSort())).collect(Collectors.toList()).stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
-                        Integer max=1;
+                        Integer max = 1;
                         if (collect.size() > 0) {
                             max = collect.stream().reduce(collect.get(0), Integer::max);
                         } else {
@@ -1697,10 +1736,18 @@ public class InformationWriteQueryController extends BladeController {
 
         //保存操作记录
         List<String> idArray = JSONArray.parseArray(JSONObject.toJSONString(ids.split(",")), String.class);
-
+        //获取当前节点的所有父节点
+        List<WbsTreeContract> result = new ArrayList<>();
+        result.add(removeNode);
+        this.queryParentNode(removeNode, result);
+        StringBuilder pathName = new StringBuilder();
+        for (int i = 1, l = result.size(); i <= l; i++) {
+            WbsTreeContract node = result.get(result.size() - i);
+            pathName.append("-").append(StringUtils.isNotEmpty(node.getFullName()) ? node.getFullName() : node.getNodeName());
+        }
         JSONObject json = new JSONObject();
         json.put("operationObjIds", idArray);
-        json.put("operationObjName", nodeName);
+        json.put("operationObjName", pathName.substring(1));
         this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", json);
 
         //保存进回收站
@@ -1833,7 +1880,7 @@ public class InformationWriteQueryController extends BladeController {
                 String sql = "select sort from m_wbs_tree_contract where contract_id = '" + treeContract.getContractId() + "' and (id = '" + half.getId() + "' or old_id = '" + half.getId() + "')";
                 List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                 List<Integer> collect = query.stream().filter(f -> ObjectUtils.isNotEmpty(f.getSort())).collect(Collectors.toList()).stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
-                Integer max =1 ;
+                Integer max = 1;
                 if (collect.size() > 0) {
                     max = collect.stream().reduce(collect.get(0), Integer::max);
                 } else {
@@ -1912,7 +1959,7 @@ public class InformationWriteQueryController extends BladeController {
         if (saveList.size() > 0) {
             //保存施工日志
             if (saveLedger.size() > 0) {
-                this.constructionLedgerService.saveBatch(saveLedger,1000);
+                this.constructionLedgerService.saveBatch(saveLedger, 1000);
             }
 
             try {
@@ -2287,7 +2334,6 @@ public class InformationWriteQueryController extends BladeController {
                 contractIds.add(contractIdRelation);
             }
             if (contractIds.size() > 0) {
-                //原始classify=2时查不出数量统计,所以改成传1
                 if (StringUtils.isNotEmpty(parentId)) {
                     //子节点
                     rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, parentId, Integer.parseInt(classifyType));

+ 13 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/MaterialProgressController.java

@@ -93,10 +93,19 @@ public class MaterialProgressController extends BladeController {
         } else {
             //找到根节点
             List<WbsTreeContractTreeVOS> nodeResult = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, StringUtils.isNotEmpty(parentId) ? parentId : "0");
-            if(nodeResult != null && nodeResult.size() > 0){
-
-                //找到当前节点下的所有填报节点
-                List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, new Integer(classifyType), contractId);
+            if(nodeResult != null && nodeResult.size() > 0) {
+                List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
+                if (StringUtils.isEmpty(parentId)) {
+                    //找到当前节点下的所有填报节点
+                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdThree("", new Integer(classifyType), contractId);
+                } else{
+                    WbsTreeContract node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(Long.valueOf(parentId), Long.valueOf(contractId));
+                    if (node.getParentId() == 0){
+                        queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdThree("", new Integer(classifyType), contractId);
+                    }else {
+                        queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdThree(parentId, new Integer(classifyType), contractId);
+                    }
+                }
                 //统计
                 this.countAmount(nodeResult, queryDataResult, contractId, reVO);
 

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

@@ -560,7 +560,7 @@ public class TaskController extends BladeController {
 	@ApiOperation(value = "完成/审批任务")
 	public R<Boolean> completeApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO) throws FileNotFoundException {
 		//检查当前用户是否存在等待批次
-		System.out.println(AuthUtil.getUserId());
+		//System.out.println(AuthUtil.getUserId());
 		long batchCount = this.taskBatchService.count(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getCreateUser, AuthUtil.getUserId()));
 
 		if(batchCount > 0){

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

@@ -124,7 +124,7 @@ public class TrialDetectionController extends BladeController {
     @PostMapping("/self/submit")
     @ApiOperationSupport(order = 11)
     @ApiOperation(value = "自检记录新增或修改", notes = "传入TrialSelfInspectionRecordDTO")
-    public R<Object> selfSubmit(@Valid @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception {
+    public R<Object> selfSubmit(@Valid @RequestBody TrialSelfInspectionRecordDTO dto) {
         return R.data(iTrialSelfInspectionRecordService.selfSubmit(dto));
     }
 

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

@@ -48,6 +48,10 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 	 * 查询工序节点的填报记录
 	 */
 	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
+	/**
+	 * 查询工序节点的填报记录,资料进度使用
+	 */
+	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdThree(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
 
 	/**
 	 * 根据节点ID及其填报的类型获取填报记录

+ 23 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -570,4 +570,27 @@
           AND wtc.is_deleted = 0
     </select>
 
+    <select id="queryProcessDataByParentIdAndContractIdThree" resultMap="queryProcessDataMap">
+        SELECT
+            wtc.id AS treeId,
+            wtc.p_key_id,
+            wtc.ancestors,
+            wtc.major_data_type,
+            wtc.node_type AS nodeType,
+            IFNULL(if(length(trim(wtc.full_name)) > 0, wtc.full_name, wtc.node_name),wtc.node_name) AS title,
+            wtc.parent_id AS parentId,
+            uiq.id AS informationQueryId,
+            uiq.status,
+            uiq.type AS queryType
+        FROM
+            m_wbs_tree_contract AS wtc
+                LEFT JOIN u_information_query AS uiq ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = #{classify} and uiq.is_deleted = 0
+        WHERE
+            wtc.type = 1
+          AND wtc.major_data_type in(1,2,3,4)
+          AND wtc.ancestors like concat('%',#{parentId},'%')
+          AND wtc.contract_id = #{contractId}
+          AND wtc.is_deleted = 0
+    </select>
+
 </mapper>

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

@@ -64,7 +64,7 @@
     </delete>
 
     <select id="selectAll" resultType="org.springblade.business.entity.TrialSelfInspectionRecord">
-        select * from u_trial_self_inspection_record where node_id = #{nodeId} and contract_id = #{contractId}
+        select record_no,report_no from u_trial_self_inspection_record where node_id = #{nodeId} and contract_id = #{contractId}
     </select>
 
     <select id="selectSelfSampleRecord" resultType="java.lang.String">

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

@@ -62,10 +62,15 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
 	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractId(String parentId, Integer classify, String contractId);
 
 	/**
-	 * 查询工序节点的填报记录2
+	 * 查询工序节点的填报记录,简化
 	 */
 	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(String parentId, Integer classify, String contractId);
 
+	/**
+	 * 查询工序节点的填报记录,status不默认为0,资料进度统计
+	 */
+	List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdThree(String parentId, Integer classify, String contractId);
+
 	/**
 	 * 保存填报时新增或修改填报资料记录表数据
 	 * @param wbsId 当前填报节点

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

@@ -15,7 +15,7 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
 
     IPage<TrialSelfInspectionRecordVO> selfPage(IPage<TrialSelfInspectionRecord> page, TrialSelfInspectionRecordPageDTO dto);
 
-    String selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception;
+    String selfSubmit(TrialSelfInspectionRecordDTO dto) ;
 
     List<TrialSampleInfoVO> selfSampleList(String id);
 

+ 7 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -119,13 +119,18 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         }
         return result;
     }
-
+    //简化
     @Override
     public List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(String parentId, Integer classify, String contractId) {
         List<QueryProcessDataVO> result = this.baseMapper.queryProcessDataByParentIdAndContractIdTwo(parentId, classify, contractId);
         return result;
     }
-
+    //资料进度统计使用
+    @Override
+    public List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdThree(String parentId, Integer classify, String contractId) {
+        List<QueryProcessDataVO> result = this.baseMapper.queryProcessDataByParentIdAndContractIdThree(parentId, classify, contractId);
+        return result;
+    }
 
     private List<FirstInformation> setFirstLinkData(List<JSONObject> linkDataList, String businessId) {
         List<FirstInformation> linkList = new ArrayList<>();

+ 169 - 61
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -204,11 +204,19 @@ public class TrialSelfInspectionRecordServiceImpl
     public boolean selfCopy(List<Long> ids) {
         List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectBatchIds(ids);
         for (TrialSelfInspectionRecord trialSelfInspectionRecord : trialSelfInspectionRecords) {
-            TrialSelfInspectionRecordDTO trialSelfInspectionRecordDTO = BeanUtil.copyProperties(trialSelfInspectionRecord, TrialSelfInspectionRecordDTO.class);
-            assert trialSelfInspectionRecordDTO != null;
-            trialSelfInspectionRecordDTO.setId(SnowFlakeUtil.getId()); //主键id
-            this.buildNumber(trialSelfInspectionRecordDTO); //重构编号
-            this.save(trialSelfInspectionRecordDTO); //复制新增
+            TrialSelfInspectionRecordDTO dto = BeanUtil.copyProperties(trialSelfInspectionRecord, TrialSelfInspectionRecordDTO.class);
+            assert dto != null;
+            dto.setId(SnowFlakeUtil.getId());
+            if (StringUtils.isNotEmpty(dto.getRecordNo())) {
+                dto.setTableType("1");
+            } else if (StringUtils.isNotEmpty(dto.getReportNo())) {
+                dto.setTableType("2");
+            } else if (StringUtils.isNotEmpty(dto.getReportNo()) && StringUtils.isNotEmpty(dto.getRecordNo())) {
+                dto.setTableType("1,2");
+            }
+            //重构编号
+            this.buildNumber(dto);
+            this.save(dto);
         }
         return true;
     }
@@ -642,8 +650,8 @@ public class TrialSelfInspectionRecordServiceImpl
     }
 
     @Override
-    public String selfSubmit(TrialSelfInspectionRecordDTO dto) throws Exception {
-        if (ObjectUtil.isEmpty(dto.getId())) {
+    public String selfSubmit(TrialSelfInspectionRecordDTO dto) {
+        if (ObjectUtil.isEmpty(dto.getId()) && StringUtils.isNotEmpty(dto.getTableType())) {
             //构建记录表编号、报告单编号
             this.buildNumber(dto);
 
@@ -667,9 +675,17 @@ public class TrialSelfInspectionRecordServiceImpl
             //获取当前最新的试验记录信息
             TrialSelfInspectionRecord obj = baseMapper.selectById(dto.getId());
 
+            //如果新增时不是两种类型表都填报过,那么有一项编号为Null,所以编辑时生成记录表编号或报告单编号
+            if (StringUtils.isEmpty(obj.getRecordNo()) && dto.getTableType().contains("1")) {
+                this.buildNumber(dto);
+                this.saveOrUpdate(dto);
+            } else if (StringUtils.isEmpty(obj.getReportNo()) && dto.getTableType().contains("2")) {
+                this.buildNumber(dto);
+                this.saveOrUpdate(dto);
+            }
+
             try {
-                //保存实体表数据、记录信息、生成pdf
-                assert obj != null;
+                //保存实体表数据、试验记录信息、生成pdf
                 String pdfURL = excelTabClient.saveTabData(dto.getIsBatchSave(), dto.getDataInfo(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
                 if (StringUtils.isNotEmpty(pdfURL)) {
                     //修改合并pdf
@@ -817,66 +833,158 @@ public class TrialSelfInspectionRecordServiceImpl
     private void buildNumber(TrialSelfInspectionRecordDTO dto) {
         StringSPUtils spUtils = new StringSPUtils();
         List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectAll(dto.getNodeId(), dto.getContractId());
-        //获取记录表最大编号
-        List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
-        String maxRecordNo;
-        if (recordNos.size() == 0 || ObjectUtil.isEmpty(recordNos)) {
-            maxRecordNo = "0001";
-        } else {
-            List<String> numberRecordNos = new ArrayList<>();
-            for (String recordNo : recordNos) {
-                String number = recordNo.split("-")[recordNo.split("-").length - 1];
-                numberRecordNos.add(number);
+
+        //两种类型同时生成
+        if (dto.getTableType().contains("1,2") || dto.getTableType().contains("2,1")) {
+            String maxRecordNo = "";
+            if (StringUtils.isEmpty(dto.getRecordNo())) {
+                //获取记录表最大编号
+                List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
+                if (recordNos.size() == 0 || ObjectUtil.isEmpty(recordNos)) {
+                    maxRecordNo = "0001";
+                } else {
+                    List<String> numberRecordNos = new ArrayList<>();
+                    for (String recordNo : recordNos) {
+                        String number = recordNo.split("-")[recordNo.split("-").length - 1];
+                        numberRecordNos.add(number);
+                    }
+                    int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
+                    if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
+                        maxRecordNo = spUtils.buildSerial(maxRecordNo1, 4);
+                    } else {
+                        throw new ServiceException("当前编号已达到最大值9999,操作失败");
+                    }
+                }
             }
-            int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
-            if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
-                maxRecordNo = spUtils.buildSerial(maxRecordNo1, 4);
+
+            String maxReportNo = "";
+            if (StringUtils.isEmpty(dto.getReportNo())) {
+                //获取报告单最大编号
+                List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
+                if (reportNos.size() == 0 || ObjectUtil.isEmpty(reportNos)) {
+                    maxReportNo = "0001";
+                } else {
+                    List<String> numberReportNo = new ArrayList<>();
+                    for (String reportNo : reportNos) {
+                        String number = reportNo.split("-")[reportNo.split("-").length - 1];
+                        numberReportNo.add(number);
+                    }
+                    int maxReportNo1 = Integer.parseInt(Collections.max(numberReportNo)) + 1;
+                    if (maxReportNo1 < 9999 && maxReportNo1 > 0) {
+                        maxReportNo = spUtils.buildSerial(maxReportNo1, 4);
+                    } else {
+                        throw new ServiceException("当前编号已达到最大值9999,操作失败");
+                    }
+                }
+            }
+
+            List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+            ContractInfo contract = contractClient.getContractById(dto.getContractId());
+            int year = LocalDateTimeUtil.now().getYear();
+            if (wbsTreePrivate == null) {
+                throw new ServiceException("未找到当前节点信息,操作失败!");
             } else {
-                throw new ServiceException("当前编号已达到最大值9999,操作失败");
+                //记录表
+                if (StringUtils.isNotEmpty(maxRecordNo)) {
+                    String str1 = "JL" +
+                            "-" + contract.getContractNumber() +
+                            "-" + year +
+                            "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                            "-" + maxRecordNo;
+                    dto.setRecordNo(str1);
+                }
+
+                //报告单
+                if (StringUtils.isNotEmpty(maxReportNo)) {
+                    String str2 = "BG" +
+                            "-" + contract.getContractNumber() +
+                            "-" + year +
+                            "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                            "-" + maxReportNo;
+                    dto.setReportNo(str2);
+                }
             }
         }
 
-        //获取报告单最大编号
-        List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
-        String maxReportNo;
-        if (reportNos.size() == 0 || ObjectUtil.isEmpty(reportNos)) {
-            maxReportNo = "0001";
-        } else {
-            List<String> numberReportNo = new ArrayList<>();
-            for (String reportNo : reportNos) {
-                String number = reportNo.split("-")[reportNo.split("-").length - 1];
-                numberReportNo.add(number);
-            }
-            int maxReportNo1 = Integer.parseInt(Collections.max(numberReportNo)) + 1;
-            if (maxReportNo1 < 9999 && maxReportNo1 > 0) {
-                maxReportNo = spUtils.buildSerial(maxReportNo1, 4);
-            } else {
-                throw new ServiceException("当前编号已达到最大值9999,操作失败");
+        //记录表
+        if (("1").equals(dto.getTableType())) {
+            if (StringUtils.isEmpty(dto.getRecordNo())) {
+                //获取记录表最大编号
+                List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
+                String maxRecordNo;
+                if (recordNos.size() == 0 || ObjectUtil.isEmpty(recordNos)) {
+                    maxRecordNo = "0001";
+                } else {
+                    List<String> numberRecordNos = new ArrayList<>();
+                    for (String recordNo : recordNos) {
+                        String number = recordNo.split("-")[recordNo.split("-").length - 1];
+                        numberRecordNos.add(number);
+                    }
+                    int maxRecordNo1 = Integer.parseInt(Collections.max(numberRecordNos)) + 1;
+                    if (maxRecordNo1 < 9999 && maxRecordNo1 > 0) {
+                        maxRecordNo = spUtils.buildSerial(maxRecordNo1, 4);
+                    } else {
+                        throw new ServiceException("当前编号已达到最大值9999,操作失败");
+                    }
+                }
+
+                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
+                WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+                ContractInfo contract = contractClient.getContractById(dto.getContractId());
+                int year = LocalDateTimeUtil.now().getYear();
+                if (wbsTreePrivate == null) {
+                    throw new ServiceException("未找到当前节点信息,操作失败!");
+                } else {
+                    //记录表
+                    String str1 = "JL" +
+                            "-" + contract.getContractNumber() +
+                            "-" + year +
+                            "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                            "-" + maxRecordNo;
+                    dto.setRecordNo(str1);
+                }
             }
         }
 
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
-        ContractInfo contract = contractClient.getContractById(dto.getContractId());
-        int year = LocalDateTimeUtil.now().getYear();
-        if (wbsTreePrivate == null) {
-            throw new ServiceException("未找到当前节点信息,操作失败!");
-        } else {
-            //记录表
-            String str1 = "JL" +
-                    "-" + contract.getContractNumber() +
-                    "-" + year +
-                    "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
-                    "-" + maxRecordNo;
-            dto.setRecordNo(str1);
-
-            //报告单
-            String str2 = "BG" +
-                    "-" + contract.getContractNumber() +
-                    "-" + year +
-                    "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
-                    "-" + maxReportNo;
-            dto.setReportNo(str2);
+        //报告单
+        if (("2").equals(dto.getTableType())) {
+            if (StringUtils.isEmpty(dto.getReportNo())) {
+                //获取报告单最大编号
+                List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
+                String maxReportNo;
+                if (reportNos.size() == 0 || ObjectUtil.isEmpty(reportNos)) {
+                    maxReportNo = "0001";
+                } else {
+                    List<String> numberReportNo = new ArrayList<>();
+                    for (String reportNo : reportNos) {
+                        String number = reportNo.split("-")[reportNo.split("-").length - 1];
+                        numberReportNo.add(number);
+                    }
+                    int maxReportNo1 = Integer.parseInt(Collections.max(numberReportNo)) + 1;
+                    if (maxReportNo1 < 9999 && maxReportNo1 > 0) {
+                        maxReportNo = spUtils.buildSerial(maxReportNo1, 4);
+                    } else {
+                        throw new ServiceException("当前编号已达到最大值9999,操作失败");
+                    }
+                }
+
+                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Func.toStrList(String.valueOf(dto.getNodeId())));
+                WbsTreePrivate wbsTreePrivate = wbsTreePrivates.stream().findAny().orElse(null);
+                ContractInfo contract = contractClient.getContractById(dto.getContractId());
+                int year = LocalDateTimeUtil.now().getYear();
+                if (wbsTreePrivate == null) {
+                    throw new ServiceException("未找到当前节点信息,操作失败!");
+                } else {
+                    //报告单
+                    String str2 = "BG" +
+                            "-" + contract.getContractNumber() +
+                            "-" + year +
+                            "-" + spUtils.getStringSP(wbsTreePrivate.getNodeName().trim()) +
+                            "-" + maxReportNo;
+                    dto.setReportNo(str2);
+                }
+            }
         }
     }
 

+ 4 - 2
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -104,8 +104,10 @@ public class FileUtils {
      */
     public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
-        int width = (int) (bi.getWidth() * reduceMultiple);
-        int height = (int) (bi.getHeight() * reduceMultiple);
+        /*int width = (int) (bi.getWidth() * reduceMultiple);
+        int height = (int) (bi.getHeight() * reduceMultiple);*/
+        int width = 768;
+        int height = 1024;
         Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
         BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         Graphics g = tag.getGraphics();

+ 1 - 31
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -37,9 +37,8 @@ import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.service.IArchiveTreeService;
-import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
-import org.springblade.manager.vo.ArchiveTreeVO;
+
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -230,36 +229,7 @@ public class ArchiveTreeContractController extends BladeController {
 	}
 
 
-	/**
-	 * 保存立卷规则设置
-	 */
-	@PostMapping("/saveArchiveAutoRule")
-	@ApiOperationSupport(order = 8)
-	@ApiOperation(value = "保存立卷规则设置", notes = "传入archiveAutoType规则类型,nodeIds逗号拼接选择节点id")
-	public R saveArchiveAutoRule(@ApiParam(value = "立卷规则", required = true) @RequestParam Integer archiveAutoType,
-					@ApiParam(value = "主键集合", required = true) @RequestParam String nodeIds) {
-		return R.status(archiveTreeContractService.saveArchiveAutoRule(archiveAutoType,nodeIds));
-	}
-
-
-	/**
-	 * 查看立卷规则设置
-	 */
-	@PostMapping("/getArchiveAutoRule")
-	@ApiOperationSupport(order = 9)
-	@ApiOperation(value = "查看立卷规则设置", notes = "传入节点id")
-	public R getArchiveAutoRule(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
-		Map<String, Object> ruleMap=archiveTreeContractService.getArchiveAutoRule(id);
-		return R.data(ruleMap);
-	}
 
-	/**
-	 * 修改立卷规则设置
-	 */
-	@PostMapping("/updateArchiveAutoRule")
-	public R updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
-		return R.status(archiveTreeContractService.updateArchiveAutoRule(dto));
-	}
 
 
 	/**

+ 35 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java

@@ -13,6 +13,7 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
 import org.springblade.manager.vo.ArchiveTreeVO2;
@@ -24,6 +25,7 @@ import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.util.List;
+import java.util.Map;
 
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
@@ -138,7 +140,7 @@ public class ArchiveTreeController extends BladeController {
     })
     public R<List<ArchiveTreeVO2>> tree(Long projectId,Integer disPlayTree, Integer nodeType,String wbsId) {
 
-        List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(),projectId, disPlayTree, nodeType,wbsId);
+        List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(),projectId, disPlayTree, nodeType,wbsId,true);
         if (tree != null && tree.size() > 0) {
             return R.data(tree);
         }
@@ -195,4 +197,36 @@ public class ArchiveTreeController extends BladeController {
         return R.fail(200, "初始化创建失败");
     }
 
+
+    /**
+     * 保存立卷规则设置
+     */
+    @PostMapping("/saveArchiveAutoRule")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "保存立卷规则设置", notes = "传入archiveAutoType规则类型,nodeIds逗号拼接选择节点id")
+    public R saveArchiveAutoRule(@ApiParam(value = "立卷规则", required = true) @RequestParam Integer archiveAutoType,
+                                 @ApiParam(value = "主键集合", required = true) @RequestParam String nodeIds) {
+        return R.status(archiveTreeService.saveArchiveAutoRule(archiveAutoType,nodeIds));
+    }
+
+
+    /**
+     * 查看立卷规则设置
+     */
+    @PostMapping("/getArchiveAutoRule")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "查看立卷规则设置", notes = "传入节点id")
+    public R getArchiveAutoRule(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
+        Map<String, Object> ruleMap=archiveTreeService.getArchiveAutoRule(id);
+        return R.data(ruleMap);
+    }
+
+    /**
+     * 修改立卷规则设置
+     */
+    @PostMapping("/updateArchiveAutoRule")
+    public R updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
+        return R.status(archiveTreeService.updateArchiveAutoRule(dto));
+    }
+
 }

+ 24 - 28
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -52,6 +52,7 @@ public class FormulaController {
     private final JdbcTemplate jdbcTemplate;
     private final IContractInfoService contractInfoService;
     private final ITextdictInfoService textdictInfoService;
+    private final IFormulaOptionService formulaOptionService;
     /**
      * 新增或修改
      */
@@ -174,8 +175,10 @@ public class FormulaController {
                 FormulaBean fb=BeanUtil.toBean(map,FormulaBean.class);
                 if(StringUtils.isNotEmpty(rely)){
                     String[] relyArr = rely.split(StringPool.COMMA);
-                   List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select CONCAT(a.tab_en_name,':',b.e_key) ekey,a.tab_ch_name tableName,b.e_name ename  ,b.e_length elength,c.dict_value type from m_table_info a JOIN m_wbs_form_element b on a.id=b.f_id  LEFT JOIN (select dict_key, dict_value from blade_dict where code ='data_type' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 )c on b.e_type=c.dict_key" +
-                            " where  a.tab_en_name in( "+ Arrays.stream(relyArr).map(e->e.split(StringPool.COLON)[0]).distinct().collect(Collectors.joining(StringPool.COMMA,"'","'"))+")");
+                   List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select CONCAT(a.tab_en_name,':',b.e_key) ekey,a.tab_ch_name tableName,b.e_name ename  ,b.e_length elength,c.dict_value type f" +
+                           "rom m_table_info a JOIN m_wbs_form_element b on a.id=b.f_id  " +
+                           "LEFT JOIN (select dict_key, dict_value from blade_dict where code ='data_type' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 )c on b.e_type=c.dict_key" +
+                           " where  a.tab_en_name in( "+ Arrays.stream(relyArr).map(e->e.split(StringPool.COLON)[0]).distinct().collect(Collectors.joining(StringPool.COMMA,"'","'"))+")");
                    if(ListUtils.isNotEmpty(mapList)){
                        fb.setDict(mapList.stream().filter(e-> Arrays.stream(relyArr).anyMatch(c->StringUtils.isEquals(e.get("ekey"),c))).collect(Collectors.toMap(e->StringUtils.handleNull(e.get("ekey")), e->e)));
                    }
@@ -340,9 +343,9 @@ public class FormulaController {
     @GetMapping("/panel")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "公式交互面板", notes = "公式交互面板")
-    public R<Object> panel(FormulaOption fo)  {
+    public R<Object> panel(FormulaOptionVo fo)  {
              Map<String,Object> result = new LinkedHashMap<>();
-             String  key=fo.getEkey().replaceAll("__[\\d_]+","");;
+             String  key=fo.getKey().replaceAll("__[\\d_]+","");
               ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
               List<KeyMapper> kms =  this.service.getKeyMapperList(Collections.singletonList(fo.getPKeyId()),contract.getPId());
               KeyMapper keyMapper=null;
@@ -354,28 +357,13 @@ public class FormulaController {
               }
               if(keyMapper!=null&&Func.isNotEmpty(keyMapper.getFormulaId())){
                    Formula formula = this.service.getById(keyMapper.getFormulaId());
-                   /*临时处理,等确定数据结构在优化*/
+                  String data = this.formulaOptionService.queryOption(fo.getContractId(),fo.getParentId(),fo.getPKeyId(),fo.getKey());
+                  /*临时处理,等确定数据结构在优化*/
                    if(formula.getFormula().contains(".option")){
-                       JSONObject jo =JSON.parseObject(TEMPLATE);
-                       jo.put("scope",0);
-                       JSONObject info =jo.getJSONObject("info");
-                       info.put("label","是否引用公式数据");
-                       /*针对元素级别*/
-                       List<Map<String,Object>> mapList=this.jdbcTemplate.queryForList("select id,parent_id parentId,table_id pKeyId,val value,e_key ekey,contract_id contractId,scope from m_formula_option where scope=0 and parent_id ="+fo.getParentId()+" and e_key='"+key+"' and contract_id="+fo.getContractId());
-                       if(Func.isNotEmpty(mapList)){
-                           info.put("data",mapList.get(0));
-                       }
-                     return    R.data(jo);
+                       return R.data(createRadioPanel(0,"是否引用公式数据",data));
                    }else if (StringUtils.isEquals("MILE",formula.getNumber())){
                       if(StringUtils.isEquals(key,formula.getRelyList().get(0).split(StringPool.COLON)[1])){
-                          JSONObject jo =JSON.parseObject(TEMPLATE);
-                          jo.put("scope",1);
-                          JSONObject info =jo.getJSONObject("info");
-                          info.put("label","竖直方向");
-                          List<Map<String,Object>> mapList=this.jdbcTemplate.queryForList("select id,parent_id parentId,table_id pKeyId,val value,e_key ekey,contract_id contractId,scope from m_formula_option where scope=1 and table_id="+fo.getPKeyId()+" and parent_id ="+fo.getParentId()+" and e_key='"+key+"' and contract_id="+fo.getContractId());
-                          if(Func.isNotEmpty(mapList)){
-                              result.put("data",mapList.get(0));
-                          }
+                          return R.data(createRadioPanel(1,"竖直方向",data));
                       }
                   }
               }else{
@@ -384,14 +372,22 @@ public class FormulaController {
              return R.data(result);
     }
 
+    public JSONObject createRadioPanel(Integer scope,String label,String data){
+        JSONObject jo =JSON.parseObject(TEMPLATE);
+        jo.put("scope",1);
+        JSONObject info =jo.getJSONObject("info");
+        info.put("label","竖直方向");
+        if(Func.isNotEmpty(data)){
+            info.put("data",data);
+        }
+        return jo;
+    }
+
     @PostMapping("/panel-save")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "公式交互面板参数保存", notes = "公式交互面板参数保存")
-    public R<Object> panelSave( @RequestBody FormulaOption fo){
-            if(Func.isNotEmpty(fo.getId())){
-                this.jdbcTemplate.execute("delete from m_formula_option where id="+fo.getId());
-            }
-            this.jdbcTemplate.execute("insert into m_formula_option values ("+SnowFlakeUtil.getId()+fo.toSql()+")");
+    public R<Object> panelSave( @RequestBody FormulaOptionVo fo){
+
            return    R.success("保存成功");
     }
 

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

@@ -117,7 +117,7 @@ public class TableFileController extends BladeController {
     @PostMapping("/remove-trial")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "逻辑删除", notes = "传入当前文件ids、tableType、合同段Id、当前自检记录id")
-    public R removeTrial(@RequestParam String ids, @RequestParam Integer tableType, @RequestParam String contractId, @RequestParam Long id) throws Exception {
+    public R removeTrial(@RequestParam String ids, @RequestParam String tableType, @RequestParam String contractId, @RequestParam Long id) throws Exception {
         //基本信息
         TableFile tableFile = tableFileService.getById(ids);
 
@@ -136,6 +136,7 @@ public class TableFileController extends BladeController {
                 .eq(WbsTreePrivate::getPKeyId, pkeyId));
 
         WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                .select(WbsTreePrivate::getPKeyId)
                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                 .eq(WbsTreePrivate::getId, wbsTreePrivate.getParentId())
         );
@@ -162,7 +163,7 @@ public class TableFileController extends BladeController {
         }
 
         //获取当前记录下的文本元素表的附件文件信息
-        List<TableFile> fileList = this.tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>lambdaQuery()
+        Long row = this.tableFileService.getBaseMapper().selectCount(Wrappers.<TableFile>lambdaQuery()
                 .eq(TableFile::getType, 2)
                 .eq(TableFile::getTabId, pkeyId)
                 .eq(TableFile::getTrialRecordId, id)
@@ -170,7 +171,7 @@ public class TableFileController extends BladeController {
 
         //修改按钮状态
         String updateSql;
-        if (fileList.size() == 0) {
+        if (row == 0) {
             //无附件
             updateSql = "update u_trial_self_data_record set is_tab_file_type = 1 where tab_id = " + pkeyId + " and record_id = " + id;
         } else {

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

@@ -317,6 +317,9 @@ public class WbsTreePrivateController extends BladeController {
         List<WbsNodeTableVO> rs = wbsTreePrivateService.selectByNodeTable(parentId, wbsId, projectId);
         if (rs.size() > 0) {
             for (WbsNodeTableVO r : rs) {
+                if (StringUtil.isBlank(r.getHtmlUrl())){
+                    r.setIsLinkTable(1);
+                }
                 if (StringUtil.isBlank(r.getInitTableId())) {
                     WbsTree wbsTree = wbsTreeService.getById(r.getId());
                     if (wbsTree != null) {

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

@@ -41,6 +41,6 @@ public class ArchiveTreeClientImpl implements ArchiveTreeClient {
 
     @Override
     public R<List<ArchiveTreeVO2>> tree(Long projectId,Integer disPlayTree, Integer nodeType) {
-        return R.data(this.archiveTreeService.tree2(AuthUtil.getTenantId(),projectId, disPlayTree, nodeType,null));
+        return R.data(this.archiveTreeService.tree2(AuthUtil.getTenantId(),projectId, disPlayTree, nodeType,null,false));
     }
 }

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

@@ -44,7 +44,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
 
     @Override
-    public String saveTabData(Integer isBatchSave, JSONObject dataInfo, Integer type, Integer tableType, Long id, String tabIds) throws Exception {
+    public String saveTabData(Integer isBatchSave, JSONObject dataInfo, Integer type, String tableType, Long id, String tabIds) throws Exception {
         //通用参数
         JSONArray dataArray = dataInfo.getJSONArray("orderList");
         JSONObject table = dataArray.getJSONObject(0);
@@ -143,7 +143,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, String id, String tabIds) throws Exception {
         //合并PDF加载
         return excelTabService.getBussPDFSTrial(nodeId,
-                Integer.parseInt(tableType), //tableType=表类型 1=记录表 2=报告单
+                tableType, //tableType=表类型 1=记录表 2=报告单
                 classify, //type=所属方 1=施工质检 2=监理抽检
                 contractId, //合同段id
                 projectId, //项目id

+ 0 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -19,7 +19,6 @@ package org.springblade.manager.mapper;
 
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -59,29 +58,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	List<ArchiveTreeContractVO2> lazyTree3(@Param("tenantId") String tenantId, @Param("parentId") Long parentId, @Param("projectId") Long projectId, @Param("treeCode") Long treeCode);
 
 	List<ArchiveTreeContractVO2> tree3(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType, @Param("projectId") Long projectId, @Param("treeCode") Long treeCode);
-	/**
-	 * 自动组卷规则设置节点下所有子节点
-	 * @param treeContract
-	 * @return
-	 */
-	int updateAllSonNodeIdsForArchiveAutoRule(@Param("treeContract") ArchiveTreeContract treeContract);
 
-	/**
-	 * 删除立卷规则设置
-	 * @param treeContract
-	 * @return
-	 */
-	int removeAllSonNodeIdsForArchiveAutoRule_1(@Param("treeContract") ArchiveTreeContract treeContract);
-	int removeAllSonNodeIdsForArchiveAutoRule_2(@Param("treeContract") ArchiveTreeContract treeContract);
-	int removeAllSonNodeIdsForArchiveAutoRule_3(@Param("treeContract") ArchiveTreeContract treeContract);
-	int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId);
-	/**
-	 * 查看分类并卷规则-获取大类所有节点
-	 * @param ancestors
-	 * @param groupId
-	 * @return
-	 */
-	List<ArchiveTreeContractAutoRuleVO> getAllSonNodeforGroupView(@Param("ancestors")String ancestors, @Param("groupId")Long groupId);
 
 	int updateBatch(@Param("diffRent") List<String> diffRent);
 

+ 12 - 113
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -35,6 +35,7 @@
         <result column="ext_type" property="extType"/>
         <result column="ext_id" property="extId"/>
         <result column="exp_data_type" property="expDataType"/>
+        <result column="from_id" property="fromId"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
         <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
@@ -76,6 +77,7 @@
         <result column="title" property="title"/>
         <result column="value" property="value"/>
         <result column="key" property="key"/>
+        <result column="contract_id" property="contractId"/>
         <result column="has_children" property="hasChildren"/>
         <result column="displayHierarchy" property="displayHierarchy"/>
         <result column="majorDataType" property="majorDataType"/>
@@ -89,20 +91,15 @@
         <result column="ext_type" property="extType"/>
         <result column="ext_id" property="extId"/>
         <result column="exp_data_type" property="expDataType"/>
+        <result column="from_id" property="fromId"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
-    </resultMap>
-
-    <resultMap id="getAllSonNodeforGroupViewResultMap" type="org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO">
-        <id column="id" property="nodeId"/>
-        <result column="parent_id" property="parentId"/>
-        <result column="node_name" property="nodeName"/>
-        <result column="archive_auto_type" property="archiveAutoType"/>
-        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
-        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
         <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
+        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
     </resultMap>
 
+
+
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
         d.id,
@@ -186,6 +183,8 @@
         d.exp_data_type,
         d.archive_auto_type,
         d.archive_auto_node_id,
+        d.archive_auto_group_select,
+        d.archive_auto_group_id,
         (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
         AS "has_children"
         FROM
@@ -205,6 +204,7 @@
         SELECT
         id,
         parent_id,
+        contract_id,
         node_name AS title,
         id AS "value",
         id AS "key",
@@ -221,7 +221,9 @@
         ext_id,
         exp_data_type,
         archive_auto_type,
-        archive_auto_node_id
+        archive_auto_node_id,
+        archive_auto_group_select,
+        archive_auto_group_id
         FROM m_archive_tree_contract
         WHERE is_deleted = 0 and project_id = #{projectId}
         <if test=" tenantId!=null and tenantId!='' ">
@@ -241,111 +243,8 @@
         ORDER BY sort
     </select>
 
-    <update id="updateAllSonNodeIdsForArchiveAutoRule">
-
-        <if test="treeContract.archiveAutoType ==1 ">
-            update m_archive_tree_contract
-            set
-            archive_auto_node_id = #{treeContract.archiveAutoNodeId}
-            where
-            is_deleted = 0 and ancestors like concat('', #{treeContract.ancestors}, '%');
-        </if>
-
-        update m_archive_tree_contract
-        set
-            archive_auto_type= #{treeContract.archiveAutoType},
-            <if test="treeContract.archiveAutoType ==2 ">
-                archive_auto_group_id=#{treeContract.archiveAutoGroupId},
-                archive_auto_group_select=0
-            </if>
-        where
-            is_deleted = 0 and ancestors like concat('', #{treeContract.ancestors}, '%')
-            /*最高并卷规则不能覆盖 分类并卷规则,单独组卷规则*/
-            <if test="treeContract.archiveAutoType ==1 ">
-                and archive_auto_type != 2 and archive_auto_type != 3
-            </if>
-            /*分类并卷规则不能覆盖单独组卷规则*/
-            <if test="treeContract.archiveAutoType ==2 ">
-                and archive_auto_type != 3
-            </if>
-    </update>
-
-    <update id="removeAllSonNodeIdsForArchiveAutoRule_1">
-        update m_archive_tree_contract
-        set
-        archive_auto_node_id = NULL
-        where
-        is_deleted = 0
-        and ancestors like concat('', #{treeContract.ancestors}, '%');
 
 
-        update m_archive_tree_contract
-        set
-            archive_auto_type = NULL
-        where
-        is_deleted = 0
-        and ancestors like concat('', #{treeContract.ancestors}, '%')
-        /*取消规则 只取消规则与自己一致的*/
-        and archive_auto_type = #{treeContract.archiveAutoType} ;
-    </update>
-
-    <update id="removeAllSonNodeIdsForArchiveAutoRule_3">
-        update m_archive_tree_contract
-        set
-            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
-            archive_auto_type = 1
-        where
-        is_deleted = 0
-        and ancestors like concat('', #{treeContract.ancestors}, '%')
-        /*取消规则 只取消规则与自己一致的*/
-        and archive_auto_type = #{treeContract.archiveAutoType}
-    </update>
-    <update id="removeAllSonNodeIdsForArchiveAutoRule_2">
-        /*取消单个节点的分类并卷规则*/
-        update m_archive_tree_contract
-        set
-            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
-            archive_auto_type = 1 ,
-            archive_auto_group_id = NULL,
-            archive_auto_group_select =NULL
-        where
-          is_deleted = 0
-          and ancestors like concat('', #{treeContract.ancestors}, '%')
-            /*取消规则 只取消规则与自己一致的*/
-          and archive_auto_type = #{treeContract.archiveAutoType}
-    </update>
-
-    <update id="removeNodeForArchiveAutoRule_Group">
-        /**取消同一组的分类并卷规则*/
-        update m_archive_tree_contract
-        set
-            archive_auto_type = 1 ,
-            archive_auto_group_id = NULL,
-            archive_auto_group_select =NULL
-        where
-            is_deleted = 0
-            and archive_auto_group_id = #{archiveAutoGroupId}
-    </update>
-
-    <select id="getAllSonNodeforGroupView" resultMap="getAllSonNodeforGroupViewResultMap">
-        SELECT
-            id,
-            parent_id,
-            node_name,
-            archive_auto_type,
-            archive_auto_node_id,
-            archive_auto_group_id,
-            archive_auto_group_select
-        FROM m_archive_tree_contract
-        where is_deleted = 0
-          and ancestors like concat('', #{ancestors}, '%')
-          and archive_auto_type !=3
-          and id not in (
-                select id from m_archive_tree_contract where archive_auto_type=2 and archive_auto_group_id != #{groupId}
-          )
-        order by ancestors asc,sort asc
-    </select>
-
     <update id="updateBatch">
         UPDATE m_archive_tree_contract
         SET is_upload_file_display_configuration_tree = 1

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

@@ -2,9 +2,9 @@ package org.springblade.manager.mapper;
 
 import feign.Param;
 import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.vo.ArchiveTreeAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.vo.ArchiveTreeVO2;
 
 import java.util.List;
@@ -23,4 +23,28 @@ public interface ArchiveTreeMapper extends BaseMapper<ArchiveTree> {
 
     int updateBatch3();
 
+    /**
+     * 自动组卷规则设置节点下所有子节点
+     * @param tree
+     * @return
+     */
+    int updateAllSonNodeIdsForArchiveAutoRule(@Param("treeContract") ArchiveTree tree);
+
+    /**
+     * 删除立卷规则设置
+     * @param tree
+     * @return
+     */
+    int removeAllSonNodeIdsForArchiveAutoRule_1(@Param("tree") ArchiveTree tree);
+    int removeAllSonNodeIdsForArchiveAutoRule_2(@Param("tree") ArchiveTree tree);
+    int removeAllSonNodeIdsForArchiveAutoRule_3(@Param("tree") ArchiveTree tree);
+    int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId);
+    /**
+     * 查看分类并卷规则-获取大类所有节点
+     * @param ancestors
+     * @param groupId
+     * @return
+     */
+    List<ArchiveTreeAutoRuleVO> getAllSonNodeforGroupView(@Param("ancestors")String ancestors, @Param("groupId")Long groupId);
+
 }

+ 116 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml

@@ -94,6 +94,16 @@
         <result column="postType" property="postType"/>
     </resultMap>
 
+    <resultMap id="getAllSonNodeforGroupViewResultMap" type="org.springblade.manager.vo.ArchiveTreeAutoRuleVO">
+        <id column="id" property="nodeId"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="node_name" property="nodeName"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
+        <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
+    </resultMap>
+
     <update id="updateBatch">
         UPDATE m_archive_tree
         SET is_upload_file_display_configuration_tree = 1
@@ -244,6 +254,7 @@
         project_type,
         storage_type,
         association_type,
+        from_id,
         ext_type,
         ext_id,
         exp_data_type,
@@ -270,4 +281,109 @@
         ORDER BY sort
     </select>
 
+    <update id="updateAllSonNodeIdsForArchiveAutoRule">
+
+        <if test="tree.archiveAutoType ==1 ">
+            update m_archive_tree
+            set
+            archive_auto_node_id = #{tree.archiveAutoNodeId}
+            where
+            is_deleted = 0 and ancestors like concat('', #{tree.ancestors}, '%');
+        </if>
+
+        update m_archive_tree
+        set
+        archive_auto_type= #{tree.archiveAutoType},
+        <if test="tree.archiveAutoType ==2 ">
+            archive_auto_group_id=#{tree.archiveAutoGroupId},
+            archive_auto_group_select=0
+        </if>
+        where
+        is_deleted = 0 and ancestors like concat('', #{tree.ancestors}, '%')
+        /*最高并卷规则不能覆盖 分类并卷规则,单独组卷规则*/
+        <if test="tree.archiveAutoType ==1 ">
+            and archive_auto_type != 2 and archive_auto_type != 3
+        </if>
+        /*分类并卷规则不能覆盖单独组卷规则*/
+        <if test="tree.archiveAutoType ==2 ">
+            and archive_auto_type != 3
+        </if>
+    </update>
+
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_1">
+        update m_archive_tree
+        set
+            archive_auto_node_id = NULL
+        where
+            is_deleted = 0
+          and ancestors like concat('', #{tree.ancestors}, '%');
+
+
+        update m_archive_tree
+        set
+            archive_auto_type = NULL
+        where
+            is_deleted = 0
+          and ancestors like concat('', #{tree.ancestors}, '%')
+            /*取消规则 只取消规则与自己一致的*/
+          and archive_auto_type = #{tree.archiveAutoType} ;
+    </update>
+
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_3">
+        update m_archive_tree
+        set
+            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
+            archive_auto_type = 1
+        where
+            is_deleted = 0
+          and ancestors like concat('', #{tree.ancestors}, '%')
+            /*取消规则 只取消规则与自己一致的*/
+          and archive_auto_type = #{tree.archiveAutoType}
+    </update>
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_2">
+        /*取消单个节点的分类并卷规则*/
+        update m_archive_tree
+        set
+            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
+            archive_auto_type = 1 ,
+            archive_auto_group_id = NULL,
+            archive_auto_group_select =NULL
+        where
+            is_deleted = 0
+          and ancestors like concat('', #{tree.ancestors}, '%')
+            /*取消规则 只取消规则与自己一致的*/
+          and archive_auto_type = #{tree.archiveAutoType}
+    </update>
+
+    <update id="removeNodeForArchiveAutoRule_Group">
+        /**取消同一组的分类并卷规则*/
+        update m_archive_tree
+        set
+            archive_auto_type = 1 ,
+            archive_auto_group_id = NULL,
+            archive_auto_group_select =NULL
+        where
+            is_deleted = 0
+          and archive_auto_group_id = #{archiveAutoGroupId}
+    </update>
+
+    <select id="getAllSonNodeforGroupView" resultMap="getAllSonNodeforGroupViewResultMap">
+        SELECT
+            id,
+            parent_id,
+            node_name,
+            archive_auto_type,
+            archive_auto_node_id,
+            archive_auto_group_id,
+            archive_auto_group_select
+        FROM m_archive_tree
+        where is_deleted = 0
+          and ancestors like concat('', #{ancestors}, '%')
+          and archive_auto_type !=3
+          and id not in (
+                select id from m_archive_tree where archive_auto_type=2 and archive_auto_group_id != #{groupId}
+            )
+        order by ancestors asc,sort asc
+    </select>
+
 </mapper>

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/FormulaOptionMapper.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.manager.entity.FormulaOption;
+
+/**
+ * @author yangyj
+ */
+public interface FormulaOptionMapper extends BaseMapper<FormulaOption> {
+}

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

@@ -461,6 +461,7 @@
                wt.sort,
                wt.status,
                wt.fill_rate AS "fillRate",
+               wt.html_url AS htmlUrl,
                (SELECT count(1) FROM m_wbs_form_element WHERE f_id = wt.init_table_id and is_deleted=0) AS "elementTotal"
         FROM m_wbs_tree_private AS wt
         WHERE wt.type = 2

+ 0 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -22,7 +22,6 @@ import org.springblade.manager.dto.ArchiveTreeContractDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -68,21 +67,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
 
-	/**
-	 *项目级立卷规则新增
-	 * @return
-	 */
-	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds);
-
-
 
-	Map<String,Object> getArchiveAutoRule(Long id);
-
-	/**
-	 *项目级立卷规则更新
-	 * @return
-	 */
-	boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto);
 
 	List<ArchiveTreeContract> selectByParentIdOrId(String id);
 

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

@@ -1,5 +1,6 @@
 package org.springblade.manager.service;
 
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
 import org.springblade.manager.entity.ArchiveTree;
@@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.vo.ArchiveTreeVO2;
 
 import java.util.List;
+import java.util.Map;
 
 public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 
@@ -20,7 +22,7 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 //	List<ArchiveTreeVO> tree(String tenantI, Integer disPlayTree, Integer nodeType);
 
 	List<ArchiveTreeVO2> lazyTree2(String tenantId, Long projectId, Long parentId, Long extId,Long level);
-	List<ArchiveTreeVO2> tree2(String tenantI, Long projectId, Integer disPlayTree, Integer nodeType,String wbsId);
+	List<ArchiveTreeVO2> tree2(String tenantI, Long projectId, Integer disPlayTree, Integer nodeType,String wbsId,boolean bgetExtNodes);
 
 	List<ArchiveTree> selectByParentIdOrId(String id);
 
@@ -31,10 +33,24 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 	boolean submitArchiveTreeSort(List<ArchiveTreeSortDTO> listSort);
 
 	List<ArchiveTree> treeList(String tenantId,Long projectId, Integer disPlayTree,Integer nodeType);
-	
 
 
-	boolean saveAechiveAutoRule(Integer archiveAutoType,String nodeIds);
-
 	boolean initArchiveProjectTree(Long projectId);
+
+
+	/**
+	 *项目级立卷规则新增
+	 * @return
+	 */
+	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds);
+
+
+
+	Map<String,Object> getArchiveAutoRule(Long id);
+
+	/**
+	 *项目级立卷规则更新
+	 * @return
+	 */
+	boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto);
 }

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

@@ -134,7 +134,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 多PDF 合并 - 试验
      */
-    String getBussPDFSTrial(String nodeId, Integer tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception;
+    String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception;
 
 
     /**

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

@@ -0,0 +1,14 @@
+package org.springblade.manager.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.manager.dto.FormulaOptionVo;
+import org.springblade.manager.entity.FormulaOption;
+
+/**
+ * @author yangyj
+ */
+public interface IFormulaOptionService extends IService<FormulaOption> {
+    String queryOption(Long contractId,Long parentId,Long pkeyId,String key);
+    void saveOrUpdateOption(FormulaOptionVo fo);
+
+}

+ 97 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -264,29 +264,117 @@ public class ArTreeContractInitServiceImpl {
         }
     }
 
+    /**
+     *
+     * @param tenantId
+     * @param projectId
+     * @param wbsId
+     * @param tree
+     * @return
+     */
+    public List<ArchiveTreeContract> getContractProcExtNodes(String tenantId, Long projectId,Long wbsId, ArchiveTreeContractVO2 tree) {
+
+        List<ArchiveTreeContract> addNodes = new ArrayList<>();
+        List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+        ForestNodeMerger.getTreeList(tree,archiveTreeContractVO2s);
+
+        for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+            //关联质检资料
+            if (ar.getAssociationType()!= null
+                    &&  ar.getAssociationType() == 1
+                    && ar.getDisplayHierarchy() != null ) {
+                List<ArchiveTreeContract> tmpList  = getTreeContractFromWbs(tenantId,projectId,wbsId,ar);
+                addNodes.addAll(tmpList);
+            }
+        }
+        return addNodes;
+    }
 
 
 
 
-
-    public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, Long contractId,Long level,ArchiveTreeContractVO2 subTree){
+    public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, ArchiveTreeContractVO2 subTree){
         List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
 
+        Long contractId = subTree.getContractId();
+        Long level = Long.parseLong(subTree.getDisplayHierarchy());
+
         //1. 获取子树链表
         List<ArchiveTreeContractVO2> treeContractVO2s = new ArrayList<>();
         ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
 
         //2. 获取对应合同的树
-        List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());
-        Iterator<WbsTreeContractVO6> iterator = wbsTreeContractVO6s.iterator();
-        while (iterator.hasNext()) {
-            WbsTreeContractVO6 treeContractVO6 = iterator.next();
-            if (treeContractVO6.getNodeType() > level) {
-                iterator.remove();
+        List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),subTree.toString(),contractId.toString());
+
+        List<WbsTreeContractVO6> addWbsNodes = new ArrayList<>();
+
+        //获取已经存在的
+        Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
+        Map<Long,Long> oldNewMap = new LinkedHashMap<>();
+        for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
+            if (ar.getExtId() !=null ) {
+                extMap.put(ar.getExtId(),ar);
+                oldNewMap.put(ar.getExtId(),ar.getId());
             }
         }
 
-         return archiveTreeContracts;
+        for (WbsTreeContractVO6 wbsTreeVO2:wbsTreeContractVO6s) {
+            //不要中间交工,质量评定和开工报告作为目录节点
+            if (wbsTreeVO2.getMajorDataType() != null ) {
+                if (wbsTreeVO2.getMajorDataType() == 1
+                        || wbsTreeVO2.getMajorDataType() == 2
+                        || wbsTreeVO2.getMajorDataType() == 3){
+                    continue;
+                }
+            }
+            //只展示指定层级之上的
+            if (wbsTreeVO2.getNodeType() > level){
+                continue;
+            }
+
+            //排除已经有的
+            if (extMap.get(wbsTreeVO2.getId())!= null) {
+                continue;
+            }
+
+            addWbsNodes.add(wbsTreeVO2);
+        }
+
+        for (WbsTreeContractVO6 wbsTreeVO2:addWbsNodes) {
+            oldNewMap.put(wbsTreeVO2.getId(),SnowFlakeUtil.getId());
+        }
+
+        //遍历构建
+        for (WbsTreeContractVO6 wbsTreeVO2:addWbsNodes) {
+            //只展示指定层级之上的
+            ArchiveTreeContract archiveTree = new ArchiveTreeContract();
+            archiveTree.setTenantId(tenantId);
+            archiveTree.setProjectId(projectId);
+            archiveTree.setContractId(contractId);
+            archiveTree.setId(oldNewMap.get(wbsTreeVO2.getId()));
+            if (wbsTreeVO2.getParentId() == 0) {
+                wbsTreeVO2.setParentId(subTree.getId());
+            }else {
+                archiveTree.setParentId(oldNewMap.get(wbsTreeVO2.getParentId()));
+            }
+
+            archiveTree.setNodeName(wbsTreeVO2.getTitle());
+
+            //设置关联
+            archiveTree.setExtType(1);
+            archiveTree.setExtId(wbsTreeVO2.getId());
+            archiveTree.setExtAttachId(subTree.getId());
+            archiveTree.setDisplayHierarchy(level.toString());
+            archiveTree.setIsDeleted(0);
+            //上传节点
+            if (wbsTreeVO2.getNodeType().longValue() ==  level) {
+                archiveTree.setIsStorageNode(1);
+            }
+            archiveTreeContracts.add(archiveTree);
+
+        }
+
+        return archiveTreeContracts;
     }
 
 }

+ 14 - 189
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -17,9 +17,9 @@
 package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -81,7 +81,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	@Override
 	public boolean initTree2(String tenantId, Long projectId){
 
-		List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), projectId,null, null,null);
+		List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), projectId,null, null,null,false);
 		if (tree == null || tree.size() == 0) {
 			return false;
 		}
@@ -95,7 +95,18 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 		arTreeContractInitService.copyTree(tenantId,projectId,projectInfo.getProjectName(),tree.get(0),archiveTreeContracts,contractInfoVOS);
 
-	    //todo 同步质检资料动态节点,处理文件提名
+		//是否获取扩展的wbs节点
+
+		Long wbsId = null;
+		if (projectInfo!= null) {
+			Long lWbsId = projectInfo.getReferenceWbsTemplateId();
+			if (lWbsId != null) {
+				wbsId = projectInfo.getReferenceWbsTemplateId();
+			}
+		}
+
+
+		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
 
@@ -133,193 +144,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(),getAuthContractId()));
 	}
 
-	/**
-	 * 保存组卷规则设置
-	 * @param archiveAutoType
-	 * @param nodeIds
-	 * @return
-	 */
-	@Override
-	public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds) {
-		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
-		try{
-			//步骤1保存选择节点的立卷规则。
-			String[] ids = nodeIds.split(",");
-
-			Long archiveAutoGroupId=null;
-
-			//分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
-			if(archiveAutoType==2){
-				double ran=(Math.random()*100000000) + 1;
-				archiveAutoGroupId=Long.parseLong(System.currentTimeMillis()+""+ran);
-			}
-			for(String nodeId:ids){
-				long nodeIdLong = Long.parseLong(nodeId);
-				ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
-				archiveTreeContract.setArchiveAutoType(archiveAutoType);
-				if(archiveAutoType==1){
-					//最高并卷规则 选择节点的ID
-					archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);
-				}
-				if(archiveAutoType==2){
-					//分类并卷规则 提交都是一个分类类型
-					archiveTreeContract.setArchiveAutoGroupId(archiveAutoGroupId);
-					archiveTreeContract.setArchiveAutoGroupSelect(1);
-				}
-				baseMapper.updateById(archiveTreeContract);
-
-				//步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
-				baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
-			}
-
-			return true;
-
-		}catch (Exception e){
-			e.printStackTrace();
-			return false;
-		}
-	}
-
-
-	/**
-	 * 获取节点规则查看
-	 * @param id
-	 * @return
-	 */
-	@Override
-	public Map<String,Object> getArchiveAutoRule(Long id) {
-
-		Map<String,Object> map= new HashMap<>();
-
-		ArchiveTreeContract archiveTreeContract = baseMapper.selectById(id);
-		Integer archiveAutoType = archiveTreeContract.getArchiveAutoType();
-		if(archiveAutoType!=null){
-			if(archiveAutoType==1){
-				//最高并卷层级 默认规则的节点 显示最高并卷层级节点
-				Long archiveAutoNodeId = archiveTreeContract.getArchiveAutoNodeId();
-				ArchiveTreeContract archiveAutoNode = baseMapper.selectById(archiveAutoNodeId);
-				StringBuffer allName= new StringBuffer();
-				String ancestors = archiveAutoNode.getAncestors();
-				String[] ancestorssplit = ancestors.split(",");//全路径ID
-				for(String pId:ancestorssplit){
-					long pIdLong = Long.parseLong(pId);
-					ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
-					allName.append(pIdNode.getNodeName()+"/");
-				}
-				allName.append(archiveAutoNode.getNodeName());
-				ArchiveTreeContractAutoRuleVO vo= new ArchiveTreeContractAutoRuleVO();
-				vo.setAllName(allName.toString());
-				vo.setNodeId(archiveAutoNode.getId());
-				vo.setArchiveAutoType(archiveAutoType);
-				map.put("type",archiveAutoType);
-				map.put("data",vo);
-				return map;
-			}
-			if(archiveAutoType==2){
-				//分类并卷显示所在大类下树结构,过滤单独规则,其他分类并卷规则组节点 本节点分类组显示打钩
-				//找出当前节点大类
-				String ancestors = archiveTreeContract.getAncestors();
-				String[] ancestorssplit = ancestors.split(",");//全路径ID
-				String nodeAncestors = ancestorssplit[0]+","+ancestorssplit[1]; //大类的ancestors
-				//获取大类下所有节点,过滤单独规则,其他分类并卷规则组节点
-				List<ArchiveTreeContractAutoRuleVO> nodetree = ForestNodeMerger.merge(baseMapper.getAllSonNodeforGroupView(nodeAncestors, archiveTreeContract.getArchiveAutoNodeId()));
-				//获取与当前节点同一分类的节点
-				List<ArchiveTreeContract> listGroup= baseMapper.selectList(Wrappers.<ArchiveTreeContract>lambdaQuery()
-						.eq(ArchiveTreeContract::getArchiveAutoGroupId, archiveTreeContract.getArchiveAutoGroupId())
-						.orderByAsc(ArchiveTreeContract::getSort));
-				StringBuffer nodeSelect = new StringBuffer();
-
-				for(ArchiveTreeContract node:listGroup){
-					nodeSelect.append(node.getId()+",");
-				}
-				map.put("type",archiveAutoType);
-				map.put("tree",nodetree);
-				map.put("data",nodeSelect.toString());
-				return map;
-			}
-			if(archiveAutoType==3){
-				//单独组卷规则 显示当前节点
-				StringBuffer allName= new StringBuffer();
-				String ancestors = archiveTreeContract.getAncestors();
-				String[] ancestorssplit = ancestors.split(",");//全路径ID
-				for(String pId:ancestorssplit){
-					long pIdLong = Long.parseLong(pId);
-					ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
-					allName.append(pIdNode.getNodeName()+"/");
-				}
-				allName.append(archiveTreeContract.getNodeName());
-				ArchiveTreeContractAutoRuleVO vo= new ArchiveTreeContractAutoRuleVO();
-				vo.setAllName(allName.toString());
-				vo.setNodeId(archiveTreeContract.getId());
-				vo.setArchiveAutoType(archiveAutoType);
-				map.put("type",archiveAutoType);
-				map.put("data",vo);
-				return map;
-			}
-		}
-		return map;
-	}
-
 
-	public void removeArchiveAutoRule(Long nodeId){
-		ArchiveTreeContract node = baseMapper.selectById(nodeId);
-		Integer archiveAutoType = node.getArchiveAutoType();
-		if(archiveAutoType!=null){
-			//删除默认规则
-			if(archiveAutoType==1){
-				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_1(node);
-			}
-			//删除节点及所有子节点 分类并卷规则
-			if(archiveAutoType==2){
-				//删除规则
-				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_2(node);
-				//TODO 验证节点的父节点是否为分类并卷规则,如是则取消。若无其他兄弟节点,继续往上验证。
-			}
-			//删除节点及所有子节点 单独并卷规则
-			if(archiveAutoType==3){
-				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node);
-			}
-		}
-
-	}
-
-
-	@Override
-	public boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
-		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
-
-		Integer archiveAutoType = dto.getArchiveAutoType();
-		if(archiveAutoType!=null){
-			if(archiveAutoType==2){
-				Long groupId = dto.getArchiveAutoGroupId();
-				String selectNodeIds = dto.getSelectNodeIds();
-				List<String> selectNodeIdlist = Arrays.asList(selectNodeIds);
-				//先将同一分类的节点删除配置,。
-				baseMapper.removeNodeForArchiveAutoRule_Group(groupId);
-				//然后再按照选择节点保存新的设置
-				for(String nodeId:selectNodeIdlist){
-					long nodeIdLong = Long.parseLong(nodeId);
-					ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
-					archiveTreeContract.setArchiveAutoType(archiveAutoType);
-					//分类并卷规则 提交都是一个分类类型
-					archiveTreeContract.setArchiveAutoGroupId(groupId);
-					archiveTreeContract.setArchiveAutoGroupSelect(1);
-					baseMapper.updateById(archiveTreeContract);
-					//保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
-					baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
-				}
-			}
-			if(archiveAutoType==1){
-
-			}
-			if(archiveAutoType==3){
-
-			}
-
-		}
-
-		return false;
-	}
 
 	@Override
 	public List<ArchiveTreeContract> selectByParentIdOrId(String id) {

+ 193 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -11,6 +11,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.constant.BladeConstant;
 
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
 import org.springblade.manager.entity.ArchiveTree;
@@ -21,13 +22,10 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.utils.ForestNodeMerger;
-import org.springblade.manager.vo.ArchiveTreeContractVO2;
-import org.springblade.manager.vo.ArchiveTreeVO;
+import org.springblade.manager.vo.*;
 import org.springblade.manager.mapper.ArchiveTreeMapper;
 import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springblade.manager.vo.ArchiveTreeVO2;
-import org.springblade.manager.vo.WbsTreeVO2;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -131,6 +129,8 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             archiveTrees.add(archiveTree);
         }
 
+        //todo 同步立卷规则
+
         this.saveBatch(archiveTrees);
 
         return true;
@@ -147,7 +147,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             throw new ServiceException("根节点已存在,请先删除后再进行初始化");
         }
 
-        List<ArchiveTreeVO2> sysTrees = this.tree2(AuthUtil.getTenantId(), projectId,null, null,null);
+        List<ArchiveTreeVO2> sysTrees = this.tree2(AuthUtil.getTenantId(), projectId,null, null,null,false);
         if (sysTrees == null || sysTrees.size() == 0) {
             return false;
         }
@@ -230,12 +230,12 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 //    }
 
     @Override
-    public List<ArchiveTreeVO2> tree2(String tenantId,Long projectId, Integer disPlayTree, Integer nodeType,String wbsId) {
+    public List<ArchiveTreeVO2> tree2(String tenantId,Long projectId, Integer disPlayTree, Integer nodeType,String wbsId,boolean bgetExtNodes) {
         List<ArchiveTreeVO2> archiveTreeVOList = baseMapper.tree2(tenantId, projectId,disPlayTree, nodeType);
         List<ArchiveTreeVO2> treeVO2s = ForestNodeMerger.merge(archiveTreeVOList);
         //todo 遍历树,找到质检节点,调用getWbsArchiveTree,根据关联层级,拼接上去
-        //待传入wbsId,把child 加入ar的childred
-        if (StringUtils.isEmpty(wbsId) && projectId != 0) {
+        //是否获取扩展的wbs节点
+        if (StringUtils.isEmpty(wbsId) && projectId != 0 && bgetExtNodes) {
             ProjectInfo projectInfo = projectInfoService.getOne(projectId);
             if (projectInfo!= null) {
                 Long lWbsId = projectInfo.getReferenceWbsTemplateId();
@@ -426,18 +426,192 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
 
 
+    /**
+     * 保存组卷规则设置
+     * @param archiveAutoType
+     * @param nodeIds
+     * @return
+     */
     @Override
-    public boolean saveAechiveAutoRule(Integer archiveAutoType, String nodeIds) {
-        //步骤1:判断选择节点是否为wbs节点。
-        //步骤2:归档树原始节点,
-            //2.1保存选择节点的立卷规则。
-                //2.1.1 最高并卷规则的需要将选择节点的ID赋值archiveAutoNodeId
-                //2.1.2 分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
-            //2.2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
-        //步骤3:归档树关联wbs节点
-            //TODO 关联wbs节点的立卷规则保存,涉及到能否正确同步出来。再议
-            //3.1保存选择节点的立卷规则。
-            //3.2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+    public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds) {
+        //项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+        try{
+            //步骤1保存选择节点的立卷规则。
+            String[] ids = nodeIds.split(",");
+
+            Long archiveAutoGroupId=null;
+
+            //分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
+            if(archiveAutoType==2){
+                double ran=(Math.random()*100000000) + 1;
+                archiveAutoGroupId=Long.parseLong(System.currentTimeMillis()+""+ran);
+            }
+            for(String nodeId:ids){
+                long nodeIdLong = Long.parseLong(nodeId);
+                ArchiveTree archiveTree = baseMapper.selectById(nodeIdLong);
+                archiveTree.setArchiveAutoType(archiveAutoType);
+                if(archiveAutoType==1){
+                    //最高并卷规则 选择节点的ID
+                    archiveTree.setArchiveAutoNodeId(nodeIdLong);
+                }
+                if(archiveAutoType==2){
+                    //分类并卷规则 提交都是一个分类类型
+                    archiveTree.setArchiveAutoGroupId(archiveAutoGroupId);
+                    archiveTree.setArchiveAutoGroupSelect(1);
+                }
+                baseMapper.updateById(archiveTree);
+
+                //步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+                baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTree);
+            }
+
+            return true;
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 获取节点规则查看
+     * @param id
+     * @return
+     */
+    @Override
+    public Map<String,Object> getArchiveAutoRule(Long id) {
+
+        Map<String,Object> map= new HashMap<>();
+
+        ArchiveTree archiveTree = baseMapper.selectById(id);
+        Integer archiveAutoType = archiveTree.getArchiveAutoType();
+        if(archiveAutoType!=null){
+            if(archiveAutoType==1){
+                //最高并卷层级 默认规则的节点 显示最高并卷层级节点
+                Long archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+                ArchiveTree archiveAutoNode = baseMapper.selectById(archiveAutoNodeId);
+                StringBuffer allName= new StringBuffer();
+                String ancestors = archiveAutoNode.getAncestors();
+                String[] ancestorssplit = ancestors.split(",");//全路径ID
+                for(String pId:ancestorssplit){
+                    long pIdLong = Long.parseLong(pId);
+                    ArchiveTree pIdNode = baseMapper.selectById(pIdLong);
+                    allName.append(pIdNode.getNodeName()+"/");
+                }
+                allName.append(archiveAutoNode.getNodeName());
+                ArchiveTreeAutoRuleVO vo= new ArchiveTreeAutoRuleVO();
+                vo.setAllName(allName.toString());
+                vo.setNodeId(archiveAutoNode.getId());
+                vo.setArchiveAutoType(archiveAutoType);
+                map.put("type",archiveAutoType);
+                map.put("data",vo);
+                return map;
+            }
+            if(archiveAutoType==2){
+                //分类并卷显示所在大类下树结构,过滤单独规则,其他分类并卷规则组节点 本节点分类组显示打钩
+                //找出当前节点大类
+                String ancestors = archiveTree.getAncestors();
+                String[] ancestorssplit = ancestors.split(",");//全路径ID
+                String nodeAncestors = ancestorssplit[0]+","+ancestorssplit[1]; //大类的ancestors
+                //获取大类下所有节点,过滤单独规则,其他分类并卷规则组节点
+                List<ArchiveTreeAutoRuleVO> nodetree = ForestNodeMerger.merge(baseMapper.getAllSonNodeforGroupView(nodeAncestors, archiveTree.getArchiveAutoNodeId()));
+                //获取与当前节点同一分类的节点
+                List<ArchiveTree> listGroup= baseMapper.selectList(Wrappers.<ArchiveTree>lambdaQuery()
+                        .eq(ArchiveTree::getArchiveAutoGroupId, archiveTree.getArchiveAutoGroupId())
+                        .orderByAsc(ArchiveTree::getSort));
+                StringBuffer nodeSelect = new StringBuffer();
+
+                for(ArchiveTree node:listGroup){
+                    nodeSelect.append(node.getId()+",");
+                }
+                map.put("type",archiveAutoType);
+                map.put("tree",nodetree);
+                map.put("data",nodeSelect.toString());
+                return map;
+            }
+            if(archiveAutoType==3){
+                //单独组卷规则 显示当前节点
+                StringBuffer allName= new StringBuffer();
+                String ancestors = archiveTree.getAncestors();
+                String[] ancestorssplit = ancestors.split(",");//全路径ID
+                for(String pId:ancestorssplit){
+                    long pIdLong = Long.parseLong(pId);
+                    ArchiveTree pIdNode = baseMapper.selectById(pIdLong);
+                    allName.append(pIdNode.getNodeName()+"/");
+                }
+                allName.append(archiveTree.getNodeName());
+                ArchiveTreeAutoRuleVO vo= new ArchiveTreeAutoRuleVO();
+                vo.setAllName(allName.toString());
+                vo.setNodeId(archiveTree.getId());
+                vo.setArchiveAutoType(archiveAutoType);
+                map.put("type",archiveAutoType);
+                map.put("data",vo);
+                return map;
+            }
+        }
+        return map;
+    }
+
+
+    public void removeArchiveAutoRule(Long nodeId){
+        ArchiveTree node = baseMapper.selectById(nodeId);
+        Integer archiveAutoType = node.getArchiveAutoType();
+        if(archiveAutoType!=null){
+            //删除默认规则
+            if(archiveAutoType==1){
+                baseMapper.removeAllSonNodeIdsForArchiveAutoRule_1(node);
+            }
+            //删除节点及所有子节点 分类并卷规则
+            if(archiveAutoType==2){
+                //删除规则
+                baseMapper.removeAllSonNodeIdsForArchiveAutoRule_2(node);
+                //TODO 验证节点的父节点是否为分类并卷规则,如是则取消。若无其他兄弟节点,继续往上验证。
+            }
+            //删除节点及所有子节点 单独并卷规则
+            if(archiveAutoType==3){
+                baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node);
+            }
+        }
+
+    }
+
+
+    @Override
+    public boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
+        //项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+
+        Integer archiveAutoType = dto.getArchiveAutoType();
+        if(archiveAutoType!=null){
+            if(archiveAutoType==2){
+                Long groupId = dto.getArchiveAutoGroupId();
+                String selectNodeIds = dto.getSelectNodeIds();
+                List<String> selectNodeIdlist = Arrays.asList(selectNodeIds);
+                //先将同一分类的节点删除配置,。
+                baseMapper.removeNodeForArchiveAutoRule_Group(groupId);
+                //然后再按照选择节点保存新的设置
+                for(String nodeId:selectNodeIdlist){
+                    long nodeIdLong = Long.parseLong(nodeId);
+                    ArchiveTree archiveTree = baseMapper.selectById(nodeIdLong);
+                    archiveTree.setArchiveAutoType(archiveAutoType);
+                    //分类并卷规则 提交都是一个分类类型
+                    archiveTree.setArchiveAutoGroupId(groupId);
+                    archiveTree.setArchiveAutoGroupSelect(1);
+                    baseMapper.updateById(archiveTree);
+                    //保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+                    baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTree);
+                }
+            }
+            if(archiveAutoType==1){
+
+            }
+            if(archiveAutoType==3){
+
+            }
+
+        }
+
         return false;
     }
+
 }

+ 3 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1547,7 +1547,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
                 Elements cols = table.select("col");
-
                 if (ObjectUtil.isNotEmpty(DataInfo)) {
                     for (String val : DataInfo.keySet()) {
                         if (val.contains("__")) {
@@ -1559,7 +1558,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                             if (data.html().contains("x1") && data.html().contains("y1")) {
                                 int x1 = 0;
                                 int y1 = 0;
-
                                 if (data.html().contains("el-tooltip")) {
                                     x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
                                     y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
@@ -1591,11 +1589,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                         myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
                                     }
                                 }
-                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
                                 if (myData.contains("https") && myData.contains("aliyuncs")) {
-
                                     BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-
                                     int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
                                     int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
                                     int picHeight = 0;
@@ -1635,23 +1630,17 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
                                     pic.setAutoSize(true);
                                     pic.setWidth(picWidth - 10);
-
-                                    //System.out.println(sheet.get(y1, x1).getRowHeight());
-                                    //System.out.println(sheet.get(y1, x1).getRows());
                                     pic.setHeight(picHeight);
                                     pic.setLeft(5);
                                 } else {
                                     CellRange cellRange = sheet.getCellRange(y1, x1);
                                     cellRange.getCellStyle().getExcelFont().setFontName("EUDC");
                                     cellRange.setText(myData);
-                                    //System.out.println(cellRange.getStyle().getFont().getFontName());
-                                    //System.out.println("后" + cellRange.getText());
                                 }
                             }
                         }
                     }
                 }
-
                 // 组装电签设置
                 QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                 queryWrapper.eq("type", 2);
@@ -1681,11 +1670,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         wb.saveToFile(excelPath, ExcelVersion.Version2010);
         FileUtils.excelToPdf(excelPath, pdfPath);
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
-        TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda()
-                .eq(TableFile::getTabId, pkeyId + "")
-                .eq(TableFile::getType, 1)
-                .eq(TableFile::getTrialRecordId, id));
-
+        TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1).eq(TableFile::getTrialRecordId, id));
         if (tableFile1 != null) {
             tableFile1.setDomainPdfUrl(bladeFile.getLink());
             tableFileService.saveOrUpdate(tableFile1);
@@ -1699,22 +1684,15 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             tableFile.setIsDeleted(0);
             tableFile.setExtension(fileExtension);
             tableFile.setDomainPdfUrl(bladeFile.getLink());
-
             tableFile.setTrialRecordId(id);
-
             tableFileService.saveOrUpdate(tableFile);
         }
 
         //获取当前试验记录的中的元素表的附件文件
-        List<TableFile> tableFileList = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda()
-                .eq(TableFile::getTabId, pkeyId + "")
-                .eq(TableFile::getTrialRecordId, id)
-        );
+        List<TableFile> tableFileList = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getTrialRecordId, id));
 
         if (tableFileList.size() > 0) {
-
             tableFileList.sort(Comparator.comparing(TableFile::getType));
-
             List<String> dataListPdf = tableFileList.stream().filter(tableFile ->
                     tableFile.getDomainPdfUrl() != null
                             && (tableFile.getType() == 1 || tableFile.getType() == 2)
@@ -1755,7 +1733,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      * 试验 多pdf
      */
     @Override
-    public String getBussPDFSTrial(String nodeId, Integer tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception {
+    public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         //获取有权限的节点信息
         String sql = "select * from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ")";

+ 73 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java

@@ -0,0 +1,73 @@
+package org.springblade.manager.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mixsmart.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.manager.dto.FormulaOptionVo;
+import org.springblade.manager.entity.FormulaOption;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.mapper.FormulaOptionMapper;
+import org.springblade.manager.service.IFormulaOptionService;
+import org.springblade.manager.service.IWbsTreeContractService;
+import org.springframework.stereotype.Service;
+
+
+
+/**
+ * @author yangyj
+ * @Date 2023/3/6 9:37
+ * @description TODO
+ */
+@Service
+@RequiredArgsConstructor
+public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, FormulaOption> implements IFormulaOptionService {
+    private final IWbsTreeContractService wbsTreeContractService;
+
+    @Override
+    public String queryOption(Long contractId, Long parentId,Long pkeyId, String key) {
+        if(StringUtils.isNotEmpty(contractId,parentId,pkeyId,key)){
+            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+            FormulaOption fo = this.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,parentId).eq(FormulaOption::getContractId,contractId));
+            if(fo!=null&&wbc!=null){
+                JSONObject jo = JSON.parseObject(fo.getVal());
+                 if(jo.containsKey(pkeyId.toString())){
+                     JSONObject tableJson=jo.getJSONObject(wbc.getInitTableName());
+                     if(tableJson.containsKey(pkeyId.toString())){
+                         JSONObject excel = tableJson.getJSONObject(pkeyId.toString());
+                         if(excel.containsKey(key)){
+                             return excel.getString(key);
+                         }
+                     }
+
+                 }
+
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void saveOrUpdateOption(FormulaOptionVo fo) {
+        if(fo.saveChecked()){
+            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,fo.getPKeyId()));
+            FormulaOption formulaOption = this.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,fo.getParentId()).eq(FormulaOption::getContractId,fo.getContractId()));
+            if(formulaOption==null){
+                formulaOption=fo.toFo();
+                JSONObject jo = new JSONObject();
+                JSONObject table = (JSONObject) jo.computeIfAbsent(wbc.getInitTableName(),(k)->new JSONObject());
+                if(fo.isElementScope()){
+                    table.put(fo.getKey(),fo.getValue());
+                }else if(fo.isCellScope()){
+                    table.put(fo.getPKeyId()+ StringPool.AT +fo.getPKeyId(),fo.getValue());
+                }
+                formulaOption.setVal(jo.toJSONString());
+                this.saveOrUpdate(formulaOption);
+            }
+        }
+
+    }
+}

+ 59 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -36,6 +36,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -132,7 +133,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*通过判断元素名称来确定,加入汇总公式延后执行*/
         this.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getFullName).collect(Collectors.toList()));
         /*检查是否有跨节点数据*/
+        /*获取type=1的检验单或者type=4的监表*/
+        List<Map<String,Object>>  inspectionElementMaps = new ArrayList<>();
+        Optional<AppWbsTreeContractVO> wop=tableList.stream().filter(e->e.getTableType()==1).findAny();
+        if(wop.isPresent()){
+            /*检验单或者监表的*/
+            inspectionElementMaps=  this.jdbcTemplate.queryForList("select c.e_name name ,c.init_table_name tableName,c.e_key ekey from m_wbs_tree_contract a INNER JOIN m_wbs_tree b on (a.id=b.id or a.old_id=b.id) INNER join m_wbs_form_element c on b.init_table_id=c.f_id where a.id=" + wop.get().getPKeyId());
+        }
         List<String> missingList = new ArrayList<>();
+        List<Map<String, Object>> finalInspectionElementMaps = inspectionElementMaps;
+        List<String> cki =new ArrayList<>();
+        AtomicReference<String> ckd= new AtomicReference<>("");
         this.formDataList.forEach(fd->{
             if(fd.executable()){
                 relyParse(fd.getFormula());
@@ -145,12 +156,60 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         }
                     });
                 }
+                if(StringUtils.isEquals("CKI",f.getNumber())){
+                    finalInspectionElementMaps.forEach(m->{
+                        String name = StringUtils.handleNull(m.get("name"));
+                        if(name.contains("实测值")&&name.contains("偏差值")){
+                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+                            if(this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
+                                cki.add(ekey);
+                                missingList.add(ekey);
+                            }
+                        }
+                    });
+                    f.setFormula("CKI");
+                }else  if(StringUtils.isEquals("CKD",f.getNumber())){
+                    finalInspectionElementMaps.forEach(m->{
+                        String name = StringUtils.handleNull(m.get("name"));
+                        if(name.contains("检验日期")){
+                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+                            if(!this.formDataMap.containsKey(ekey)&&this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
+                                ckd.set(ekey);
+                                missingList.add(ekey);
+                            }
+                        }
+                    });
+                    f.setFormula("CKD");
+                }
+
             }
         });
+
         missingFill(missingList);
         if(Func.isNotEmpty(missingList)){
             this.tec.getLog().append("无法识别的依赖:").append(missingList.stream().map(e->e.replaceAll("'","")).collect(Collectors.joining(",")));
         }
+        if(Func.isNotEmpty(cki)){
+           /*检验内容*/
+            StringBuilder sb = new StringBuilder();
+            for(String s:cki){
+                FormData fdTmp=this.formDataMap.get(s);
+                if(fdTmp!=null&&fdTmp.getValues().stream().anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isEquals("/",e))){
+                    sb.append(fdTmp.getEName().split("\\(.+\\)")[0]).append(",");
+                }
+            }
+            if(sb.length()>1){
+                this.constantMap.put(CHECK_ITEMS,sb.toString());
+            }
+        }
+        if(Func.isNotBlank(ckd.get())){
+            /*检验时间*/
+            FormData fdTmp =   this.formDataMap.get(ckd.get());
+            if(fdTmp!=null){
+                this.constantMap.put("CKD",fdTmp.getValues().stream().map(ElementData::stringValue).collect(Collectors.joining(",")));
+            }
+        }
+
         /*实测值参数*/
         List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId,b.col_name val ,CONCAT(a.init_table_name,':',b.col_key)code from m_wbs_tree_contract a inner join m_textdict_info b on a.p_key_id=b.tab_id   " +
                 "where a.p_key_id in("+this.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8 ");
@@ -378,12 +437,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         tmp = tmp.replace(am.group(),am.group(1)+"['"+am.group(2)+"']");
                     }
                 }
-                if(CHECK_ITEMS.equals(tmp)){
-                    /*获取type=1的检验单或者type=4的监表*/
-                    List<WbsTreeContract> tableList= (List<WbsTreeContract>) this.constantMap.get(TABLE_LIST);
-                    Optional<WbsTreeContract> wop=tableList.stream().filter(e->e.getTableType()==1||e.getTableType()==4).findAny();
-                    wop.ifPresent(wbsTreeContract -> this.jdbcTemplate.queryForList("select c.e_name name ,c.init_table_name tableName,c.e_key ekey from m_wbs_tree_contract a INNER JOIN m_wbs_tree b on (a.id=b.id or a.old_id=b.id) INNER join m_wbs_form_element c on b.init_table_id=c.f_id where a.id=" + wbsTreeContract.getPKeyId()));
-                }
                 fd.getFormula().setFormula(tmp);
                 this.formDataMap.put(fd.getCode(),fd);
             }
@@ -756,9 +809,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                              data.put(eNames.get(i),values.get(i));
                          }
                          f=f.replace(m.group(),putDataWithKey(data));
-                         if(f.contains("ENAME")){
-                             f=f.replace("ENAME",putDataWithKey(target.stream().map(FormData::getEName).collect(Collectors.toList())));
-                         }
                      }
                  }
                  if(f.contains(".option")){

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

@@ -323,6 +323,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 tableOwners = "1,2,3";
             } else if (tableOwner.equals("2")) {
                 tableOwners = "4,5,6";
+            }else {
+                tableOwners = "7,8,9";
             }
             tableOwnerList = Func.toStrList(tableOwners);
         }