소스 검색

Merge branch 'dev'

lvy 3 달 전
부모
커밋
6e79e69b75
31개의 변경된 파일800개의 추가작업 그리고 66개의 파일을 삭제
  1. 3 3
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 5 0
      blade-ops/blade-resource/pom.xml
  3. 4 4
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  4. 14 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/EKeyDto.java
  5. 9 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/NeiYeLedgerDto1.java
  6. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/AddContractTreeNodeVO.java
  7. 22 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO1.java
  8. 16 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  9. 5 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  10. 21 20
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  11. 239 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  12. 4 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  13. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  14. 8 8
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  15. 6 8
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtil.java
  16. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  17. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  18. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  19. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  20. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  21. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  22. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  23. 29 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  24. 22 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  25. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  26. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  27. 286 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddContextUtils.java
  28. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/RandomNumberHolder.java
  29. BIN
      blade-service/blade-manager/src/main/resources/simsun.ttc
  30. 0 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
  31. 1 0
      pom.xml

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

@@ -147,10 +147,10 @@ public class CommonUtil {
             //获取OSS文件流
             URL url = new URL(urlStr);
             URLConnection conn = url.openConnection();
-            // 设置连接超时时间
+      /*      // 设置连接超时时间
             conn.setConnectTimeout(10000); // 5秒
             // 设置读取超时时间
-            conn.setReadTimeout(10000); // 5秒
+            conn.setReadTimeout(10000); // 5秒*/
             conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
             return conn.getInputStream();
         } catch (Exception e) {
@@ -576,7 +576,7 @@ public class CommonUtil {
         String formatName = "JPEG";
         ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
         BufferedImage originalImage = ImageIO.read(bais);
-        long sizeLimit = 366912000; //358KB
+        long sizeLimit = 1024*1024*5; //5M
         int width = 768;
         int height = 1024;
         Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);

+ 5 - 0
blade-ops/blade-resource/pom.xml

@@ -145,6 +145,10 @@
             <artifactId>lombok</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-oss</artifactId>
+        </dependency>
     </dependencies>
 
 
@@ -169,6 +173,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-antrun-plugin</artifactId>
+                <version>1.8</version>
             </plugin>
         </plugins>
     </build>

+ 4 - 4
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -77,7 +77,7 @@ public class OssBuilder {
 	}
 
 	/**
-	 * 获取template
+	 * 获取template.
 	 *
 	 * @param code 资源编号
 	 * @return OssTemplate
@@ -86,9 +86,8 @@ public class OssBuilder {
 		String tenantId = AuthUtil.getTenantId();
 		Oss oss = getOss(tenantId, code);
 
-
 		//oss.setEndpoint("http://183.247.216.148:9000/");
-
+		// oss.setEndpoint("https://xinan1.zos.ctyun.cn");
 		Oss ossCached = ossPool.get(tenantId);
 		OssTemplate template = templatePool.get(tenantId);
 		// 若为空或者不一致,则重新加载
@@ -113,7 +112,7 @@ public class OssBuilder {
 						template = TencentCosBuilder.template(oss, ossRule);
 					} else if (oss.getCategory() == OssEnum.HUAWEI.getCategory()) {
 						template = HuaweiObsBuilder.template(oss, ossRule);
-					} else if (oss.getCategory() == OssEnum.AMAZONS3.getCategory()) {
+					}else if (oss.getCategory() == OssEnum.AMAZONS3.getCategory()){
 						template = AmazonS3OssBuilder.template(oss, ossRule);
 					}
 					templatePool.put(tenantId, template);
@@ -121,6 +120,7 @@ public class OssBuilder {
 				}
 			}
 		}
+		System.out.println("oss="+oss.getEndpoint());
 		return template;
 	}
 

+ 14 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/EKeyDto.java

@@ -0,0 +1,14 @@
+package org.springblade.business.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class EKeyDto {
+    private String  eKey;
+    private String  initTableName;
+    private Long    pKeyId;
+}

+ 9 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/NeiYeLedgerDto1.java

@@ -0,0 +1,9 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+@Data
+public class NeiYeLedgerDto1 {
+    private Long pkeyId;
+    private Integer type;
+}

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

@@ -30,6 +30,9 @@ public class AddContractTreeNodeVO {
     @ApiModelProperty("是否节点划分时新增 1是")
     private Integer isImportTree;
 
+    @ApiModelProperty("合同段模板类型 1模版 2底层节点")
+    private Integer templateType;
+
     public void setHalfSelectedList(String primaryKeyId, String nodeName) {
         if (this.halfSelectedList == null) {
             this.halfSelectedList = new ArrayList<>();

+ 22 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/NeiYeLedgerVO1.java

@@ -0,0 +1,22 @@
+package org.springblade.business.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class NeiYeLedgerVO1 {
+
+      private String className;   //单位工程
+      private String partName;   //分部工程
+      private String subPartName; //子分部工程
+      private String unitName;   //单元工程
+      private Integer unitCount;  //单元工程个数
+      private Integer passCount;  //合格数量
+      private Integer goodCount;  //优良个数
+      private String  goodRate;   //优良率
+      private Long    id;         //ID
+
+}

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

@@ -1,5 +1,6 @@
 package org.springblade.manager.feign;
 
+import org.springblade.business.dto.EKeyDto;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
@@ -22,6 +23,9 @@ public interface WbsTreeContractClient {
      */
     String API_PREFIX = "/api/manager/WbsTreeContract";
 
+    @GetMapping(API_PREFIX + "/getTables")
+    List<WbsTreeContract> getTables(@RequestParam String contractId, @RequestParam Long id, @RequestParam String wbsId) ;
+
     @GetMapping(API_PREFIX + "/queryContractTreeNodeByPKeyId")
     WbsTreeContract queryContractTreeNodeByPKeyId(@RequestParam Long toCopyNodePKeyId);
 
@@ -186,4 +190,16 @@ public interface WbsTreeContractClient {
 
     @PostMapping(API_PREFIX + "/selectContractJLForm")
     List<WbsTreeContractTreeVOS> selectContractJLForm(@RequestBody List<Long> removeList);
+
+    @GetMapping(API_PREFIX + "/getById")
+    WbsTreeContract getById(@RequestParam Long pkeyId);
+
+    @GetMapping(API_PREFIX + "/getAncestors")
+    List<WbsTreeContract> getAncestors(@RequestParam String ancestors);
+
+    @GetMapping(API_PREFIX +"/get-node-typ6")
+    List<WbsTreeContract> getNodeTyp6(@RequestParam Long pKeyId);
+
+    @GetMapping(API_PREFIX + "/get-ekey")
+    EKeyDto getEKey(@RequestParam String contractId, @RequestParam Long pKeyId, @RequestParam String wbsId);
 }

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

@@ -82,7 +82,11 @@ public interface WbsTreePrivateClient {
     R<WbsTreePrivate> getProjectOpinionNode(@RequestParam Long projectId);
 
 
-    @GetMapping("/search-node-tables")
+    @GetMapping(API_PREFIX +"/search-node-tables")
      R<List<WbsTreePrivateVO4>> searchNodeAllTable(@RequestParam String primaryKeyId,@RequestParam String type,@RequestParam String tableType, @RequestParam String contractId,@RequestParam String projectId,@RequestParam Integer isAdd,@RequestParam Long id) ;
 
+    @GetMapping(API_PREFIX +"/get-node-class")
+    WbsTreePrivate getNodeClass(@RequestParam Long isTypePrivatePid);
+
+
 }

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

@@ -3318,30 +3318,31 @@ public R<Boolean> saveContractTreeNode(@RequestBody AddContractTreeNodeVO vo) {
                 ));
             }
         }
-        //新增节点类型不能大于选择节点类型
-        Set<Integer> nodeType = query.stream()
-            .filter(wbsTreeContract -> wbsTreeContract.getNodeType() != null)
-            .map(WbsTreePrivate::getNodeType)
-            .collect(Collectors.toSet());
-        Integer type = treeContract.getNodeType();
-        if(type<=6||type==18){
-            type = (type == 1) ? 1 : (type == 18) ? 2 : type + 1;
-            for (Integer i : nodeType) {
-                i = (i == 1) ? 1 : (i == 18) ? 2 : i + 1;
-                if("1".equals(vo.getSaveType())){
-                    if (i <type) {
-                        throw new ServiceException("当前新增节点类型不能大于或等于父级节点类型");
-                    }
-                }else {
-                    if (i <=type) {
-                        throw new ServiceException("当前新增节点类型不能大于或等于父级节点类型");
+        //只有底层节点才有这个限制
+        if(vo.getTemplateType()!=null&&vo.getTemplateType()==2){
+            //新增节点类型不能大于选择节点类型
+            Set<Integer> nodeType = query.stream()
+                .filter(wbsTreeContract -> wbsTreeContract.getNodeType() != null)
+                .map(WbsTreePrivate::getNodeType)
+                .collect(Collectors.toSet());
+            Integer type = treeContract.getNodeType();
+            if(type<=6||type==18){
+                type = (type == 1) ? 1 : (type == 18) ? 2 : type + 1;
+                for (Integer i : nodeType) {
+                    i = (i == 1) ? 1 : (i == 18) ? 2 : i + 1;
+                    if("1".equals(vo.getSaveType())){
+                        if (i <type) {
+                            throw new ServiceException("当前新增节点类型不能大于或等于父级节点类型");
+                        }
+                    }else {
+                        if (i <=type) {
+                            throw new ServiceException("当前新增节点类型不能大于或等于父级节点类型");
+                        }
                     }
-                }
 
+                }
             }
         }
-
-
         //保存集合
         List<WbsTreeContract> saveList = new ArrayList<>();
         List<ConstructionLedger> saveLedger = new ArrayList<>();

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

@@ -2,33 +2,57 @@ package org.springblade.business.controller;
 
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.springblade.business.dto.EKeyDto;
+import org.springblade.business.dto.NeiYeLedgerDto1;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.vo.NeiYeLedgerVO;
+import org.springblade.business.vo.NeiYeLedgerVO1;
 import org.springblade.business.vo.NeiYeQueryVO;
 import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
+import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.core.mp.support.Query;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -40,6 +64,8 @@ public class NeiYeController {
 
     private final WbsTreeContractClient wbsTreeContractClient;
 
+    private final WbsTreePrivateClient wbsTreePrivatClient;
+
     private final IConstructionLedgerService constructionLedgerService;
 
     private final IInformationQueryService informationQueryService;
@@ -93,7 +119,7 @@ public class NeiYeController {
                 if (node.getParentId() == 0) {
                     queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contractType, contractId);
                 } else {
-                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getId().toString(), contractType, contractId);
+                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getPKeyId().toString(), contractType, contractId);
                 }
             } else {
                 //填报节点
@@ -276,6 +302,218 @@ public class NeiYeController {
         return R.data(300, null, "未查询到数据");
     }
 
+
+    @PostMapping("/queryCurrentNodeNeiYeLedger1")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取内业台账列表(水利)")
+    public R<List<NeiYeLedgerVO1>>queryCurrentNodeNeiYeLedger1(@RequestBody NeiYeLedgerDto1 dto){
+        Integer type=dto.getType();
+        //初始数据  type=1最后返回vo1,type=2就复制在修改组装成一个集合
+        NeiYeLedgerVO1 vo1 = new NeiYeLedgerVO1();
+        List<NeiYeLedgerVO1>voList = new ArrayList<>();
+        //查出当前节点的信息contract
+        WbsTreeContract wbsTreeContract = wbsTreeContractClient.getById(dto.getPkeyId());
+        if(wbsTreeContract!=null){
+            String ancestors = wbsTreeContract.getAncestors();
+            //将父级节点全部查出来
+           List<WbsTreeContract> ancetorsList=wbsTreeContractClient.getAncestors(ancestors);
+           if(ancetorsList.size()>0){
+               for (WbsTreeContract contract : ancetorsList) {
+                   if(new Integer("1").equals(contract.getNodeType())&&contract.getParentId()!=0L){
+                       //类型属于1则为单位工程
+                       vo1.setClassName(contract.getNodeName());
+                   }else if(new Integer("2").equals(contract.getNodeType())){
+                       //类型属于2则为分部工程
+                       vo1.setPartName(contract.getNodeName());
+                   }else if(new Integer("3").equals(contract.getNodeType())){
+                       //类型属于3则为子分部工程
+                       vo1.setSubPartName(contract.getNodeName());
+                   }
+               }
+           }
+           if(wbsTreeContract.getNodeType()==1){
+               vo1.setClassName(wbsTreeContract.getNodeName());
+           } else if (wbsTreeContract.getNodeType()==2) {
+               vo1.setPartName(wbsTreeContract.getNodeName());
+           }else if(wbsTreeContract.getNodeType()==3){
+               vo1.setPartName(wbsTreeContract.getNodeName());
+           }
+            //如果选择的节点正好是工序则直接将单元查出来
+            if(wbsTreeContract.getNodeType()==6){
+                Integer unitNameNum=0;
+                if(wbsTreeContract!=null&&wbsTreeContract.getUnitName()!=null){
+                    unitNameNum=wbsTreeContract.getUnitName();
+                }
+               if(unitNameNum!=null&&unitNameNum!=0){
+                   String sql="select unit_name from m_classifcation where id="+unitNameNum;
+                   String unitName = jdbcTemplate.queryForObject(sql, new SingleColumnRowMapper<>(String.class));
+                   vo1.setUnitName(unitName);
+                   vo1.setUnitCount(1);
+               }else {
+                   return R.data(300,null,"该节点暂未设置单元工程名称");
+               }
+               //查询合格,优良,优良率
+                //查出当前节点下的单元工程施工质量验收评定表 后面需要改一下pid
+                List<WbsTreeContract> tables = wbsTreeContractClient.getTables(wbsTreeContract.getContractId(),wbsTreeContract.getPKeyId(),wbsTreeContract.getWbsId());
+                if(tables.size()>0){
+                    //评定节点
+                    WbsTreeContract nodeClass = tables.get(0);
+                    String elementSql = "SELECT * from m_wbs_form_element where f_id="+"(SELECT id from m_table_info Where tab_en_name=" + "'" + nodeClass.getInitTableName() + "')"+" and dynamic_dict=600";
+                    List<WbsFormElement> elements = jdbcTemplate.query(elementSql, new BeanPropertyRowMapper<>(WbsFormElement.class));
+                    String querySql = "select "+elements.get(0).getEKey()+" from " + nodeClass.getInitTableName() + " where p_key_id=" + nodeClass.getPKeyId();
+                    List<String> infos = jdbcTemplate.query(querySql, new SingleColumnRowMapper<>(String.class));
+                    String info="";
+                    if(!infos.isEmpty()){
+                        info = infos.get(0);
+                    }
+                    if(info!=null){
+                        if(info.indexOf("优良")>=0){
+                            vo1.setGoodCount(1);
+                            vo1.setPassCount(0);
+                            vo1.setGoodRate("100%");
+                        }else {
+                            vo1.setGoodCount(0);
+                            vo1.setPassCount(1);
+                            vo1.setGoodRate("0%");
+                        }
+                    }
+
+                }
+                voList.add(vo1);
+                return R.data(voList);
+            }
+            //如果点的不是工序,则需要先查出当前节点下的所有工序节点
+            List<WbsTreeContract> list = wbsTreeContractClient.getNodeTyp6(wbsTreeContract.getPKeyId());
+            if(list.size()>0){
+                Integer unitCount=0;
+                Integer passCount=0;
+                Integer goodCount=0;
+                for (WbsTreeContract contract : list) {
+                    NeiYeLedgerVO1 vo2 = new NeiYeLedgerVO1();
+                    BeanUtil.copyProperties(vo1,vo2);
+                    Integer unitNameNum=0;
+                    if(contract.getUnitName()!=null){
+                        unitNameNum=contract.getUnitName();
+                    }
+                    if(unitNameNum!=null&&unitNameNum!=0){
+                        String sql1="select unit_name from m_classifcation where id="+unitNameNum;
+                        String unitName = jdbcTemplate.queryForObject(sql1, new SingleColumnRowMapper<>(String.class));
+                        if (type==2){
+                            vo2.setUnitName(unitName);
+                            vo2.setUnitCount(1);
+                        }else {
+                            unitCount++;
+                        }
+
+                    }else {
+                        continue;
+                    }
+                    //查询合格,优良,优良率
+                    //查出当前节点下的单元工程施工质量验收评定表
+                    EKeyDto eKey = wbsTreeContractClient.getEKey(contract.getContractId(), contract.getPKeyId(), contract.getWbsId());
+    //                List<WbsTreeContract> tables = wbsTreeContractClient.getTables(contract.getContractId(),contract.getPKeyId(),contract.getWbsId());
+                    if(eKey!=null){
+                        //评定节点
+//                        WbsTreeContract nodeClass = tables.get(0);
+//                        String elementSql = "SELECT e_key from m_wbs_form_element where f_id="+"(SELECT id from m_table_info Where tab_en_name=" + "'" + nodeClass.getInitTableName() + "')"+" and dynamic_dict=600";
+//                        List<String> elements = jdbcTemplate.query(elementSql, new SingleColumnRowMapper<>(String.class));
+                        String querySql = "select "+eKey.getEKey()+" from " + eKey.getInitTableName() + " where p_key_id=" + eKey.getPKeyId();
+                        List<String> infos = jdbcTemplate.query(querySql, new SingleColumnRowMapper<>(String.class));
+                        String info="";
+                        if(!infos.isEmpty()){
+                            info = infos.get(0);
+                        }
+                        if(info!=null){
+                            if(info.indexOf("优良")>=0){
+                                if(type==2){
+                                    vo2.setGoodCount(1);
+                                    vo2.setPassCount(0);
+                                    vo2.setGoodRate("100%");
+                                }else {
+                                    goodCount++;
+                                }
+                            }else {
+                                if(type==2){
+                                    vo2.setGoodCount(0);
+                                    vo2.setPassCount(1);
+                                    vo2.setGoodRate("0%");
+                                }else {
+                                    passCount++;
+                                }
+                            }
+                        }
+                    }
+                    if(type==2){
+                        vo2.setId(SnowFlakeUtil.getId());
+                        voList.add(vo2);
+                    }
+                }
+                if(type==2){
+                    return R.data(voList);
+                }
+                else if(type==1){
+                    vo1.setUnitCount(unitCount);
+                    vo1.setGoodCount(goodCount);
+                    vo1.setPassCount(passCount);
+                    vo1.setGoodRate(calculatePercentage(goodCount,unitCount));
+                    vo1.setId(SnowFlakeUtil.getId());
+                    voList.add(vo1);
+                    return R.data(voList);
+                }
+            }
+        }
+        return R.data(300,null,"未查询到数据");
+    }
+
+    @SneakyThrows
+    @PostMapping ("/downloadNeiYe")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "客户端-下载元素表对应的excel模板")
+    public ResponseEntity<Resource> downloadNeiYe(@RequestBody List<NeiYeLedgerVO1> list, HttpServletResponse response){
+        String templatePath="/mnt/sdc/Users/hongchuangyanfa/Desktop/excel/neiye.xlsx";
+        //String templatePath="E:\\html\\neiye.xlsx";
+        // 1. 从服务器读取模板文件
+        InputStream templateStream = new FileInputStream(new File(templatePath));
+        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(templateStream);
+        Sheet sheet = workbook.getSheetAt(0);
+        // 3. 填充数据(假设数据从第2行开始填充)
+        int startRow = 1; // 第2行开始填充数据
+        for (int i = 0; i < list.size(); i++) {
+            Row row = sheet.createRow(startRow + i);
+            NeiYeLedgerVO1 vo1 = list.get(i);
+            // 填充各列数据
+            row.createCell(0).setCellValue(i + 1); // 序号
+            row.createCell(1).setCellValue(vo1.getClassName()); // 单位工程
+            row.createCell(2).setCellValue(vo1.getPartName()); // 分部工程
+            row.createCell(3).setCellValue(vo1.getSubPartName()); // 子分部工程
+            row.createCell(4).setCellValue(vo1.getUnitName()); // 单元工程
+            row.createCell(5).setCellValue(vo1.getUnitCount().toString()); // 单元工程个数
+            row.createCell(6).setCellValue(vo1.getPassCount().toString()); // 合格个数
+            row.createCell(7).setCellValue(vo1.getGoodCount().toString()); // 优良个数
+            row.createCell(8).setCellValue(vo1.getGoodRate()); // 优良率
+        }
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        workbook.write(outputStream);
+        workbook.close();
+        ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray());
+
+        return ResponseEntity.ok()
+            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=neiye.xlsx")
+            .contentType(MediaType.APPLICATION_OCTET_STREAM)
+            .contentLength(resource.contentLength())
+            .body(resource);
+    }
+
+    public static String calculatePercentage(Integer numerator, Integer denominator) {
+        if (denominator == null || denominator == 0) {
+            return "0%";
+        }
+        double percentage = (numerator.doubleValue() / denominator) * 100;
+        return String.format("%.0f%%", percentage); // 不带小数
+        // 或者 String.format("%.1f%%", percentage); // 带一位小数
+        // 或者 String.format("%.2f%%", percentage); // 带两位小数
+    }
+
     /**
      * 递归获取父节点信息
      *

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

@@ -1284,7 +1284,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
 
     public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
         String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
-        if (StringUtils.isNotEmpty(pdfURL) && !pdfURL.equals("500")) {
+        if (StringUtils.isNotEmpty(pdfURL) && !pdfURL.startsWith("500")) {
             String file_path = FileUtils.getSysLocalFileUrl();
             Long snowId = SnowFlakeUtil.getId();
             String listPdf = file_path + "/pdf/" + snowId + ".pdf";
@@ -1321,8 +1321,9 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (ObjectUtil.isNotEmpty(updateSql)) {
                 jdbcTemplate.execute(updateSql);
             }
-        } else if (pdfURL.equals("500")) {
-            throw new ServiceException("试验填报保存操作失败");
+        } else if (pdfURL!=null&&pdfURL.startsWith("500")) {
+            pdfURL=pdfURL.substring(3);
+            throw new ServiceException(pdfURL);
         }
     }
 

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

@@ -694,7 +694,7 @@ public class EVDataServiceImpl implements EVDataService {
 
         Object[] result = null;
         String fileUrl = pdfUrl;
-        if (list.size() >= 1000 || fileByte.length > 1000 * 1000 * 1000) {
+        if (list.size() >= 10 || fileByte.length > 10 * 1000 * 1000) {
             String inUrl = "/inp/" + DateUtil.today();
             String outUrl = "/out/" + DateUtil.today();
             SignFtpUtil.FTPCreateDir(inUrl);

+ 8 - 8
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -852,9 +852,9 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
-                SIGN_HOST = "219.151.181.43";
+                SIGN_HOST = "113.250.191.113";
             }
-            SIGN_HOST = "219.151.181.43";
+            SIGN_HOST = "113.250.191.113";
             System.out.println("电签Ip===:" + SIGN_HOST);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 24000000, 81000000);
             System.out.println("paperlessClient创建成功");
@@ -1058,7 +1058,7 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
-                SIGN_HOST = "219.151.181.43";
+                SIGN_HOST = "113.250.191.113";
             }
             System.out.println("电签Ip===:" + SIGN_HOST);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 240000000, 810000000);
@@ -1317,7 +1317,7 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
-                SIGN_HOST = "219.151.181.43";
+                SIGN_HOST = "113.250.191.113";
             }
             System.out.println("电签Ip===:" + SIGN_HOST);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 240000000, 810000000);
@@ -1396,7 +1396,7 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
-                SIGN_HOST = "219.151.181.43";
+                SIGN_HOST = "113.250.191.113";
             }
             System.out.println("电签Ip===:" + SIGN_HOST);
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 240000000, 810000000);
@@ -1681,7 +1681,7 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
-                SIGN_HOST = "219.151.181.43";
+                SIGN_HOST = "113.250.191.113";
             }
             PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 240000000, 810000000);
             paperlessClient.setSSL(false);
@@ -1708,7 +1708,7 @@ public class EVisaServiceImpl implements EVisaService {
             List<PdfBean> pdfBeans = new ArrayList<>();
             PdfBean pdfBean = new PdfBean();
             pdfBean.setBizSerialNo(GUIDUtil.generateId());
-            pdfBean.setInputSource("/mnt/sdc/signInfo" + loPdfurl);
+            pdfBean.setInputSource("/data/sdc/signInfo" + loPdfurl);
             pdfBean.setInputType(BaseConstants.INPUT_TYPE_FILEPATH);
             pdfBeans.add(pdfBean);
             requestBody.setPdfBeans(pdfBeans);
@@ -1721,7 +1721,7 @@ public class EVisaServiceImpl implements EVisaService {
             requestBody.setSealStrategies(sealStrategies);
 
             //签章后文件保存地址,不为空时,直接将签章文件保存在此地址,不再返回签章后文档数据;ftp:auto
-            requestBody.setOutputFilepath("/mnt/sdc/signInfo" + outPdfUrl);
+            requestBody.setOutputFilepath("/data/sdc/signInfo" + outPdfUrl);
 
             //时间戳方式,默认为0;0:实时访问CFCA 时间戳服务;1:使用从CFCA购置并在本地部署的时间戳服务器产品;
             requestBody.setTimestampChannel(BaseConstants.TIME_STAMP_CHANNEL_CFCA);

+ 6 - 8
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtil.java

@@ -16,8 +16,8 @@ public class SignFtpUtil {
     private static final int PORT = 6233 ;
     private static final String USER = "signAdmin";
     private static final String PASS = "123456";
-    private static final int CONNECT_TIMEOUT = 900000; // 30秒
-    private static final int DATA_TIMEOUT = 90000; // 30秒
+    private static final int CONNECT_TIMEOUT = 9000000; // 30秒
+    private static final int DATA_TIMEOUT = 900000; // 30秒
 
     /**
      *  获取ftp 客户端
@@ -34,7 +34,7 @@ public class SignFtpUtil {
             // 连接到FTP服务器
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()){
-                SERVER = "219.151.185.227";
+                SERVER = "113.250.191.113";
             }
             System.out.println("ftp上传ip地址:"+SERVER);
             ftp.connect(SERVER, PORT);
@@ -231,9 +231,7 @@ public class SignFtpUtil {
         }
     }
 
-/*    public static void main(String[] args) {
-        String inUrl = "/inp/" + DateUtil.today();
-        System.out.println(inUrl);
-        FTPCreateDir(inUrl);
-    }*/
+
+
+
 }

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

@@ -36,6 +36,7 @@ import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.RandomNumberHolder;
 import org.springblade.manager.vo.TrialSelfDataRecordVO1;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -88,6 +89,8 @@ public class ExcelTabClientImpl implements ExcelTabClient {
 
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoListTrial(dataArray, tabIds);
         try {
+            //试验特殊处理
+            RandomNumberHolder.setTrialSelfInspectionRecordGroupId(dto.getId());
             //------公式填充------
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId), ExecuteType.TESTING);
 
@@ -100,11 +103,13 @@ public class ExcelTabClientImpl implements ExcelTabClient {
             this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
         } catch (RuntimeException e){
             e.printStackTrace();
-            throw new RuntimeException("字段过长,操作失败");
+            pdfUrl=e.getMessage();
+            return pdfUrl;
         }
         catch (Exception e) {
             e.printStackTrace();
-            throw new RuntimeException("试验填报数据保存异常,操作失败");
+            pdfUrl=e.getMessage();
+            return pdfUrl;
         }
         try {
             if (isBatchSave == 0) {

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
+import org.springblade.business.dto.EKeyDto;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
@@ -46,6 +47,11 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     private final JdbcTemplate jdbcTemplate;
 
+    @Override
+    public List<WbsTreeContract> getTables(String contractId, Long id, String wbsId) {
+        return wbsTreeContractMapper.getTables(contractId, id, wbsId);
+    }
+
     @Override
     public WbsTreeContract queryContractTreeNodeByPKeyId(Long toCopyNodePKeyId) {
         return this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, toCopyNodePKeyId));
@@ -459,5 +465,31 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
         return vos;
     }
 
+    @Override
+    public WbsTreeContract getById(Long pkeyId) {
+        WbsTreeContract wbsTreeContract = wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+        return wbsTreeContract;
+    }
+
+    @Override
+    public List<WbsTreeContract> getAncestors(String ancestors) {
+        List<WbsTreeContract> list=new ArrayList<>();
+        if(StringUtils.isNotEmpty(ancestors)){
+            String[] split = ancestors.split(",");
+            list=wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getPKeyId,Arrays.asList(split)));
+        }
+        return list;
+    }
+
+    @Override
+    public List<WbsTreeContract> getNodeTyp6(Long pKeyId) {
+        return wbsTreeContractService.getNodeTyp6(pKeyId);
+    }
+
+    @Override
+    public EKeyDto getEKey(String contractId, Long pKeyId, String wbsId) {
+        return wbsTreeContractService.getEKey(contractId,pKeyId,wbsId);
+    }
+
 
 }

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -27,6 +27,7 @@ import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springblade.manager.vo.WbsTreePrivateVO4;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
@@ -320,6 +321,13 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         return R.data(wbsTreePrivateVO4s);
     }
 
+    @Override
+    public WbsTreePrivate getNodeClass(Long isTypePrivatePid) {
+        return   wbsTreePrivateService.getById(isTypePrivatePid);
+    }
+
+
+
     private void foreachSetChildList(List<WbsTreeContractTreeVOS> vosResult, List<WbsTreePrivateVO> voList) {
         voList.forEach(wbsTreePrivateVO -> {
             WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();

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

@@ -1,6 +1,7 @@
 package org.springblade.manager.mapper;
 
 import org.apache.ibatis.annotations.Param;
+import org.springblade.business.dto.EKeyDto;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.injector.EasyBaseMapper;
@@ -127,4 +128,10 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
      * @param allNodes
      */
     void updateBatchAncestorsByPKeyId(@Param("allNodes") List<WbsTreeContract> allNodes);
+
+    List<WbsTreeContract> getTables(@Param("contractId") String contractId, @Param("id") Long id, @Param("wbsId") String wbsId);
+
+    List<WbsTreeContract> getNodeTyp6(@Param("pKeyId") Long pkeyId);
+
+    EKeyDto getEKey(@Param("contractId") String contractId, @Param("pKeyId") Long pKeyId, @Param("wbsId") String wbsId);
 }

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

@@ -909,4 +909,23 @@
             </foreach>
             ) and pdf_url is not null and pdf_url != '' and (table_owner = 4 or table_owner = 5 or table_owner = 6) and is_deleted = 0
     </select>
+    <select id="getTables" resultType="org.springblade.manager.entity.WbsTreeContract">
+        Select p_key_id, init_table_name from m_wbs_tree_contract where contract_id=#{contractId} and p_id=#{id} and wbs_id=#{wbsId} and is_deleted = 0
+        and node_name like '%单元工程施工质量验收评定表'
+    </select>
+
+    <select id="getNodeTyp6" resultType="org.springblade.manager.entity.WbsTreeContract">
+        select p_key_id,wbs_id,contract_id,unit_name from m_wbs_tree_contract where unit_name is not null and FIND_IN_SET(#{pKeyId},ancestors_p_id)>0 and node_type=6 and is_deleted=0
+    </select>
+    <select id="getEKey" resultType="org.springblade.business.dto.EKeyDto">
+        SELECT fe.e_key ,wtc.init_table_name,wtc.p_key_id
+        FROM m_wbs_tree_contract wtc
+                 JOIN m_table_info ti ON wtc.init_table_name = ti.tab_en_name
+                 JOIN m_wbs_form_element fe ON ti.id = fe.f_id AND fe.dynamic_dict = 600
+        WHERE wtc.contract_id = #{contractId}
+          AND wtc.p_id = #{pKeyId}
+          AND wtc.wbs_id = #{wbsId}
+          AND wtc.is_deleted = 0;
+    </select>
+
 </mapper>

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

@@ -143,4 +143,5 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
      * @param allNodes
      */
     void updateBatchAncestorsByPKeyId(@Param("allNodes") List<WbsTreePrivate> allNodes);
+
 }

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

@@ -1,5 +1,6 @@
 package org.springblade.manager.service;
 
+import org.springblade.business.dto.EKeyDto;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.RangeInfo;
@@ -84,4 +85,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     R importTree(MultipartFile file, Long pkeyId) throws IOException;
 
+    List<WbsTreeContract> getNodeTyp6(Long pKeyId);
+
+    EKeyDto getEKey(String contractId, Long pKeyId, String wbsId);
 }

+ 29 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -64,7 +64,9 @@ import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.ExcelTabMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.PdfAddContextUtils;
 import org.springblade.manager.utils.PdfAddimgUtil;
+import org.springblade.manager.utils.RandomNumberHolder;
 import org.springblade.manager.vo.*;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
@@ -443,6 +445,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         } else {
                             tec.getLog().put(FormulaLog.OTHER, "没有执行任何公式");
                         }
+                        RandomNumberHolder.clearTrialSelfInspectionRecordGroupId();
                         stopWatch.stop();
                         long totalTime = stopWatch.getTotalTimeMillis();
                         log.put(FormulaLog.PF, "公式执行消耗时间:" + (double) totalTime / 1000 + "秒");
@@ -3063,7 +3066,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         return list;
     }
 
-    private void  tableContextReplace(org.apache.poi.ss.usermodel.Workbook workbook, String oldContext, String newContext){
+    private boolean  tableContextReplace(org.apache.poi.ss.usermodel.Workbook workbook, String oldContext, String newContext){
         Sheet sheet = workbook.getSheetAt(0);
         sheet.setForceFormulaRecalculation(true);
         int rowNum = sheet.getLastRowNum();
@@ -3076,15 +3079,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     if (cell != null) {
                         String cellValue = cell.getStringCellValue();
                         if (cellValue != null && !cellValue.isEmpty()) {
-                            if (cellValue.equals(oldContext)) {
+                            if (cellValue.contains(oldContext)) {
                                 cell.setCellValue(newContext);
-                                return;
+                                return true;
                             }
                         }
                     }
                 }
             }
         }
+        return false;
     }
 
     /**
@@ -3135,9 +3139,23 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (pageNumber != 0 && pageNumberCount != 0) {
             header.setRight("第" + pageNumber + "页,共" + pageNumberCount + "页");
         }
+        String excelTitle = "";
+        String context = "";
+        boolean isAddContext = false;
         // 处理重庆乌江白马航电枢纽工程第三方试验检测项目部 受控号
-        if (contractId.equals("1815659357889708033")) {
-            tableContextReplace(workbook, "受控号:TDJL2704", "受控号:ZNJC/QR34-07-2024");
+        String tableType = dto.getTableType();
+        if ((contractId.equals("1815659357889708033") || contractId.equals("1612335077269143554")) && (tableType != null && tableType.contains("2")) ) {
+            if (contractId.equals("1815659357889708033")) {
+                context = "受控号:ZNJC/QR34-07-2024";
+            } else  {
+                context = "受控号:TDJL2704";
+            }
+            isAddContext = !tableContextReplace(workbook, "受控号:", context);
+            if (isAddContext) {
+                excelTitle = PdfAddContextUtils.getExcelFullTitle(workbook, excelTab.getName());
+            }
+        } else {
+            tableContextReplace(workbook, "受控号:", "");
         }
 
         //标题Title
@@ -3385,6 +3403,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
         FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
+        if (isAddContext && !excelTitle.isEmpty()) {
+            String pdfTempPath = file_path + "/pdf//temp" + pkeyId + ".pdf";
+            PdfAddContextUtils.addContextByTitle(pdfPath, pdfTempPath, excelTitle, context, 8);
+            pdfPath = pdfTempPath;
+        }
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
 
         if (bladeFile != null) {
@@ -3577,8 +3600,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 } catch (Exception e) {
                     //回滚
                     transactionManager1.rollback(transactionStatus);
-
-                    throw new RuntimeException("字段过长,新增失败");
+                    throw new RuntimeException("500"+e.getCause().getMessage()+"  字段过长,新增失败");
                 }
             }
         }

+ 22 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -53,6 +53,7 @@ import org.springblade.manager.service.*;
 import org.springblade.manager.utils.AmountToChineseConverter;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.PeriodContractUtil;
+import org.springblade.manager.utils.RandomNumberHolder;
 import org.springblade.manager.vo.*;
 import org.springblade.meter.entity.*;
 import org.springblade.meter.feign.*;
@@ -1180,15 +1181,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             checkTable = op.get().getInitTableName();
         }
         for (FormData fd : tec.formDataList) {
-            if(fd.getCode().equals("m_20240124150022_1750050896693166080:key_42")){
-                System.out.println(111);
-            }
             if (fd.verify()) {
+                if(fd.getCode().equals("m_20240313110033_1767747549965320192:key_34")){
+                    System.out.println("111");
+                }
                 Formula formula = fd.getFormula();
                 System.out.println(formula.getId() + ":" + fd.getEName());
-                if (fd.getId() == 1575046319821553669L) {
-                    System.out.println("");
-                }
                 String f = formula.getFormula();
                 if (Func.isNotBlank(f)) {
                     try {
@@ -1203,7 +1201,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             relyList.forEach(rely -> {
                                 FormData formData = tec.getFormDataMap().get(rely);
                                 /*TODO,这里的判断还需要优化,比如加减法公式,即使某个依赖元素不存在内容却可以视为0,也算是合法的执行条件*/
-                                if (formData != null && !formData.empty() || "m_20231027094746_1717719707244560384:key_11".equals(fd.getCode())) {
+                                if (formData != null && !formData.empty() || "m_20231027094746_1717719707244560384:key_11".equals(fd.getCode())||fd.getCode().equals("m_20240313110817_1767749493136031744:key_32")||fd.getCode().equals("m_20240313110033_1767747549965320192:key_34")) {
                                     ele.add(formData);
                                 }
                             });
@@ -1263,6 +1261,23 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                         }
                                     }
                                 }
+                                //专门用来做试验的处理 水泥报告单的检测依据
+                                if(fd.getCode().equals("m_20240313110817_1767749493136031744:key_32")||fd.getCode().equals("m_20240313110033_1767747549965320192:key_34")){
+                                    Long groupId = RandomNumberHolder.getTrialSelfInspectionRecordGroupId();
+                                    if(fd.getFormula().getRely()!=null){
+                                        String rely = fd.getFormula().getRely();
+                                        String[] strings = rely.split(":");
+                                        String tabName=strings[0];
+                                        List<NodeTable> collect = tec.getTableAll().stream().filter(e -> e.getInitTableName().equals(tabName)).collect(Collectors.toList());
+                                        if(collect.size()>0){
+                                            String sql="select "+strings[1]+" from "+strings[0]+ " where p_key_id="+collect.get(0).getPKeyId()+" and group_id="+groupId;
+                                            data = jdbcTemplate.queryForObject(sql, new SingleColumnRowMapper<>(String.class));
+                                            if(data!=null){
+                                                data=((String) data).substring(0,((String) data).indexOf("_^_"));
+                                            }
+                                        }
+                                    }
+                                }
                                 write(tec, fd, data);
                             }
                             /*错位计算偏移量重置*/

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

@@ -27,6 +27,7 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springblade.business.dto.EKeyDto;
 import org.springblade.business.dto.ImportTreeDto;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.entity.InformationQuery;
@@ -2669,6 +2670,16 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return R.success("新增了"+insertList.size()+"个节点"+","+String.join(",",updateList)+"节点编号已被修改");
     }
 
+    @Override
+    public List<WbsTreeContract> getNodeTyp6(Long pKeyId) {
+        return baseMapper.getNodeTyp6(pKeyId);
+    }
+
+    @Override
+    public EKeyDto getEKey(String contractId, Long pKeyId, String wbsId) {
+        return baseMapper.getEKey(contractId,pKeyId,wbsId);
+    }
+
     /**
      * 展开所有合并单元格并将值填充到每个单元格
      * @param sheet Excel工作表

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

@@ -3189,6 +3189,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return vo;
     }
 
+
+
     public List<WbsTreePrivate> findAllContract(WbsTreePrivate wbsTreePrivate) {
         QueryWrapper<WbsTreePrivate> wbsTreeContractQueryWrapper = new QueryWrapper<>();
         wbsTreeContractQueryWrapper.select("p_key_id", "id", "p_id", "wbs_id", "project_id", "parent_id", "ancestors");

+ 286 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddContextUtils.java

@@ -0,0 +1,286 @@
+package org.springblade.manager.utils;
+
+
+import com.itextpdf.awt.geom.Rectangle2D;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfStamper;
+import com.itextpdf.text.pdf.parser.ImageRenderInfo;
+import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
+import com.itextpdf.text.pdf.parser.RenderListener;
+import com.itextpdf.text.pdf.parser.TextRenderInfo;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import  org.apache.poi.ss.usermodel.Sheet;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PdfAddContextUtils {
+    public static void main(String[] args) throws IOException, DocumentException {
+        String src = "C:\\Users\\泓创02\\Downloads\\抗弯拉检测报告.pdf"; // 输入PDF文件路径
+        String dest = "C:\\Users\\泓创02\\Downloads\\抗弯拉检测报告1.pdf"; // 输出PDF文件路径
+        String title = "水泥混凝土抗弯拉强度试验检测报告"; // 要查找的标题文本
+        String signature = "受控号:123456"; // 要添加的署名文本
+
+        addContextByTitle(src, dest, title, signature,  10);
+    }
+
+    public static void addContextByTitle(String src, String dest, String title, String context,  int fontSize) throws IOException, DocumentException {
+
+        File pdfFile = new File(src);
+        byte[] pdfData = new byte[(int) pdfFile.length()];
+        FileInputStream inputStream = null;
+        try {
+            inputStream = new FileInputStream(pdfFile);
+            inputStream.read(pdfData);
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    inputStream.close();
+                }
+            }
+        }
+        // 读取PDF文件
+        PdfReader reader = new PdfReader(src);
+        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
+        MatchItem keyWords = getKeyWords(reader, title);
+        if(keyWords != null) {
+            Rectangle pageSize = reader.getPageSize(1);
+            float height = pageSize.getHeight();
+            float width = pageSize.getWidth();
+            System.out.println("width = "+width+", height = "+height);
+            System.out.println("keyWords.toString() = " + keyWords);
+            double v = width - keyWords.getX() - context.length() * fontSize;
+            addContext(stamper, keyWords.getPageNum(), keyWords.getX() + (float) v, keyWords.getY(), context, fontSize);
+        }
+        // 关闭PdfStamper和PdfReader
+        stamper.close();
+        reader.close();
+    }
+
+
+    public static String getExcelFullTitle(org.apache.poi.ss.usermodel.Workbook workbook, String title) {
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+        int rowNum = sheet.getLastRowNum();
+        for (int i = 0; i < rowNum; i++) {
+            Row row = sheet.getRow(i);
+            if (row != null) {
+                short cellNum = row.getLastCellNum();
+                for (int j = 0; j < cellNum; j++) {
+                    Cell cell = row.getCell(j);
+                    if (cell != null) {
+                        String cellValue = cell.getStringCellValue();
+                        if (cellValue != null && !cellValue.isEmpty()) {
+                            if (containsAllCharactersInOrder(cellValue, title)) {
+                                return cellValue;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+
+    public static boolean containsAllCharactersInOrder(String str, String str1) {
+        if (str1.length() > str.length()) {
+            return false;
+        }
+        int str1Index = 0; // 指向 str1 的指针
+        for (int i = 0; i < str.length(); i++) {
+            if (str.charAt(i) == str1.charAt(str1Index)) {
+                str1Index++;
+                if (str1Index == str1.length()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @Description 获取关键字所在PDF坐标
+     * @param pdfReader
+     * @param keyWords
+     * @return float[]
+     */
+    public static MatchItem getKeyWords(PdfReader pdfReader, String keyWords) {
+        int page = 0;
+        try{
+            int pageNum = pdfReader.getNumberOfPages();
+            PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
+            CustomRenderListener renderListener = new CustomRenderListener();
+            renderListener.setKeyWord(keyWords);
+            StringBuilder allText = null;
+            for (page = 1; page <= pageNum; page++) {
+                renderListener.setPage(page);
+                pdfReaderContentParser.processContent(page, renderListener);
+                List<MatchItem> matchItems = renderListener.getMatchItems();
+                if(matchItems != null && matchItems.size() > 0) {
+                    //完全匹配
+                    return matchItems.get(0);
+                }
+                List<MatchItem> allItems = renderListener.getAllItems();
+                allText = new StringBuilder();
+                for (MatchItem item : allItems) {
+                    allText.append(item.getContent());
+                    //关键字存在连续多个块中
+                    if(allText.indexOf(keyWords) != -1) {
+                        return item;
+                    }
+                }
+
+
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+
+    private static void addContext(PdfStamper stamper, int page, float x, float y, String signature, int fontSize) throws IOException, DocumentException {
+        PdfContentByte overContent = stamper.getOverContent(page);
+        // 设置中文字体
+        BaseFont baseFont = BaseFont.createFont("simsun.ttc,0", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
+        overContent.beginText();
+        overContent.setFontAndSize(baseFont, fontSize);
+        overContent.setTextMatrix(x, y);
+        overContent.showText(signature);
+        overContent.endText();
+    }
+
+    public static class MatchItem {
+        private String content;
+        private int pageNum;
+        private float x;
+        private float y;
+
+        public String getContent() {
+            return content;
+        }
+
+        public void setContent(String content) {
+            this.content = content;
+        }
+
+        public int getPageNum() {
+            return pageNum;
+        }
+
+        public void setPageNum(int pageNum) {
+            this.pageNum = pageNum;
+        }
+
+        public float getX() {
+            return x;
+        }
+
+        public void setX(float x) {
+            this.x = x;
+        }
+
+        public float getY() {
+            return y;
+        }
+
+        public void setY(float y) {
+            this.y = y;
+        }
+
+        public String toString() {
+            return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y
+                    + "]";
+        }
+    }
+    public static class CustomRenderListener implements RenderListener {
+
+        /**定位坐标的关键字*/
+        private String keyWord;
+        /**关键字所在的页数*/
+        private int page;
+        //所有匹配的项
+        private List<MatchItem> matchItems = new ArrayList<>();
+        //所有项
+        private List<MatchItem> allItems = new ArrayList<>();
+
+        public String getKeyWord() {
+            return keyWord;
+        }
+
+        public void setKeyWord(String keyWord) {
+            this.keyWord = keyWord;
+        }
+
+        public int getPage() {
+            return page;
+        }
+
+        public void setPage(int page) {
+            this.page = page;
+        }
+
+        public List<MatchItem> getMatchItems() {
+            return matchItems;
+        }
+
+        public void setMatchItems(List<MatchItem> matchItems) {
+            this.matchItems = matchItems;
+        }
+
+        public List<MatchItem> getAllItems() {
+            return allItems;
+        }
+
+        public void setAllItems(List<MatchItem> allItems) {
+            this.allItems = allItems;
+        }
+
+        @Override
+        public void beginTextBlock() {
+
+        }
+
+        @Override
+        public void renderText(TextRenderInfo textRenderInfo) {
+            String text = textRenderInfo.getText();
+            Rectangle2D.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();
+            MatchItem matchItem = new MatchItem();
+            matchItem.setContent(text);
+            matchItem.setPageNum(page);
+            matchItem.setX(boundingRectange.x);
+            matchItem.setY(boundingRectange.y);
+            if (null != text && !" ".equals(text)) {
+                if(text.equalsIgnoreCase(keyWord)) {
+                    matchItems.add(matchItem);
+                }
+            }
+            allItems.add(matchItem);
+        }
+
+        @Override
+        public void endTextBlock() {
+
+        }
+
+        @Override
+        public void renderImage(ImageRenderInfo imageRenderInfo) {
+
+        }
+    }
+}

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/RandomNumberHolder.java

@@ -9,6 +9,7 @@ public class RandomNumberHolder {
         private static final ThreadLocal<HashMap<Long,String>> randomNumberThreadLocal = new ThreadLocal<>();
         private static final ThreadLocal<Integer> randomTemplateTypeThreadLocal = new ThreadLocal<>();
         private static final ThreadLocal<List<WbsTreeContract>> randomWbsTreeContractThreadLocal = new ThreadLocal<>();
+    private static final ThreadLocal<Long> randomTrialSelfInspectionRecordGroupId = new ThreadLocal<>();
 
     public static void setRandomNumber(HashMap<Long,String> map) {
         randomNumberThreadLocal.set(map);
@@ -46,5 +47,15 @@ public class RandomNumberHolder {
     public static void RandomWbsTreeContractclear() {
         randomWbsTreeContractThreadLocal.remove();
     }
+
+    public static void setTrialSelfInspectionRecordGroupId(Long id) {
+        randomTrialSelfInspectionRecordGroupId.set(id);
+    }
+    public static Long getTrialSelfInspectionRecordGroupId() {
+      return   randomTrialSelfInspectionRecordGroupId.get();
+    }
+    public static void clearTrialSelfInspectionRecordGroupId() {
+        randomTrialSelfInspectionRecordGroupId.remove();
+    }
 }
 

BIN
blade-service/blade-manager/src/main/resources/simsun.ttc


+ 0 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -810,7 +810,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                 }
                             }
                             for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
-                                lazyNodeVO.setType(lazyNodeVO.getNodeType());
                                 lazyNodeVO.setNotExsitChild(!lazyNodeVO.getHasChildren().equals(1));
                                 lazyNodeVO.setPrimaryKeyId(lazyNodeVO.getPKeyId());
                                 if (lazyNodeVO.getParentId() == 0L) {

+ 1 - 0
pom.xml

@@ -118,6 +118,7 @@
                     <configuration>
                         <fork>true</fork>
                         <finalName>${project.build.finalName}</finalName>
+                        <includeSystemScope>true</includeSystemScope>
                     </configuration>
                     <executions>
                         <execution>