Переглянути джерело

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
chenr 5 місяців тому
батько
коміт
1c45b17fa6
22 змінених файлів з 975 додано та 141 видалено
  1. 17 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordFileVO.java
  2. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  3. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  4. 44 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncTrialVO.java
  5. 17 11
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EntrustInfoController.java
  6. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.java
  7. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.xml
  8. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/IEntrustInfoService.java
  9. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/EntrustInfoServiceImpl.java
  10. 4 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  11. 36 23
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java
  12. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  13. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  14. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  15. 36 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  16. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  17. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  18. 274 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  19. 66 99
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  20. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  21. 213 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/CreateDashedLine.java
  22. 201 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/utils/CreateDashedLine.java

+ 17 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSelfInspectionRecordFileVO.java

@@ -1,8 +1,12 @@
 package org.springblade.business.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.util.Date;
 
 @Data
 public class TrialSelfInspectionRecordFileVO implements Serializable {
@@ -15,4 +19,17 @@ public class TrialSelfInspectionRecordFileVO implements Serializable {
 
     private Integer type;
 
+    private Long nodeId;
+
+    private String fileName;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -182,6 +182,9 @@ public class ArchiveTree extends BaseEntity {
     @ApiModelProperty(value = "日志资料类型,逗号拼接")
     private String contractLogType;
 
+    @ApiModelProperty(value = "试验资料类型(归档树)对应字典试验节点类型,数字逗号拼接")
+    private String contractTrialType;
+
     public ArchiveTree() {
     }
 

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

@@ -247,6 +247,9 @@ public class ArchiveTreeContract extends BaseEntity {
     @ApiModelProperty(value = "日志资料类型,逗号拼接")
     private String contractLogType;
 
+    @ApiModelProperty(value = "试验资料类型(归档树)对应字典试验节点类型,数字逗号拼接")
+    private String contractTrialType;
+
     public ArchiveTreeContract() {
     }
 
@@ -317,6 +320,7 @@ public class ArchiveTreeContract extends BaseEntity {
         this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
         this.isUploadFileDisplayConfigurationTree = archiveTree.getIsUploadFileDisplayConfigurationTree();
         this.contractLogType = archiveTree.getContractLogType();
+        this.contractTrialType = archiveTree.getContractTrialType();
     }
 
     public void sync(ArchiveTreeVO2 archiveTree) {

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

@@ -0,0 +1,44 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   档案同步质检试验VO
+ * @Author wangwl
+ * @Date 2024/9/12 16:02
+ **/
+@Data
+public class ArchiveSyncTrialVO {
+
+
+    @ApiModelProperty(value = "主键id")
+    private Long pKeyId;
+
+    @ApiModelProperty(value = "主键id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "父主键id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "节点全称")
+    private String fullName;
+
+    @ApiModelProperty(value = "节点类型,试验为51,52,53")
+    private Integer nodeType;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+}

+ 17 - 11
blade-service/blade-business/src/main/java/org/springblade/business/controller/EntrustInfoController.java

@@ -17,31 +17,28 @@
 package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.business.entity.TrialSampleInfo;
+import org.springblade.business.entity.EntrustInfo;
+import org.springblade.business.service.IEntrustInfoService;
 import org.springblade.business.vo.EntrustDataInfoVO;
+import org.springblade.business.vo.EntrustInfoVO;
 import org.springblade.business.vo.LoadDataInfoVO;
 import org.springblade.business.vo.TrialSampleDataInfoVO;
+import org.springblade.business.wrapper.EntrustInfoWrapper;
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.business.entity.EntrustInfo;
-import org.springblade.business.vo.EntrustInfoVO;
-import org.springblade.business.wrapper.EntrustInfoWrapper;
-import org.springblade.business.service.IEntrustInfoService;
-import org.springblade.core.boot.ctrl.BladeController;
 
+import javax.validation.Valid;
 import java.util.Date;
 
 /**
@@ -209,4 +206,13 @@ public class  EntrustInfoController extends BladeController {
 		LoadDataInfoVO pages = entrustInfoService.selectDataInfoById(id);
 		return R.data(pages);
 	}
+	/**
+	 * 生成委托单 校验该材料是否关联委托单
+	 */
+	@GetMapping("/checkSample")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "校验材料", notes = "传入材料id")
+	public R checkSample(Long sampleId){
+		return  entrustInfoService.checkSample(sampleId);
+	}
 }

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

@@ -53,4 +53,6 @@ public interface EntrustInfoMapper extends BaseMapper<EntrustInfo> {
 	LoadDataInfoVO selectDataInfoById(@Param("id") String id);
 
 	int delEntrustInfo(@Param("ids") List<Long> ids);
+
+	Integer selectCountBySampleId(Long sampleId);
 }

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

@@ -155,6 +155,9 @@
         select a.*,(SELECT dict_key from blade_dict_biz where id=(SELECT parent_id from blade_dict_biz where code='test_data_type' and dict_value=a.testTypeName)) as testTypePId
         from u_view_gather_data_info a  where a.id=#{id}
     </select>
+    <select id="selectCountBySampleId" resultType="java.lang.Integer">
+        select  count(*) from u_entrust_info where sample_id=#{sampleId} and is_deleted=0
+    </select>
 
 
     <delete id="delEntrustInfo" >

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

@@ -17,17 +17,15 @@
 package org.springblade.business.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.entity.EntrustInfo;
 import org.springblade.business.vo.EntrustDataInfoVO;
 import org.springblade.business.vo.EntrustInfoVO;
 import org.springblade.business.vo.LoadDataInfoVO;
 import org.springblade.business.vo.TrialSampleDataInfoVO;
 import org.springblade.core.mp.base.BaseService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 
-import java.util.List;
-
 /**
  * 委托单信息表 服务类
  *
@@ -70,4 +68,6 @@ public interface IEntrustInfoService extends BaseService<EntrustInfo> {
 
 	//委托单删除
 	R delEntrustInfo(String ids);
+	//检查材料是否关联委托单
+	R checkSample(Long sampleId);
 }

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

@@ -30,6 +30,7 @@ import org.springblade.business.vo.TrialSampleDataInfoVO;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.ExcelTabClient;
 import org.springblade.manager.feign.WbsTreePrivateClient;
@@ -52,6 +53,7 @@ public class EntrustInfoServiceImpl extends BaseServiceImpl<EntrustInfoMapper, E
 	private final ExcelTabClient excelTabClient;
 	private final JdbcTemplate jdbcTemplate;
 	private final WbsTreePrivateClient wbsTreePrivateClient;
+	private final EntrustInfoMapper entrustInfoMapper;
 
 	@Override
 	public IPage<EntrustInfoVO> selectEntrustInfoPage(IPage<EntrustInfoVO> page, EntrustInfoVO entrustInfo) {
@@ -165,4 +167,12 @@ public class EntrustInfoServiceImpl extends BaseServiceImpl<EntrustInfoMapper, E
 		return R.success("");
 	}
 
+	@Override
+	public R checkSample(Long sampleId) {
+		Integer count = entrustInfoMapper.selectCountBySampleId(sampleId);
+		if (ObjectUtil.isNotEmpty(count) && count > 0){
+			return R.fail("当前材料已被委托");
+		}
+		return R.success("操作成功");
+	}
 }

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

@@ -9,6 +9,8 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.TaskApprovalVO;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,11 +64,12 @@ public class EVisaController {
     @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
+
         log.info("扫描开始");
         //String sql = "SELECT * from u_task_batch where json_data like '%1821798868568768512%' and is_deleted<>5  LIMIT 10";
         String sql = "SELECT * from u_task_batch where is_deleted<>5 LIMIT 10";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
-        if (maps != null && maps.size() >= 1) {
+        if (maps != null && maps.size() >= 1 && SystemUtils.isLinux()) {
             for (Map<String, Object> dataInfo : maps) {
                 if (executor.getQueue().size()<=40 ) {
                     String jsonData = dataInfo.get("json_data") + "";

+ 36 - 23
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java

@@ -4,8 +4,11 @@ package org.springblade.land.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.extern.log4j.Log4j;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
@@ -44,6 +47,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 @AllArgsConstructor
 public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAgreementInfoMapper, ClearingAgreementInfo> implements IClearingAgreementInfoService {
@@ -156,7 +160,14 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         //----------------------生成通用值--------------------------//
         //周期格式
         String stage = info.getStage();
-        stage = stage.substring(1,stage.length()-1);
+        String regex = "第" + "(.*?)" + "期";
+        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regex);
+        java.util.regex.Matcher matcher = pattern.matcher(stage);
+        if (matcher.find()) {
+            stage = matcher.group(1);
+        }else {
+            stage = "未获取到期数信息,请在期数中包含[第XXX期]";
+        }
         //项目名称
         String projectName = jdbcTemplate.queryForObject("select project_name from m_project_info where id = " + info.getProjectId(), String.class);
         //当前时间
@@ -303,7 +314,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
                                 Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
                                 //取出84(地面)数据集合
                                 List<TableDataVO> voList2 = new ArrayList<>();
-                                if (allDataMap.get(84) != null){
+                                if (allDataMap.get(84) != null) {
                                     voList2 = allDataMap.get(84);
                                 }
                                 //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
@@ -369,27 +380,28 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
                             keys.addAll(voList3.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabKey()).collect(Collectors.toList()));
                             //判断数据长度是否超过单表总行数
                             List<List<Object>> lists = CommonUtils.splitList(values, oneTableRows);
-                            //多页分开存入
-                            for (int i = 0; i < tableTotal; i++) {
-                                Map<String, Object> DataInfo = dataInfos.get(tableIds.get(i));
-                                List<Object> data2 = lists.get(i);
-                                for (int j = 0; j < data2.size(); j++) {
-                                    DataInfo.put(keys.get(j), data2.get(j));
-                                }
-                                if (dict == 82) {
-                                    //土地
-                                    big2.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
-                                } else
-                                if (dict == 400) {
-                                    big3.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
-                                } else
-                                if (dict == 85) {
-                                    //时段
-                                    big4.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
-                                } else
-                                //如果是合计的就要添加进总合计
-                                if (dict == 86) {
-                                    big.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                            if (lists.size() != 0) {
+                                //多页分开存入
+                                for (int i = 0; i < tableTotal; i++) {
+                                    Map<String, Object> DataInfo = dataInfos.get(tableIds.get(i));
+                                    log.info(i + "----" + lists);
+                                    List<Object> data2 = lists.get(i);
+                                    for (int j = 0; j < data2.size(); j++) {
+                                        DataInfo.put(keys.get(j), data2.get(j));
+                                    }
+                                    if (dict == 82) {
+                                        //土地
+                                        big2.put(tableIds.get(i), data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                    } else if (dict == 400) {
+                                        big3.put(tableIds.get(i), data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                    } else if (dict == 85) {
+                                        //时段
+                                        big4.put(tableIds.get(i), data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                    } else
+                                        //如果是合计的就要添加进总合计
+                                        if (dict == 86) {
+                                            big.put(tableIds.get(i), data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                        }
                                 }
                             }
                         }
@@ -467,6 +479,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
                     }
                 }
             }catch (Exception e){
+                e.printStackTrace();
                 throw new ServiceException("生成:"+linkTable.getTableName()+"失败");
             }
         }

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

@@ -782,4 +782,17 @@ public class WbsTreeContractController extends BladeController {
         }
     }
 
+    /**
+     * 更新项目下所有的表单中连续日期格式为数组
+     * @return
+     */
+    @GetMapping("/resetTableDate")
+    @ApiOperationSupport(order = 42)
+    @ApiOperation(value = "表单排序", notes = "传入ids")
+    public R resetTableDate(Long projectId) {
+        //生成PDF失败不影响排序
+        wbsTreeContractServiceImpl.resetTableDate(projectId);
+        return R.success("成功");
+    }
+
 }

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

@@ -107,7 +107,8 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
             return this.wbsTreeContractService.list(wrapper);
         } else {
             //.eq(WbsTreeContract::getType, "1")
-            return this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, treeNode.getId()).eq(WbsTreeContract::getContractId, treeNode.getContractId()).eq(WbsTreeContract::getStatus, 1).orderByAsc(WbsTreeContract::getSort).orderByAsc(WbsTreeContract::getFullName));
+            return this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, treeNode.getId()).eq(WbsTreeContract::getType,1)
+                    .eq(WbsTreeContract::getContractId, treeNode.getContractId()).eq(WbsTreeContract::getStatus, 1).orderByAsc(WbsTreeContract::getSort).orderByAsc(WbsTreeContract::getFullName));
         }
     }
 

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

@@ -23,8 +23,12 @@ import org.springblade.archive.dto.JiLinQueryDto;
 import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.entity.TrialDetectionData;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.vo.TrialSelfInspectionRecordFileVO;
 import org.springblade.manager.dto.ArchiveTreeContractDTO;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.TrialClassificationConfiguration;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -161,4 +165,13 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
     List<DictBiz> getLogDict();
 
+    List<ArchiveSyncTrialVO> getAllTrialNode(@Param("projectId") Long projectId);
+
+    List<TrialSelfInspectionRecord> getAllTrialRecord(@Param("contractId") Long contractId);
+
+    List<TrialSelfInspectionRecordFileVO> getAllTrialRecordFile(@Param("ids") List<Long> recordIds);
+
+    List<TrialClassificationConfiguration> getAllThreeTestNode();
+
+    List<TrialDetectionData> getAllTrialTestRecord(@Param("contractId") Long contractId);
 }

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

@@ -768,4 +768,40 @@
     <select id="getLogDict" resultType="org.springblade.system.entity.DictBiz">
         select * from blade_dict_biz where parent_id != 0 and code = 'contract_log_type' and is_deleted = 0
     </select>
+    <select id="getAllTrialNode" resultType="org.springblade.manager.vo.ArchiveSyncTrialVO">
+        select p_key_id,id,parent_id,node_name,full_name,node_type,sort
+        from m_wbs_tree_private
+        where wbs_type = 2 and project_id = #{projectId} and `type` = 1 and is_deleted = 0
+          and node_type in (51,52,53)
+        order by sort
+    </select>
+    <select id="getAllTrialRecord" resultType="org.springblade.business.entity.TrialSelfInspectionRecord">
+        select *
+        from u_trial_self_inspection_record
+        where contract_id = #{contractId} and is_deleted = 0 and task_status = '已审批'
+    </select>
+    <select id="getAllTrialRecordFile"
+            resultType="org.springblade.business.vo.TrialSelfInspectionRecordFileVO">
+        select id,self_id,url,type,
+               (select node_id from u_trial_self_inspection_record sir where sir.id = sirf.self_id) as nodeId
+        from u_trial_self_inspection_record_file sirf
+        where self_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getAllThreeTestNode"
+            resultType="org.springblade.manager.entity.TrialClassificationConfiguration">
+        select *
+        from m_trial_classification_configuration
+        where is_deleted = 0 and parent_id in
+            (
+                select id from m_trial_classification_configuration where is_deleted = 0 and parent_id = 0 and node_type in (1,2)
+                )
+    </select>
+    <select id="getAllTrialTestRecord" resultType="org.springblade.business.entity.TrialDetectionData">
+        select *
+        from m_trial_detection_data
+        where contract_id = #{contractId} and is_deleted = 0
+    </select>
 </mapper>

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

@@ -114,4 +114,8 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
     List<APIWbsContractNodeHzrcVo> apiTreeNodeHzrc(@Param("contractId") String contractId,@Param("classType") Integer classType);
 
     List<ArchiveSyncWbsVO> getContractAllNode(@Param("contractId") Long contractId);
+
+    List<WbsTreeContract> projectAllTable(@Param("projectId") Long projectId);
+
+    void batchUpdateTable(@Param("list") List<String> list);
 }

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -761,6 +761,11 @@
             where p_key_id = #{key}
         </foreach>
     </update>
+    <update id="batchUpdateTable">
+        <foreach item="item" collection="list" separator=";">
+            ${item}
+        </foreach>
+    </update>
 
     <select id="selectQueryValueLikeNodeName" resultMap="ResultMap">
         select *
@@ -868,4 +873,8 @@
         from m_wbs_tree_contract where contract_id = #{contractId} and type = 1 and is_deleted = 0
         ORDER BY sort,create_time
     </select>
+    <select id="projectAllTable" resultType="org.springblade.manager.entity.WbsTreeContract">
+        select p_key_id,init_table_name
+        from m_wbs_tree_contract where project_id = #{projectId} and type = 2 and is_deleted = 0
+    </select>
 </mapper>

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

@@ -10,10 +10,13 @@ import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.dto.ImageClassificationFileDTO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.entity.TrialDetectionData;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.ImageClassificationFileClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.vo.TreeVoTwo;
+import org.springblade.business.vo.TrialSelfInspectionRecordFileVO;
 import org.springblade.common.utils.ForestNodeMergerEx;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -28,10 +31,14 @@ import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.ForestNodeMerger;
 import org.springblade.manager.vo.*;
+import org.springblade.resource.entity.Attach;
 import org.springblade.system.entity.DictBiz;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
@@ -70,6 +77,8 @@ public class ArchiveTreeContractSyncImpl {
 
     private final IWbsTreePrivateService wbsTreePrivateService;
 
+    private final JdbcTemplate jdbcTemplate;
+
 
 
     /**
@@ -769,6 +778,9 @@ public class ArchiveTreeContractSyncImpl {
      * 同步合同段数据时,统一校验通道,3声像资料,6日志资料,2试验资料
      */
     public void syncDataCheck(Long projectId, Long contractId, Long nodeId,Integer associationType) {
+        if (ObjectUtil.isEmpty(contractId)){
+            throw new ServiceException("未获取到当前同步节点的合同段信息,请查看是否当前节点在合同段节点下");
+        }
         // 合同信息
         ContractInfo contractInfo = contractInfoService.getById(contractId);
         // 判断是否正在同步
@@ -869,10 +881,140 @@ public class ArchiveTreeContractSyncImpl {
 
     /**
      * 同步某个合同段的试验资料到归档
+     *      因为试验系统没有做完,所以目前某些类型的同步会同步所有数据,并且也缺失一些文件的基础信息,
+     *          如大小,页码等,等做完之后,再完善。目前整体功能没有问题
      */
     @Transactional
     public void syncContractTrialData(Long projectId, ContractInfo contractInfo, ArchiveTreeContract archiveTreeContract) {
+        //获取勾选的试验类型
+        String contractTrialType = archiveTreeContract.getContractTrialType();
+        if (StringUtils.isBlank(contractTrialType)){
+            throw new ServiceException("当前节点未配置同步试验资料类型");
+        }
+        List<Integer> TrialType = Arrays.stream(contractTrialType.split(","))
+                .map(Integer::parseInt) // 将每个字符串转换为Integer
+                .collect(Collectors.toList());
+        Long contractId = contractInfo.getId();
+        String tenantId = AuthUtil.getTenantId();
+        log.info("同步试验文件,projectId:"+projectId+",contractId:"+contractId+",nodeId:"+archiveTreeContract.getId());
+        //先删除试验资料节点下的所有节点与文件
+        archiveTreeContractMapper.removeImageNodeFile(archiveTreeContract.getContractId(),archiveTreeContract.getId());
+        archiveTreeContractMapper.removeImageNodeChild(archiveTreeContract.getContractId(),archiveTreeContract.getId());
+
+        //查出所有试验节点,节点是共用项目级的
+        List<ArchiveSyncTrialVO> trials = archiveTreeContractMapper.getAllTrialNode(projectId);
+        //试验节点按照类型分组
+        Map<Integer, List<ArchiveSyncTrialVO>> trialsMap = trials.stream().collect(Collectors.groupingBy(ArchiveSyncTrialVO::getNodeType));
+        //查出所有的试验报告,报告是合同段独立的
+        List<TrialSelfInspectionRecord> records = archiveTreeContractMapper.getAllTrialRecord(contractId);
+        //试验报告按照节点分组
+        Map<Long, List<TrialSelfInspectionRecord>> recordsMap = records.stream().collect(Collectors.groupingBy(TrialSelfInspectionRecord::getNodeId));
+        List<ArchiveTreeContract> addNode = new ArrayList<>();
+        List<ArchiveFile> addFile = new ArrayList<>();
+        /**循环指定试验类型 */
+        for (Integer type : TrialType) {
+            //根据类型获取试验节点
+            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(type);
+            if (CollectionUtil.isEmpty(trialVOS)){
+                continue;
+            }
+            //循环试验节点
+            for (ArchiveSyncTrialVO vo : trialVOS) {
+                //把节点转换为档案节点,挂载到同步节点下
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                addNode.add(trialNode);
+                //获取出节点下面的报告,并转换为档案文件
+                List<TrialSelfInspectionRecord> files = recordsMap.get(vo.getPKeyId());
+                if (CollectionUtil.isEmpty(files)){
+                    continue;
+                }
+                //挂载到子节点下
+                List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
+                    ArchiveFile archiveFile = trialFileCovertArchiveFile(file, trialNode);
+                    return archiveFile;
+                }).collect(Collectors.toList());
+                addFile.addAll(newArchiveFileList);
+            }
 
+        }
+        /**单独处理外委和第三方报告 */
+        if (contractTrialType.contains("98")){
+            //获取所有的外委和第三方节点
+            List<TrialClassificationConfiguration> threeTestNodes = archiveTreeContractMapper.getAllThreeTestNode();
+            //获取出合同段所有的检测报告
+            List<TrialDetectionData> dataList = archiveTreeContractMapper.getAllTrialTestRecord(contractId);
+            //检测报告,按照节点分组
+            Map<Long, List<TrialDetectionData>> dataMap = dataList.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+            //循环所有节点
+            for (TrialClassificationConfiguration vo : threeTestNodes) {
+                //把节点转换为档案节点,挂载到同步节点下
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                addNode.add(trialNode);
+                //获取出节点下面的报告,并转换为档案文件
+                List<TrialDetectionData> files = dataMap.get(vo.getId());
+                if (CollectionUtil.isEmpty(files)){
+                    continue;
+                }
+                //挂载到子节点下
+                List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
+                    ArchiveFile archiveFile = trialTestFileCovertArchiveFile(file, trialNode);
+                    return archiveFile;
+                }).collect(Collectors.toList());
+                addFile.addAll(newArchiveFileList);
+            }
+        }
+
+        /**单独处理原材料资质证书 */
+        if (contractTrialType.contains("99")){
+            //获取所有的原材节点
+            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(52);
+            if (CollectionUtil.isNotEmpty(trialVOS)){
+                //查询出整个系统的附件,设计问题
+                Map<String, Attach> maps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Attach -> Attach, (obj1, obj2) -> obj1));
+                //获取出所有节点id
+                List<Long> nodeIds = trialVOS.stream().map(l -> l.getPKeyId()).collect(Collectors.toList());
+                //根据节点id,查询出所有的报告id
+                List<Long> recordIds = records.stream().filter(l -> nodeIds.contains(l.getNodeId())).map(l -> l.getId()).collect(Collectors.toList());
+                //根据报告id,查询出所有的报告附件
+                List<TrialSelfInspectionRecordFileVO> fileVOS = archiveTreeContractMapper.getAllTrialRecordFile(recordIds);
+                //报告附件按照节点id分组
+                Map<Long, List<TrialSelfInspectionRecordFileVO>> fileMap = fileVOS.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+                //循环原材节点
+                for (ArchiveSyncTrialVO vo : trialVOS) {
+                    //把节点转换为档案节点,挂载到同步节点下
+                    ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                    addNode.add(trialNode);
+                    //获取出节点下面的报告下面的附件,并转换为档案文件
+                    List<TrialSelfInspectionRecordFileVO> files = fileMap.get(vo.getPKeyId());
+                    if (CollectionUtil.isEmpty(files)){
+                        continue;
+                    }
+                    //上个开发太懒,敷衍了事,重新设置附件相关值
+                    for (TrialSelfInspectionRecordFileVO file : files) {
+                        Attach attach = maps.get(file.getUrl());
+                        if (attach != null){
+                            file.setFileName(attach.getOriginalName());
+                            file.setCreateTime(attach.getCreateTime());
+                        }
+                    }
+                    //挂载到子节点下
+                    List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
+                        ArchiveFile archiveFile = trialFileCovertArchiveFile2(file, trialNode);
+                        return archiveFile;
+                    }).collect(Collectors.toList());
+                    addFile.addAll(newArchiveFileList);
+                }
+
+            }
+
+        }
+        if (addNode.size() > 0){
+            addNode.stream().forEach(l->l.setTenantId(tenantId));
+            archiveTreeContractMapper.batchInsertArchiveTreeContract(addNode);
+        }
+        if (addFile.size() > 0){
+            archiveFileClient.addArchiveFile(addFile);
+        }
     }
 
     /**
@@ -883,7 +1025,7 @@ public class ArchiveTreeContractSyncImpl {
         //获取勾选的日志类型
         String contractLogType = archiveTreeContract.getContractLogType();
         if (StringUtils.isBlank(contractLogType)){
-            throw new ServiceException("当前节点未配置同步日志类型");
+            throw new ServiceException("当前节点未配置同步日志资料类型");
         }
         List<Integer> logType = Arrays.stream(contractLogType.split(","))
                 .map(Integer::parseInt) // 将每个字符串转换为Integer
@@ -904,14 +1046,18 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveFile> addFile = new ArrayList<>();
         //获取合同段所有的日志,并且附带类型
         List<ArchiveSyncLogVO> logs = wbsTreePrivateService.getContractAllLog(contractId);
+        if (CollectionUtil.isEmpty(logs)){
+            throw new ServiceException("当前合同段下没有日志资料");
+        }
         //日志按照类型分组
         Map<Integer, List<ArchiveSyncLogVO>> logMap = logs.stream().collect(Collectors.groupingBy(ArchiveSyncLogVO::getLogType));
-        //循环选择的日志类型,生成子节点
+        //循环选择的日志类型
         for (Integer type : logType) {
             String typeName = dictMap.get(type);
             if (StringUtils.isBlank(typeName)){
                 throw new ServiceException("日志存在字典中未配置的类型,请检查后再同步");
             }
+            //生成子节点
             ArchiveTreeContract logNode = createTypeNode(typeName, archiveTreeContract);
             /** 如果到时候修改需求,只显示有日志的,则下面文件存在再add*/
             addNode.add(logNode);
@@ -969,6 +1115,9 @@ public class ArchiveTreeContractSyncImpl {
 
         //获取合同下声像资料所有文件
         List<ImageClassificationFileDTO> imageClassificationFileList = imageClassificationFileClient.getImageClassificationFileListByContractId(contractId);
+        if (CollectionUtil.isEmpty(imageClassificationFileList)){
+            throw new ServiceException("当前合同段下没有声像资料");
+        }
         Map<Long, List<ImageClassificationFileDTO>> imageMap = imageClassificationFileList.stream().collect(Collectors.groupingBy(l -> l.getClassifyId()));
 
         //获取声像资料分类,生成声像资料下级节点
@@ -1124,6 +1273,129 @@ public class ArchiveTreeContractSyncImpl {
         return archiveFile;
     }
 
+    /**
+     * 质检试验资料附件 转换为 档案文件
+     */
+    private ArchiveFile trialFileCovertArchiveFile2(TrialSelfInspectionRecordFileVO vo,ArchiveTreeContract parentNode)
+    {
+        ArchiveFile archiveFile = new ArchiveFile();
+        archiveFile.setId(SnowFlakeUtil.getId());
+        archiveFile.setProjectId(String.valueOf(parentNode.getProjectId()));
+        archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
+        archiveFile.setNodeId(parentNode.getId()+"");
+//        archiveFile.setFileNumber(vo.getReportNo());
+        archiveFile.setFileName(vo.getFileName());
+        if (vo.getCreateTime() != null) {
+            archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getCreateTime()));
+        }
+        archiveFile.setFileUrl(vo.getUrl());
+        archiveFile.setPdfFileUrl(vo.getUrl());
+        archiveFile.setFilePage(1);
+        archiveFile.setIsApproval(0);
+        archiveFile.setIsCertification(1);
+        archiveFile.setIsNeedCertification(0);
+//        archiveFile.setDutyUser(vo.getTrialUserName());
+//        archiveFile.setCreateUser(vo.getCreateUser());
+        archiveFile.setStatus(0);
+        archiveFile.setIsDeleted(0);
+        archiveFile.setFileType(2L);
+        // 创建 LocalDateTime
+        LocalDateTime localDateTime = new Date().toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        archiveFile.setFtime(localDateTime);
+        archiveFile.setUtime(localDateTime);
+        archiveFile.setSort(0);
+        archiveFile.setPageNum("1");
+        archiveFile.setSourceType(1);
+        archiveFile.setIsElement(0);
+        archiveFile.setRectification(0);
+        archiveFile.setArchiveFileStorageType(StorageTypeEnum.SOUND_IMAGE.getCode());
+        return archiveFile;
+    }
+
+    /**
+     * 质检试验检测资料 转换为 档案文件
+     */
+    private ArchiveFile trialTestFileCovertArchiveFile(TrialDetectionData vo,ArchiveTreeContract parentNode)
+    {
+        ArchiveFile archiveFile = new ArchiveFile();
+        archiveFile.setId(SnowFlakeUtil.getId());
+        archiveFile.setProjectId(String.valueOf(parentNode.getProjectId()));
+        archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
+        archiveFile.setNodeId(parentNode.getId()+"");
+        archiveFile.setFileNumber(vo.getReportNo());
+        archiveFile.setFileName(vo.getMaterialName()+vo.getSpecificationModel());
+        if (vo.getReportDate() != null) {
+            archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
+        }
+        archiveFile.setFileUrl(vo.getReportAttachmentUrl());
+        archiveFile.setPdfFileUrl(vo.getReportAttachmentUrl());
+        archiveFile.setFilePage(1);
+        archiveFile.setIsApproval(0);
+        archiveFile.setIsCertification(1);
+        archiveFile.setIsNeedCertification(0);
+        archiveFile.setDutyUser(vo.getUserName());
+        archiveFile.setCreateUser(vo.getCreateUser());
+        archiveFile.setStatus(0);
+        archiveFile.setIsDeleted(0);
+        archiveFile.setFileType(2L);
+        // 创建 LocalDateTime
+        LocalDateTime localDateTime = new Date().toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        archiveFile.setFtime(localDateTime);
+        archiveFile.setUtime(localDateTime);
+        archiveFile.setSort(0);
+        archiveFile.setPageNum("1");
+        archiveFile.setSourceType(1);
+        archiveFile.setIsElement(0);
+        archiveFile.setRectification(0);
+        archiveFile.setArchiveFileStorageType(StorageTypeEnum.SOUND_IMAGE.getCode());
+        return archiveFile;
+    }
+
+    /**
+     * 质检试验资料 转换为 档案文件
+     */
+    private ArchiveFile trialFileCovertArchiveFile(TrialSelfInspectionRecord vo,ArchiveTreeContract parentNode)
+    {
+        ArchiveFile archiveFile = new ArchiveFile();
+        archiveFile.setId(SnowFlakeUtil.getId());
+        archiveFile.setProjectId(String.valueOf(parentNode.getProjectId()));
+        archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
+        archiveFile.setNodeId(parentNode.getId()+"");
+        archiveFile.setFileNumber(vo.getReportNo());
+        archiveFile.setFileName(StringUtils.isNotBlank(vo.getSpecificationModel())?vo.getSpecificationModel():vo.getTrialProjectName());
+        if (vo.getReportDate() != null) {
+            archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
+        }
+        archiveFile.setFileUrl(vo.getPdfUrl());
+        archiveFile.setPdfFileUrl(vo.getPdfUrl());
+        archiveFile.setFilePage(1);
+        archiveFile.setIsApproval(0);
+        archiveFile.setIsCertification(1);
+        archiveFile.setIsNeedCertification(0);
+        archiveFile.setDutyUser(vo.getTrialUserName());
+        archiveFile.setCreateUser(vo.getCreateUser());
+        archiveFile.setStatus(0);
+        archiveFile.setIsDeleted(0);
+        archiveFile.setFileType(2L);
+        // 创建 LocalDateTime
+        LocalDateTime localDateTime = new Date().toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        archiveFile.setFtime(localDateTime);
+        archiveFile.setUtime(localDateTime);
+        archiveFile.setSort(0);
+        archiveFile.setPageNum("1");
+        archiveFile.setSourceType(1);
+        archiveFile.setIsElement(0);
+        archiveFile.setRectification(0);
+        archiveFile.setArchiveFileStorageType(StorageTypeEnum.SOUND_IMAGE.getCode());
+        return archiveFile;
+    }
+
     /**
      * 质检日志资料 转换为 档案文件
      */

+ 66 - 99
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -31,9 +31,13 @@ import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.support.Try;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.NodeVO;
-import org.springblade.manager.dto.*;
+import org.springblade.manager.dto.TableSortDTO;
+import org.springblade.manager.dto.RangeInfo;
+import org.springblade.manager.dto.WbsTreeContractDTO;
+import org.springblade.manager.dto.WbsTreeContractDTO2;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
@@ -47,6 +51,7 @@ import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.BadSqlGrammarException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -1210,6 +1215,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             Map<String, String> jlTabMaps = new LinkedHashMap<>();
 
             List<WbsTreeContract> tabs = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, node.getId())
+                    .select(WbsTreeContract::getNodeName, WbsTreeContract::getTableOwner, WbsTreeContract::getPKeyId, WbsTreeContract::getInitTableName, WbsTreeContract::getSort, WbsTreeContract::getFullName, WbsTreeContract::getUpdateTime)
                     .eq(WbsTreeContract::getContractId, node.getContractId()).eq(WbsTreeContract::getType, 2)
                     .eq(WbsTreeContract::getWbsId, node.getWbsId())
                     .apply("(wbs_type is null OR wbs_type = " + node.getWbsType() + ")")
@@ -1221,98 +1227,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             //初始化表
             List<WbsTreeContract> sgTab = tabs.stream().filter(f -> "1,2,3".contains(f.getTableOwner())).collect(Collectors.toList());
             List<WbsTreeContract> jlTab = tabs.stream().filter(f -> "4,5,6".contains(f.getTableOwner())).collect(Collectors.toList());
-
-            List<CopyDto>sgList=new ArrayList<>();
-            List<CopyDto>jlList=new ArrayList<>();
-            //所以施工的表
-            for (WbsTreeContract sg : sgTab) {
-                String sgName = sg.getNodeName();
-                if(sgName.indexOf("(")>=0||sgName.indexOf(")")>=0){
-                    sgName = sgName.replaceAll("\\(.*?\\)", "");
-                }
-                if(sgName.indexOf("(")>=0||sgName.indexOf(")")>=0){
-                    sgName = sgName.replaceAll("\\(.*?\\)", "");
-                }
-                if(sgName.indexOf("__")>0){
-                    String[] sgNames = sgName.split("__");
-                    CopyDto c=new CopyDto();
-                    c.setNodeName(StringUtils.deleteWhitespace(sgNames[0]));
-                    c.setNum(Integer.parseInt(sgNames[1]));
-                    sgList.add(c);
-                }
-            }
-            //所以监理的复制表
-            for (WbsTreeContract jl : jlTab) {
-                String jlName = jl.getNodeName();
-                if(jlName.indexOf("(")>=0||jlName.indexOf(")")>=0){
-                    jlName=jlName.replaceAll("\\(.*?\\)", "");
-                }
-                if(jlName.indexOf("(")>=0||jlName.indexOf(")")>=0){
-                    jlName=jlName.replaceAll("\\(.*?\\)", "");
-                }
-                if(jlName.indexOf("__")>0){
-                    String[] sgNames = jlName.split("__");
-                    CopyDto c=new CopyDto();
-                    c.setNodeName(StringUtils.deleteWhitespace(sgNames[0]));
-                    c.setNum(Integer.parseInt(sgNames[1]));
-                    jlList.add(c);
-                }
-
-            }
-
-            if(sgList.size()>0){
-                //还需要添加的复制表
-                sgList.removeAll(jlList);
-                ArrayList<CopyDto> copyDtos = new ArrayList<>(sgList);
-                List<WbsTreeContract>list=new ArrayList<>();
-                for (WbsTreeContract jl : jlTab) {
-                    String jlName = jl.getNodeName();
-                    if(jlName.indexOf("(")>=0||jlName.indexOf(")")>=0){
-                        jlName=jlName.replaceAll("\\(.*?\\)", "");
-                        jlName=StringUtils.deleteWhitespace(jlName);
-                    }
-                    if(jlName.indexOf("(")>=0||jlName.indexOf(")")>=0){
-                        jlName=jlName.replaceAll("\\(.*?\\)", "");
-                        jlName=StringUtils.deleteWhitespace(jlName);
-                    }
-                    if(jlName.indexOf("__")>=0){
-                        String[] oldName = jlName.split("__");
-                        jlName=oldName[0];
-                    }
-                    for (CopyDto copyDto : sgList) {
-                        if(copyDto.getNodeName().equals(jlName)){
-                        String name= jl.getNodeName()+"__"+ copyDto.getNum();
-                            char charToFind = '_'; // 要查找的字符
-                            int count = 0;
-                            int index = name.indexOf(charToFind);
-                            while (index >= 0) {
-                                count++;
-                                index = name.indexOf(charToFind, index + 1);
-                            }
-                           if(count>2){
-                              continue;
-                           }
-                            long newPkId = SnowFlakeUtil.getId();
-                            WbsTreeContract wbsTreeContract = new WbsTreeContract();
-                            BeanUtil.copy(jl, wbsTreeContract);
-                            wbsTreeContract.setPKeyId(newPkId);
-                            wbsTreeContract.setCreateTime(new Date());
-                            wbsTreeContract.setNodeName(name);
-                            wbsTreeContract.setIsCopeTab(2);
-                            wbsTreeContract.setIsTabPdf(1); // pdf 不能预览
-                            wbsTreeContract.setIsBussShow(1); // 是否隐藏表
-                            wbsTreeContract.setTabFileType(1);//没有上传附件
-                            wbsTreeContract.setPdfUrl("");
-                            list.add(wbsTreeContract);
-                        }
-                    }
-
-                }
-                System.out.println(list.size());
-                this.saveBatch(list);
-                jlTab.addAll(list);
-            }
-
             List<WbsTreeContract> sgTabSort = sgTab.stream()
                     .sorted((a, b) -> {
                         Integer aSort = a.getSort() != null ? a.getSort() : 0;
@@ -1373,8 +1287,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 }
             }
 
-
-
             //构造表数据
             List<InsertDataVO> resultData = new LinkedList<>();
             this.syncTabDataImpl(sgTabMaps, jlTabMaps, resultData);
@@ -1449,8 +1361,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             }
                             if (ObjectUtil.isNotEmpty(vo.getDataLength()) && vo.getDataLength() > 500) {
                                 //如果超过500字符长度,那么直接异常提示
-                               // filedNames.add(vo.getName());
-                                exKeys.add(vo.getKey() + "---" + vo.getDataLength());
+                                filedNames.add(vo.getName());
                             }
                         }
                         if (keys.size() > 0 && values.size() > 0 && keys.size() == values.size()) {
@@ -1581,8 +1492,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String nodeNameReJL = splitJl[0];
                 String pKeyIdJL = splitJl[1];
                 String initTabNameJL = jlTab.getValue();
-                //表的代码名称相同,就复制数据,例如:G10=G10 复制的表是G101去掉最后一位
+
+                //表的代码名称相同,就复制数据,例如:G10=G10
                 if (nodeNameRe.equals(nodeNameReJL)) {
+
                     String htmlStringJL = this.getHtmlString(pKeyIdJL);
 
                     //获取质检实体表对应数据
@@ -2498,4 +2411,58 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             throw new ServiceException("请传入ids");
         }
     }
-}
+
+    public void resetTableDate(Long projectId) {
+        //1 获取项目下所有节点
+        List<WbsTreeContract> allTable = baseMapper.projectAllTable(projectId);
+        //2 获取所有的m表,存入set集合中
+        Set<String> tables = allTable.stream().filter(l->StringUtils.isNotBlank(l.getInitTableName())).map(l->l.getInitTableName()).collect(Collectors.toSet());
+        List<String> updateSql = new ArrayList<>();
+        //3 循环m表,判断是否存在,存在则查询所有数据,按照map格式
+        for (String table : tables) {
+            String isExitSql = " select * from " + table;
+            List<Map<String, Object>> tabList = new ArrayList<>();
+            try {
+                tabList = jdbcTemplate.queryForList(isExitSql);
+            }catch (BadSqlGrammarException e){
+                System.out.println("表单不存在"+table);
+                continue;
+            }
+            if (CollectionUtil.isNotEmpty(tabList)) {
+                //4 循环数据,正则表达式匹配,匹配成功就拼接sql,存入集合
+                for (Map<String, Object> map : tabList) {
+                    Object id = map.get("id");
+                    for (String s : map.keySet()) {
+                        Object object = map.get(s);
+                        if (org.springblade.core.tool.utils.ObjectUtil.isNotEmpty(object) && !object.toString().contains("[") && object.toString().contains(",")){
+                            // 定义日期格式的正则表达式
+                            String regex = "\\d{4}年\\d{1,2}月\\d{1,2}日";
+                            Pattern pattern = Pattern.compile(regex);
+                            Matcher matcher = pattern.matcher(object.toString());
+                            // 使用计数器来跟踪匹配到的日期数量
+                            List<String> list = new ArrayList<>();
+                            while (matcher.find()) {
+                                list.add(matcher.group());
+                            }
+                            if (list.size() == 2) {
+                                System.out.println(object);
+                                //分割尾缀
+                                String[] split = object.toString().split("_\\^_",2);
+                                String newDate = "["+list.get(0)+", "+list.get(1)+"]"+"_^_"+split[1];
+                                String sql = " UPDATE "+table + " set "+s +"= '"+newDate+"' WHERE id = "+id;
+                                updateSql.add(sql);
+                            }
+                        }
+                    }
+                }
+            }
+
+        }
+        //5 执行sql,批量修改
+        List<List<String>> lists = CommonUtil.splitList(updateSql, 1000);
+        for (List<String> list : lists) {
+            baseMapper.batchUpdateTable(list);
+        }
+        System.out.println("66666666666");
+    }
+}

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

@@ -2771,7 +2771,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         } else if (contractInfo.getContractType()==3 || contractInfo.getContractType()==8) { //业主
             pkeyId = treePrivate.getYzerTreeId()+"";
         }else{
-            return "该合同段没有委托单权限业务";
+            return R.fail("该合同段没有委托单权限业务");
         }
         Object excelHtml = getExcelHtml(pkeyId);
         return excelHtml;

+ 213 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/CreateDashedLine.java

@@ -0,0 +1,213 @@
+package org.springblade.manager.utils;
+
+import com.spire.ms.System.Collections.ArrayList;
+import com.sun.xml.bind.v2.util.FlattenIterator;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.graphics.PDLineDashPattern;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.measurement.PDViewportDictionary;
+import org.apache.pdfbox.text.PDFTextStripper;
+import org.apache.pdfbox.text.PDFTextStripperByArea;
+import org.apache.pdfbox.text.TextPosition;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.FileUtils;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.manager.vo.PDFIndexInfo;
+
+import java.awt.geom.Point2D;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+
+public class CreateDashedLine {
+
+    public static void mai1n(String[] args) throws Exception {
+        // 获取值的坐标
+      //  List<String> s_data39 = new java.util.ArrayList<>();
+
+        List<String> s_data34 = new java.util.ArrayList<>();
+        s_data34.add("2.8");
+        s_data34.add("7.66");
+/*        s_data34.add("14.03");
+        s_data34.add("14.56");
+        s_data34.add("16.28");
+        s_data34.add("");
+        s_data34.add("16.42");
+        s_data34.add("16.57");
+        s_data34.add("16.73");
+        s_data34.add("16.9");
+        s_data34.add("17.07");
+        s_data34.add("17.26");*/
+
+        String pdfUrl = "/Users/hongchuangyanfa/Desktop/excel/1750071431349174274.pdf";
+
+      //  getPDFInfo(pdfUrl,s_data39,"1");
+        getPDFInfo(pdfUrl,s_data34,"2");
+
+        System.out.println("");
+    }
+
+
+    public static void getPDFInfo(String pdfUrl,List<String> s_data,String type) throws Exception {
+        PDDocument document = PDDocument.load(new File(pdfUrl));
+        //获取文件流
+        InputStream inputStream = new FileInputStream(new File(pdfUrl));
+        //转换
+        byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
+        List<PDFIndexInfo> keywordPostions = PdfAddimgUtil.findKeywordPostions(bytes, "累计%");
+
+        // 获取  实际完成=累计% 的坐标
+        PDFIndexInfo pdfIndexInfo = keywordPostions.get(0);
+        float s_with = pdfIndexInfo.getDataInfo()[1];
+        float s_heiht = pdfIndexInfo.getDataInfo()[2];
+
+        // 获取  计划完成 = 累计% 的坐标
+        PDFIndexInfo jPdf = keywordPostions.get(1);
+        float j_with = jPdf.getDataInfo()[1];
+        float j_heiht = jPdf.getDataInfo()[2];
+
+        System.out.println(s_with+"__"+s_heiht);
+        System.out.println(j_with+"__"+j_heiht);
+
+        List<PDFIndexInfo> allwordPostions = PdfAddimgUtil.findAllwordPostions(bytes);
+        PDFIndexInfo pdfIndex = allwordPostions.get(0);
+        List<float[]> listData = pdfIndex.getListData();
+        String context = pdfIndex.getPkeyid();
+
+        // 获取月份的y轴
+        int moth_y = context.indexOf("1234567891011121");
+        float[] moth = listData.get(moth_y);
+        System.out.println(moth[2]);
+        List<PDFIndexInfo> bf_list = PdfAddimgUtil.findKeywordPostions(bytes, "%");
+         float bf_x = 0f;
+         float bf_y = 0f;
+        for(PDFIndexInfo bf:bf_list){
+           if(bf.getDataInfo()[2]==moth[2]){
+               bf_x =   bf.getDataInfo()[1];
+               bf_y =   bf.getDataInfo()[2];
+               break;
+           }
+        }
+        System.out.println("百分"+bf_x);
+        System.out.println("百分"+bf_y);
+
+        Map<String , float[]> data = new HashMap<>();
+        for(int i=20 ; i>=0 ; i--){
+            //测试数据
+            String key = i * 5 +"";
+            List<String> strList = Func.toStrList(key);
+            for (String text : strList) {
+                for (int pos = 0; pos < context.length(); ) {
+                    int positionIndex = context.indexOf(text, pos);
+                    if (positionIndex == -1) {
+                        break;
+                    }
+                    float[] postions = listData.get(positionIndex);
+                    if((postions[1]==bf_x || Math.abs(postions[1]-bf_x)<=0.002) && postions[2]>bf_y){
+                        data.put(key,postions);
+                        bf_y =postions[2];
+                        break;
+                    }
+                    pos = positionIndex + 1;
+                }
+            }
+        }
+
+
+
+        Map<String , float[]> s_data_xy = new HashMap<>();
+
+        for(String sval:s_data){
+            //测试数据
+            List<String> strList = Func.toStrList(sval);
+            for (String text : strList) {
+                for (int pos = 0; pos < context.length(); ) {
+                    int positionIndex = context.indexOf(text, pos);
+                    if (positionIndex == -1) {
+                        break;
+                    }
+                    float[] postions = listData.get(positionIndex);
+                    if("1".equals(type)){
+                        if((postions[2]==s_heiht || Math.abs(postions[2]-s_heiht)<=0.002 ) && postions[1]>s_with){
+                            s_data_xy.put(sval,postions);
+                            s_with = postions[1];
+                            break;
+                        }
+                    }
+                    if("2".equals(type)){
+                        if((postions[2]==j_heiht || Math.abs(postions[2]-j_heiht)<=0.002 ) && postions[1]>s_with){
+                            s_data_xy.put(sval,postions);
+                            s_with = postions[1];
+                            break;
+                        }
+                    }
+                    pos = positionIndex + 1;
+                }
+            }
+        }
+
+        float pageHeight = document.getPage(0).getMediaBox().getHeight();
+        float pageWidth = document.getPage(0).getMediaBox().getWidth();
+        float oney = (data.get("0")[2] -data.get("5")[2])/5 * pageHeight;
+        //实线坐标
+        List<Float> points = new ArrayList();
+        for(String sval:s_data){
+            float[] floats = s_data_xy.get(sval);
+            if(floats!=null){
+                points.add( pageWidth * (floats[1])+2);
+                Double floor = Math.floor(Func.toDouble(sval) / 5)*5;
+
+                float add = (float) ((Func.toDouble(sval)-floor ) * oney);
+
+                String da2 = floor.intValue()+"";
+                float[] floats1 = data.get(da2);
+                points.add( pageHeight- pageHeight * (floats1[2]) + add );
+            }
+        }
+        PDFFill(points,pdfUrl,type);
+    }
+
+    public static void PDFFill(List<Float> points,String fileUrl,String type) throws Exception {
+        // 创建一个PDF文档
+        PDDocument document = PDDocument.load(new File(fileUrl));
+
+        // 创建一个页面
+        PDPage page = document.getPage(0);
+        // 纸张大小
+
+        try (PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND, true, true)) {
+            // 设置线宽和颜色
+            PDExtendedGraphicsState extendedGraphicsState = new PDExtendedGraphicsState();
+            extendedGraphicsState.setLineWidth(1f);
+            contentStream.setGraphicsStateParameters(extendedGraphicsState);
+            float[] a={4,2};
+            contentStream.setLineDashPattern(a, 2);
+
+            // 定义点集合,表示折线上的点
+            List<Point2D.Float> points1 = new java.util.ArrayList<>();
+            for (int i = 0; i < points.size(); i += 2) {
+                points1.add(new Point2D.Float(points.get(i), points.get(i + 1)));
+            }
+
+            // 绘制折线
+            Point2D.Float current = null;
+            for (Point2D.Float point : points1) {
+                if (current != null) {
+                    contentStream.drawLine(current.x, current.y, point.x, point.y);
+                }
+                current = point;
+            }
+        }
+
+        document.save("/Users/hongchuangyanfa/Desktop/excel/test_info.pdf");
+        document.close();
+        System.out.println("完成");
+    }
+}

+ 201 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/CreateDashedLine.java

@@ -0,0 +1,201 @@
+package org.springblade.meter.utils;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.vo.PDFIndexInfo;
+
+import java.awt.geom.Point2D;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CreateDashedLine {
+
+/*    public static void main(String[] args) throws Exception {
+        // 获取值的坐标
+        List<String> s_data = new java.util.ArrayList<>();
+        s_data.add("0.01");
+        s_data.add("0.076");
+        s_data.add("1.08");
+        s_data.add("1.28");
+        s_data.add("2.76");
+        s_data.add("3.56");
+        s_data.add("4.8");
+        s_data.add("5.88");
+        s_data.add("7.46");
+        s_data.add("10.38");
+        s_data.add("13.85");
+        s_data.add("17.54");
+        s_data.add("22.88");
+        s_data.add("27.94");
+        String pdfUrl = "/Users/hongchuangyanfa/Desktop/excel/【2-4】施工进度表.pdf";
+
+        getPDFInfo(pdfUrl,s_data);
+
+        System.out.println("");
+    }*/
+
+
+    public static void getPDFInfo(String pdfUrl,List<String> s_data,String type) throws Exception {
+        PDDocument document = PDDocument.load(new File(pdfUrl));
+        //获取文件流
+        InputStream inputStream = new FileInputStream(new File(pdfUrl));
+        //转换
+        byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
+        List<PDFIndexInfo> keywordPostions = PdfAddimgUtil.findKeywordPostions(bytes, "累计%");
+
+        // 获取  实际完成=累计% 的坐标
+        PDFIndexInfo pdfIndexInfo = keywordPostions.get(0);
+        float s_with = pdfIndexInfo.getDataInfo()[1];
+        float s_heiht = pdfIndexInfo.getDataInfo()[2];
+
+        // 获取  计划完成 = 累计% 的坐标
+        PDFIndexInfo jPdf = keywordPostions.get(1);
+        float j_with = jPdf.getDataInfo()[1];
+        float j_heiht = jPdf.getDataInfo()[2];
+
+        System.out.println(s_with+"__"+s_heiht);
+        System.out.println(j_with+"__"+j_heiht);
+
+        List<PDFIndexInfo> allwordPostions = PdfAddimgUtil.findAllwordPostions(bytes);
+        PDFIndexInfo pdfIndex = allwordPostions.get(0);
+        List<float[]> listData = pdfIndex.getListData();
+        String context = pdfIndex.getPkeyid();
+
+        // 获取月份的y轴
+        int moth_y = context.indexOf("1234567891011121");
+        float[] moth = listData.get(moth_y);
+        System.out.println(moth[2]);
+        List<PDFIndexInfo> bf_list = PdfAddimgUtil.findKeywordPostions(bytes, "%");
+         float bf_x = 0f;
+         float bf_y = 0f;
+        for(PDFIndexInfo bf:bf_list){
+           if(bf.getDataInfo()[2]==moth[2]){
+               bf_x =   bf.getDataInfo()[1];
+               bf_y =   bf.getDataInfo()[2];
+               break;
+           }
+        }
+        System.out.println("百分"+bf_x);
+        System.out.println("百分"+bf_y);
+
+        Map<String , float[]> data = new HashMap<>();
+        for(int i=20 ; i>=0 ; i--){
+            //测试数据
+            String key = i * 5 +"";
+            List<String> strList = Func.toStrList(key);
+            for (String text : strList) {
+                for (int pos = 0; pos < context.length(); ) {
+                    int positionIndex = context.indexOf(text, pos);
+                    if (positionIndex == -1) {
+                        break;
+                    }
+                    float[] postions = listData.get(positionIndex);
+                    if((postions[1]==bf_x || Math.abs(postions[1]-bf_x)<=0.002) && postions[2]>bf_y){
+                        data.put(key,postions);
+                        bf_y =postions[2];
+                        break;
+                    }
+                    pos = positionIndex + 1;
+                }
+            }
+        }
+
+
+        Map<String , float[]> s_data_xy = new HashMap<>();
+
+        for(String sval:s_data){
+            //测试数据
+            List<String> strList = Func.toStrList(sval);
+            for (String text : strList) {
+                for (int pos = 0; pos < context.length(); ) {
+                    int positionIndex = context.indexOf(text, pos);
+                    if (positionIndex == -1) {
+                        break;
+                    }
+                    float[] postions = listData.get(positionIndex);
+                    if("1".equals(type)){ //实际
+                        if((postions[2]==s_heiht || Math.abs(postions[2]-s_heiht)<=0.01 ) && postions[1]>s_with){
+                            s_data_xy.put(sval,postions);
+                            s_with = postions[1];
+                            break;
+                        }
+                    }
+                    if("2".equals(type)){ //计划
+                        if((postions[2]==j_heiht || Math.abs(postions[2]-j_heiht)<=0.01 ) && postions[1]>j_with){
+                            s_data_xy.put(sval,postions);
+                            s_with = postions[1];
+                            break;
+                        }
+                    }
+                    pos = positionIndex + 1;
+                }
+            }
+        }
+
+        float pageHeight = document.getPage(0).getMediaBox().getHeight();
+        float pageWidth = document.getPage(0).getMediaBox().getWidth();
+        float oney = (data.get("0")[2] -data.get("5")[2])/5 * pageHeight;
+        //实线坐标
+        List<Float> points = new ArrayList<>();
+        for(String sval:s_data){
+            float[] floats = s_data_xy.get(sval);
+            if(floats!=null){
+                points.add( pageWidth * (floats[1])+2);
+                Double floor = Math.floor(Func.toDouble(sval) / 5)*5;
+                String da2 = floor.intValue()+"";
+                float add = (float) ((Func.toDouble(sval)-floor ) * oney);
+                float[] floats1 = data.get(da2);
+                points.add( pageHeight- pageHeight * (floats1[2])+add);
+            }
+        }
+        PDFFill(points,pdfUrl,type);
+    }
+
+    public static void PDFFill(List<Float> points,String fileUrl,String type) throws Exception {
+        // 创建一个PDF文档
+        PDDocument document = PDDocument.load(new File(fileUrl));
+
+        // 创建一个页面
+        PDPage page = document.getPage(0);
+        // 纸张大小
+
+        try (PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND, true, true)) {
+            // 设置线宽和颜色
+            PDExtendedGraphicsState extendedGraphicsState = new PDExtendedGraphicsState();
+            extendedGraphicsState.setLineWidth(1f);
+            contentStream.setGraphicsStateParameters(extendedGraphicsState);
+            if(type.equals("2")){
+                float[] a={4,2};
+                contentStream.setLineDashPattern(a, 2);
+            }
+
+            // 定义点集合,表示折线上的点
+            List<Point2D.Float> points1 = new java.util.ArrayList<>();
+            for (int i = 0; i < points.size(); i += 2) {
+                points1.add(new Point2D.Float(points.get(i), points.get(i + 1)));
+            }
+
+            // 绘制折线
+            Point2D.Float current = null;
+            for (Point2D.Float point : points1) {
+                if (current != null) {
+                    contentStream.drawLine(current.x, current.y, point.x, point.y);
+                }
+                current = point;
+            }
+        }
+
+        document.save(fileUrl);
+        document.close();
+        System.out.println("完成");
+    }
+}