Эх сурвалжийг харах

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into feature-lihb-20251015-testCyInfo

LHB 2 өдөр өмнө
parent
commit
533e90ac6d
36 өөрчлөгдсөн 838 нэмэгдсэн , 129 устгасан
  1. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordDTO.java
  2. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  3. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExctabCell.java
  4. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialSummaryClassificationConfiguration.java
  5. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsFormElement.java
  6. 6 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/enums/ExecuteType.java
  7. 3 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  8. 80 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialTableDataInfo.java
  9. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateTableVO.java
  10. 18 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  11. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/FixedFlowController.java
  12. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  13. 20 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  14. 170 92
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSummaryController.java
  15. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  16. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  17. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java
  18. 130 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  19. 25 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  20. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExctabCellController.java
  21. 29 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialSummaryClassificationConfigurationController.java
  22. 72 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java
  23. 40 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  24. 17 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  25. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  26. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  27. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java
  28. 17 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  29. 23 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  30. 23 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  31. 5 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ComplexStringComparator.java
  32. 77 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/StringCNUtils.java
  33. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MaterialStartStatementMapper.xml
  34. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml
  35. 4 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java
  36. 3 3
      blade-service/blade-user/src/main/java/org/springblade/system/user/util/ComplexStringComparator.java

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordDTO.java

@@ -17,7 +17,7 @@ public class TrialSummaryRecordDTO implements Serializable {
     @ApiModelProperty(value = "检测类型")
     private Integer detectionType;
 
-    @ApiModelProperty(value = "单位类型")
+    @ApiModelProperty(value = "单位类型, 1施工,2监理,3业主")
     private Integer unitType;
 
     @ApiModelProperty(value = "汇总开始时间,格式yyyy-MM-dd")

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -42,6 +42,10 @@ public interface ArchiveFileClient {
     @PostMapping(API_PREFIX + "/updateArchiveFileSort")
     void updateArchiveFileSort(@RequestBody ArchiveFileVO vo);
 
+    //只修改实体数据
+    @PostMapping(API_PREFIX + "/batchUpdateInfo")
+    void batchUpdateInfo(@RequestBody ArchiveFileVO vo);
+
     @PostMapping(API_PREFIX + "/updateArchiveFileByBoxName")
     boolean updateArchiveFileByBoxName(@RequestBody Map<String, Object> jsons);
 

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

@@ -80,4 +80,10 @@ public class ExctabCell extends BaseEntity {
      */
     private String textDeviation;
 
+    /**
+     * exid
+     */
+    @ApiModelProperty(value = "exid")
+    private Long exid;
+
 }

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

@@ -32,4 +32,7 @@ public class TrialSummaryClassificationConfiguration extends BaseEntity {
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
+    @ApiModelProperty(value = "项目类型,0:公路工程, 1:水利工程")
+    private Integer projectType;
+
 }

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

@@ -71,4 +71,10 @@ public class WbsFormElement extends BaseEntity {
     @ApiModelProperty(value = "动态字典,征拆统计")
     @JsonProperty(value = "dynamicDict")
     private Integer dynamicDict;
+
+    /**
+     * exid
+     */
+    @ApiModelProperty(value = "exid")
+    private Long exid;
 }

+ 6 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/enums/ExecuteType.java

@@ -12,10 +12,15 @@ import lombok.Getter;
 public enum ExecuteType {
     /*Quality Inspection (质量检查)*/
     INSPECTION("质检", 0),
+
     /*Material Testing (材料试验) */
     TESTING("试验", 1),
+
     /*First Article 首件*/
-    FAI("首件", 2);
+    FAI("首件", 2),
+
+    /*log info 日志*/
+    LOGINFO("日志", 3);
     final String name;
     final int mode;
 }

+ 3 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java

@@ -51,7 +51,7 @@ public interface WbsTreePrivateClient {
     List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
 
     @PostMapping(API_PREFIX + "/copyBussTab")
-    boolean copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id, @RequestParam Long contractId);
+    Long copyBussTab(@RequestParam Long pKeyId, @RequestParam Long id, @RequestParam Long contractId, @RequestParam(required = false) String tableIds);
 
     @PostMapping(API_PREFIX + "/getRawMaterialTree")
     List<WbsTreePrivateVO> getRawMaterialTree(@RequestParam Long pKeyId);
@@ -88,5 +88,6 @@ public interface WbsTreePrivateClient {
     @GetMapping(API_PREFIX +"/get-node-class")
     WbsTreePrivate getNodeClass(@RequestParam Long isTypePrivatePid);
 
-
+    @PostMapping(API_PREFIX + "/testFormInit")
+    List<Long> testFormInit(@RequestParam Long projectId, @RequestParam Long contractId, @RequestParam String wbsId, @RequestParam Long id);
 }

+ 80 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TrialTableDataInfo.java

@@ -0,0 +1,80 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.Getter;
+import org.springblade.manager.entity.WbsFormElement;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+@Data
+public class TrialTableDataInfo implements java.io.Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String ID="203700000001";
+    public static final Long LONG_ID=203700000001L;
+    public static final String TBN="TrialTableDataInfo";
+    public static final String TBN_CH="试验表格数据";
+    static final String UNKNOWN="未设置";
+
+    public static List<WbsFormElement> getElementList() {
+        TrialTableElementEnum[] values = TrialTableElementEnum.values();
+        List<WbsFormElement> result = new ArrayList<>();
+        for (TrialTableElementEnum value : values) {
+            WbsFormElement element = new WbsFormElement();
+            element.setId(value.id);
+            element.setEKey(value.key);
+            element.setEName(value.cnName);
+            element.setEType(1);
+            element.setELength(200);
+            element.setIsDeleted(0);
+            element.setStatus(1);
+            result.add(element);
+        }
+        return result;
+    }
+
+    public static String getElementName(String key) {
+        TrialTableElementEnum[] values = TrialTableElementEnum.values();
+        for (TrialTableElementEnum value : values) {
+            if (value.key.equals(key)) {
+                return value.cnName;
+            }
+        }
+        return UNKNOWN;
+    }
+
+    @Getter
+    public static enum TrialTableElementEnum {
+        RECORD_NO(203700000001001L, "key_301","recordNo", "记录编号"),
+        REPORT_NO(203700000001002L, "key_302","reportNo", "报告编号"),
+        ENTRUST_NO(203700000001003L, "key_303","entrustNo", "委托单编号"),
+        SPECIFICATION_NUMBER(203700000001004L, "key_304","specificationNumber", "样品编号"),
+        TRIAL_PROJECT_NAME(203700000001005L, "key_305","trialProjectName", "试验项目名称"),
+        TASK_STATUS(203700000001006L, "key_306","taskStatus", "任务状态"),
+        REPORT_DATE(203700000001007L, "key_307","reportDate", "报告日期"),
+        TRIAL_USER_NAME(203700000001008L, "key_308","trialUserName", "试验人员"),
+        DETECTION_CATEGORY(203700000001009L, "key_309","detectionCategory", "检测类别"),
+        SPECIFICATION_MODEL(203700000001010L, "key_310","specificationModel", "规格类型"),
+        PROJECT_POSITION(203700000001011L, "key_311","projectPosition", "工程部位及用途"),
+        SAMPLING_LOCATION(203700000001012L, "key_312","samplingLocation", "取样地点"),
+        IS_UPLOAD_CERTIFICATE(203700000001013L, "key_313","isUploadCertificate", "是否上传合格证"),
+        ENTRUST_NAME(203700000001014L, "key_314","entrustName", "委托单名称"),
+        CONTRACT_NAME(203700000001015L, "key_315","contractName", "合同段"),
+        COMPANY(203700000001016L, "key_316","company", "单位"),
+        DETECTION_RESULT(203700000001017L, "key_317","detectionResult", "检测结果"),
+        ;
+        private final Long id;
+        private final String key;
+        private final String enName;
+        private final String cnName;
+        TrialTableElementEnum(Long id, String key, String enName, String chName) {
+            this.id = id;
+            this.key = key;
+            this.cnName = chName;
+            this.enName = enName;
+        }
+    }
+}

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

@@ -25,6 +25,8 @@ public class WbsTreePrivateTableVO  implements Serializable {
     @ApiModelProperty(value = "表单list")
     List<WbsNodeTableVO> list;
 
+    private int sort;
+
     public WbsTreePrivateTableVO() {
     }
     public WbsTreePrivateTableVO(String title, List<WbsNodeTableVO> list) {

+ 18 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -367,7 +367,7 @@ public class ArchiveFileController extends BladeController {
     }
 
     /**
-     * 批量编辑
+     *
      */
     @PostMapping("/batchUpdate")
     @ApiOperationSupport(order = 13)
@@ -382,6 +382,23 @@ public class ArchiveFileController extends BladeController {
         return R.data(true);
     }
 
+    /**
+     * 批量编辑
+     */
+    @PostMapping("/batchUpdateInfo")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "修改基础信息")
+    public R<Boolean> batchUpdateInfo(@RequestBody ArchiveFileVO vo) {
+        try {
+            this.archiveFileClient.batchUpdateInfo(vo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.data(false);
+        }
+        return R.data(true);
+    }
+
+
     /**
      * 删除分盒
      */

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

@@ -592,7 +592,7 @@ public class FixedFlowController extends BladeController {
 //            resultMap.setRecords(newData);
             return R.data(resultMap);
         }
-        return R.fail("暂无数据");
+        return R.data(new Page<>());
     }
     @GetMapping("/getFixedFlow")
     @ApiOperationSupport(order = 25)

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

@@ -3631,6 +3631,8 @@ public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @Reques
                 throw new ServiceException("当前节点类型不能大于或等于父级节点类型");
             }
         }
+    }else {
+        node.setNodeType(nodeType);
     }
 
     WbsTreeContract queries = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(pKeyId);

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

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import cn.hutool.core.stream.CollectorUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -10,6 +11,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import jodd.util.StringUtil;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.springblade.business.dto.*;
@@ -25,6 +27,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.entity.ContractInfo;
@@ -232,7 +235,23 @@ public class TrialDetectionController extends BladeController {
             }
         } else {
             //编辑复制 复制数据 附件文件
-            if (wbsTreePrivateClient.copyBussTab(pKeyId, id, contractId)) {
+            //获取复制表的pkid
+
+            TrialSelfInspectionRecord byId = iTrialSelfInspectionRecordService.getById(id);
+            Long copyId = wbsTreePrivateClient.copyBussTab(pKeyId, id, contractId, byId.getTableIds());
+            if (copyId != null) {
+                if(StringUtils.isEmpty(byId.getTableIds())){
+                    //绑定初始表单
+                    WbsTreePrivate nodeByPrimaryKeyId = wbsTreePrivateClient.getNodeByPrimaryKeyId(pKeyId.toString());
+                    List<Long> tableIds = wbsTreePrivateClient.testFormInit(Long.valueOf(nodeByPrimaryKeyId.getProjectId()), contractId, nodeByPrimaryKeyId.getWbsId(), nodeByPrimaryKeyId.getId());
+                    if(CollectionUtil.isNotEmpty(tableIds)){
+                        tableIds.add(copyId);
+                    }
+                    byId.setTableIds(StringUtil.join(tableIds, ","));
+                }else{
+                    byId.setTableIds(byId.getTableIds() + "," + copyId);
+                }
+                iTrialSelfInspectionRecordService.updateById(byId);
                 return R.success("复制成功");
             }
         }

+ 170 - 92
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSummaryController.java

@@ -3,6 +3,7 @@ package org.springblade.business.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -16,18 +17,21 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddressBase;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.business.dto.TrialSeleInspectionRecordBaseInfoDTO;
 import org.springblade.business.dto.TrialSummaryRecordDTO;
 import org.springblade.business.dto.TrialSummaryRecordPageDTO;
-import org.springblade.business.entity.TrialSelfInspectionRecord;
-import org.springblade.business.entity.TrialSummaryRecord;
-import org.springblade.business.entity.TrialSummaryRecordDataJson;
+import org.springblade.business.entity.*;
 import org.springblade.business.service.impl.TrialSelfInspectionRecordServiceImpl;
 import org.springblade.business.service.impl.TrialSummaryRecordServiceImpl;
+import org.springblade.business.vo.TrialRawMaterialSelfRecord;
+import org.springblade.business.vo.TrialSelfInspectionRecordVO;
+import org.springblade.business.vo.TrialSelfSample;
 import org.springblade.business.vo.TrialSummaryRecordVO;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
@@ -36,16 +40,16 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.ExcelTab;
-import org.springblade.manager.entity.TrialSummaryClassificationConfiguration;
-import org.springblade.manager.entity.TrialSummaryExcelTabReflection;
+import org.springblade.manager.entity.*;
+import org.springblade.manager.vo.TrialTableDataInfo;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.Dict;
+import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -156,7 +160,8 @@ public class TrialSummaryController {
                     vo.setClassIdName(classificationConfigurationMap.get(obj.getClassId()).getClassName());
                     vo.setDetectionTypeName(dictMap.get(obj.getDetectionType().toString()).getDictValue());
                     vo.setSummaryDateName(obj.getStartDate() + "~" + obj.getEndDate());
-                    vo.setUnitTypeName(obj.getUnitType().equals(1) ? "施工" : "监理");
+                    vo.setUnitTypeName(obj.getUnitType().equals(1) ? "施工" : obj.getUnitType().equals(2) ? "监理" : "业主");
+                    vo.setClassIdName(vo.getClassIdName() + "(" + vo.getUnitTypeName() + ")");
                     return vo;
                 }).collect(Collectors.toList());
         page.setRecords(collect);
@@ -191,12 +196,20 @@ public class TrialSummaryController {
                     .in(TrialSelfInspectionRecord::getNodeId, Func.toLongList(classC.getTrialTreeIds()))
                     .eq(TrialSelfInspectionRecord::getContractId, dto.getContractId())
                     .eq(TrialSelfInspectionRecord::getDetectionCategory, dto.getDetectionType())
+                    .eq(TrialSelfInspectionRecord::getType, dto.getUnitType())
+                    .eq(TrialSelfInspectionRecord::getTaskStatus, "已审批")
                     .between(TrialSelfInspectionRecord::getReportDate, startDate, endDate)
+                    .last(" order by report_date, report_no, record_no asc")
             );
             if (records.size() <= 0) {
                 throw new ServiceException("未获取到该报告时间段范围内的试验自检记录信息,操作失败");
             }
-            List<Long> recordIds = records.stream().map(TrialSelfInspectionRecord::getId).collect(Collectors.toList());
+            List<Long> recordIds = new ArrayList<>();
+            Map<Long, Integer> sortMap = new HashMap<>();
+            for (int i = 0; i < records.size(); i++) {
+                sortMap.put(records.get(i).getId(), i);
+                recordIds.add(records.get(i).getId());
+            }
 
             String sql_2 = "SELECT * FROM m_trial_summary_excel_tab_reflection WHERE excel_id = ? AND class_id = ?";
             List<TrialSummaryExcelTabReflection> excelTabReflections = jdbcTemplate.query(sql_2,
@@ -208,6 +221,7 @@ public class TrialSummaryController {
 
             /*构造实体数据map*/
             Map<String, Object> map = new LinkedHashMap<>();
+            List<Map<String, Object>> trialTableData = trialSelfInspectionRecordServiceImpl.getTrialTableData(recordIds);
             for (Map.Entry<String, List<TrialSummaryExcelTabReflection>> entry : maps.entrySet()) {
                 String tabName = entry.getKey().split("###")[0];
                 String tabPkeyId = entry.getKey().split("###")[1];
@@ -215,96 +229,115 @@ public class TrialSummaryController {
                 List<TrialSummaryExcelTabReflection> value = entry.getValue();
                 Map<String, List<TrialSummaryExcelTabReflection>> elementKeyWithHtmlKeyNameMap = value.stream().collect(Collectors.groupingBy(TrialSummaryExcelTabReflection::getElementKey));
                 Set<String> elementKeys = elementKeyWithHtmlKeyNameMap.keySet();
-
-                String sql_3 = "SELECT " + String.join(",", elementKeys) + " FROM " + tabName + " WHERE p_key_id = " + tabPkeyId + " AND group_id in(" + StringUtils.join(recordIds, ",") + ")";
-                List<Map<String, Object>> tabDataList = jdbcTemplate.queryForList(sql_3);
+                List<Map<String, Object>> tabDataList;
+                if (TrialTableDataInfo.TBN.equals(tabName)) {
+                    if (trialTableData != null && !trialTableData.isEmpty()) {
+                        tabDataList = trialTableData;
+                    } else {
+                        tabDataList = new ArrayList<>();
+                    }
+                } else {
+                    String sql_3 = "SELECT " + String.join(",", elementKeys) + " ,group_id FROM " + tabName + " WHERE p_key_id = " + tabPkeyId + " AND group_id in(" + StringUtils.join(recordIds, ",") + ")";
+                    tabDataList = jdbcTemplate.queryForList(sql_3);
+                }
                 if (tabDataList.isEmpty()) {
                     continue;
                 }
-
+                Map<String, List<Map<String, Object>>> dataGroupMap = tabDataList.stream().collect(Collectors.groupingBy(data -> data.get("group_id") + ""));
+                List<String> list = tabDataList.stream().map(data -> data.get("group_id") + "").sorted((o1, o2) -> {
+                    int i = sortMap.get(Long.parseLong(o1));
+                    int j = sortMap.get(Long.parseLong(o2));
+                    return Integer.compare(i, j);
+                }).collect(Collectors.toList());
                 for (String elementKey : elementKeys) {
-                    for (Map<String, Object> stringObjectMap : tabDataList) {
-                        stringObjectMap.entrySet().removeIf(obj -> obj.getValue() == null || obj.getValue().equals(""));
-                        Object tabData = stringObjectMap.getOrDefault(elementKey, null);
-                        if (ObjectUtil.isEmpty(tabData)) {
+                    for (String key : list) {
+                        List<Map<String, Object>> dataList = dataGroupMap.get(key);
+                        if (dataList == null || dataList.isEmpty()) {
                             continue;
                         }
-
-                        String tabDataStr = (String) tabData;
-                        //跨行
-                        if (tabDataStr.contains("☆")) {
-                            String[] split = tabDataStr.split("☆");
-                            for (String valueRow : split) {
-                                String[] splitValues = valueRow.split(Pattern.quote("_^_"));
-                                String valueInput = splitValues[0];
-                                /*String indexKey = splitValues[1];*/
-                                String keyName = elementKey + "__";
-
-                                if (map.containsKey(keyName)) {
-                                    String existingValue = (String) map.get(keyName);
-                                    map.put(keyName, existingValue + "@@@###" + valueInput);
-                                } else {
-                                    map.put(keyName, valueInput);
-                                }
+                        for (Map<String, Object> stringObjectMap : dataList) {
+                            stringObjectMap.entrySet().removeIf(obj -> obj.getValue() == null || obj.getValue().equals(""));
+                            Object tabData = stringObjectMap.getOrDefault(elementKey, null);
+                            if (ObjectUtil.isEmpty(tabData)) {
+                                continue;
                             }
 
-                        } else {
-                            //非跨行
-                            if (tabDataStr.contains(".000Z]") && tabDataStr.contains("T")) {
-                                String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
-                                String valueInput = splitValues[0];
-                                /*String indexKey = splitValues[1];*/
-                                String keyName = elementKey + "__";
-
-                                //范围日期
-                                String[] split = valueInput.split(",");
-                                String date_1 = split[0].trim();
-                                String date_2 = split[1].trim();
-                                LocalDateTime startTime = LocalDateTime.parse(date_1, DateTimeFormatter.ISO_DATE_TIME);
-                                LocalDateTime endTime = LocalDateTime.parse(date_2, DateTimeFormatter.ISO_DATE_TIME);
-                                ZonedDateTime startZonedTime = startTime.atZone(ZoneId.of("UTC"));
-                                ZonedDateTime endZonedTime = endTime.atZone(ZoneId.of("UTC"));
-                                String time_1 = startZonedTime.format(DateTimeFormatter.ISO_DATE_TIME);
-                                String time_2 = endZonedTime.format(DateTimeFormatter.ISO_DATE_TIME);
-
-                                if (map.containsKey(keyName)) {
-                                    String existingValue = (String) map.get(keyName);
-                                    map.put(keyName, existingValue + "@@@###" + time_1 + "~" + time_2);
-                                } else {
-                                    map.put(keyName, time_1 + "~" + time_2);
+                            String tabDataStr = (String) tabData;
+                            //跨行
+                            if (tabDataStr.contains("☆")) {
+                                String[] split = tabDataStr.split("☆");
+                                for (String valueRow : split) {
+                                    String[] splitValues = valueRow.split(Pattern.quote("_^_"));
+                                    String valueInput = splitValues[0];
+                                    /*String indexKey = splitValues[1];*/
+                                    String keyName = elementKey + "__" + tabPkeyId;
+
+                                    if (map.containsKey(keyName)) {
+                                        String existingValue = (String) map.get(keyName);
+                                        map.put(keyName, existingValue + "@@@###" + valueInput);
+                                    } else {
+                                        map.put(keyName, valueInput);
+                                    }
                                 }
 
-                            } else if (tabDataStr.contains(".000Z") && tabDataStr.contains("T")) {
-                                String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
-                                String valueInput = splitValues[0];
-                                /*String indexKey = splitValues[1];*/
-                                String keyName = elementKey + "__";
+                            } else {
+                                //非跨行
+                                if (tabDataStr.contains(".000Z]") && tabDataStr.contains("T")) {
+                                    String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
+                                    String valueInput = splitValues[0];
+                                    /*String indexKey = splitValues[1];*/
+                                    String keyName = elementKey + "__" + tabPkeyId;
+
+                                    //范围日期
+                                    String[] split = valueInput.split(",");
+                                    String date_1 = split[0].trim();
+                                    String date_2 = split[1].trim();
+                                    LocalDateTime startTime = LocalDateTime.parse(date_1, DateTimeFormatter.ISO_DATE_TIME);
+                                    LocalDateTime endTime = LocalDateTime.parse(date_2, DateTimeFormatter.ISO_DATE_TIME);
+                                    ZonedDateTime startZonedTime = startTime.atZone(ZoneId.of("UTC"));
+                                    ZonedDateTime endZonedTime = endTime.atZone(ZoneId.of("UTC"));
+                                    String time_1 = startZonedTime.format(DateTimeFormatter.ISO_DATE_TIME);
+                                    String time_2 = endZonedTime.format(DateTimeFormatter.ISO_DATE_TIME);
+
+                                    if (map.containsKey(keyName)) {
+                                        String existingValue = (String) map.get(keyName);
+                                        map.put(keyName, existingValue + "@@@###" + time_1 + "~" + time_2);
+                                    } else {
+                                        map.put(keyName, time_1 + "~" + time_2);
+                                    }
 
-                                //单日期
-                                LocalDateTime time = LocalDateTime.parse(valueInput, DateTimeFormatter.ISO_DATE_TIME);
-                                ZonedDateTime zonedDateTime = time.atZone(ZoneId.of("UTC"));
-                                String timeStr = zonedDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
+                                } else if (tabDataStr.contains(".000Z") && tabDataStr.contains("T")) {
+                                    String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
+                                    String valueInput = splitValues[0];
+                                    /*String indexKey = splitValues[1];*/
+                                    String keyName = elementKey + "__" + tabPkeyId;
+
+                                    //单日期
+                                    LocalDateTime time = LocalDateTime.parse(valueInput, DateTimeFormatter.ISO_DATE_TIME);
+                                    ZonedDateTime zonedDateTime = time.atZone(ZoneId.of("UTC"));
+                                    String timeStr = zonedDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
+
+                                    if (map.containsKey(keyName)) {
+                                        String existingValue = (String) map.get(keyName);
+                                        map.put(keyName, existingValue + "@@@###" + timeStr);
+                                    } else {
+                                        map.put(keyName, timeStr);
+                                    }
 
-                                if (map.containsKey(keyName)) {
-                                    String existingValue = (String) map.get(keyName);
-                                    map.put(keyName, existingValue + "@@@###" + timeStr);
                                 } else {
-                                    map.put(keyName, timeStr);
-                                }
+                                    String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
+                                    String valueInput = splitValues[0];
+                                    /*String indexKey = splitValues[1];*/
+                                    String keyName = elementKey + "__" + tabPkeyId;
+
+                                    if (map.containsKey(keyName)) {
+                                        String existingValue = (String) map.get(keyName);
+                                        map.put(keyName, existingValue + "@@@###" + valueInput);
+                                    } else {
+                                        map.put(keyName, valueInput);
+                                    }
 
-                            } else {
-                                String[] splitValues = tabDataStr.split(Pattern.quote("_^_"));
-                                String valueInput = splitValues[0];
-                                /*String indexKey = splitValues[1];*/
-                                String keyName = elementKey + "__";
-
-                                if (map.containsKey(keyName)) {
-                                    String existingValue = (String) map.get(keyName);
-                                    map.put(keyName, existingValue + "@@@###" + valueInput);
-                                } else {
-                                    map.put(keyName, valueInput);
                                 }
-
                             }
                         }
                     }
@@ -315,7 +348,7 @@ public class TrialSummaryController {
             Map<String, Object> map2 = new HashMap<>();
              for(String mapKey : map.keySet()){
                  for(TrialSummaryExcelTabReflection data: excelTabReflections){
-                    if(mapKey.equals((data.getElementKey()+"__"))){
+                    if(mapKey.equals(data.getElementKey() + "__" + data.getTrialTabId())){
                         map2.put(data.getHtmlKeyName().split("__")[0]+"__",map.get(mapKey));
                     }
                  }
@@ -327,7 +360,7 @@ public class TrialSummaryController {
             if (indexMap.size() > 0) {
                 ExcelTab excelTab = jdbcTemplate.query("SELECT file_url FROM m_excel_tab WHERE id = ?", new Object[]{classC.getExcelId()}, new BeanPropertyRowMapper<>(ExcelTab.class)).stream().findAny().orElse(null);
                 if (excelTab != null) {
-                    List<MultipartFile> files = this.writeDataToMultipartFile(excelTab.getFileUrl(), indexMap);
+                    List<MultipartFile> files = this.writeDataToMultipartFile(excelTab.getFileUrl(), indexMap, dto.getContractId());
                     if (files.size() > 0) {
                         NewBladeFile newBladeFile = newIOSSClient.excelToPdfs(files);
                         if (newBladeFile != null) {
@@ -379,7 +412,7 @@ public class TrialSummaryController {
      * @return
      * @throws Exception
      */
-    private List<MultipartFile> writeDataToMultipartFile(String fileUrl, Map<String, String> indexMap) throws Exception {
+    private List<MultipartFile> writeDataToMultipartFile(String fileUrl, Map<String, String> indexMap, Long contractId) throws Exception {
         /*pageSize分页分组*/
         Map<String, List<Map.Entry<String, String>>> groupedByPageSize = indexMap.entrySet().stream()
                 .collect(Collectors.groupingBy(entry -> {
@@ -388,7 +421,9 @@ public class TrialSummaryController {
                 }));
 
         List<MultipartFile> files = new LinkedList<>();
-
+        List<String> query = jdbcTemplate.query("select project_name from m_project_info a left join m_contract_info b on a.id = b.p_id where b.id =" + contractId, new SingleColumnRowMapper<>(String.class));
+        String projectName = query.isEmpty()? "" : query.get(0);
+        indexMap.put("projectName", projectName);
         /*每一页视为一份新excel*/
         for (Map.Entry<String, List<Map.Entry<String, String>>> page : groupedByPageSize.entrySet()) {
             InputStream modInput = CommonUtil.getOSSInputStream(fileUrl);
@@ -414,6 +449,48 @@ public class TrialSummaryController {
                         /*根据位置信息,将value写入excel*/
                         mergeAndCenterCells(sheet, x1, x2, y1, y2, value);
                     }
+                    //标题添加
+                    sheet.setForceFormulaRecalculation(true);
+                    int all = 0;
+                    List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
+                    mergedRegions.sort(Comparator.comparingInt(CellRangeAddressBase::getFirstRow));
+                    int xle = Math.min(mergedRegions.size(), 10);
+                    for (int i = 0; i < xle; i++) {
+                        CellRangeAddress mergedCell = sheet.getMergedRegion(i);
+                        int xx = mergedCell.getLastColumn();
+                        if (xx >= all) {
+                            all = xx;
+                        }
+                    }
+                    for (int i = 0; i < xle; i++) {
+                        CellRangeAddress mergedCell = mergedRegions.get(i);
+                        int xx = mergedCell.getLastColumn() + 2;
+                        if (xx >= all) {
+                            int fisRow = mergedCell.getFirstRow();
+                            int firsrCol = mergedCell.getFirstColumn();
+                            Cell cell = sheet.getRow(fisRow).getCell(firsrCol);
+                            short fontIndex = cell.getCellStyle().getFontIndex();
+                            Font oldfontAt = workbook.getFontAt(fontIndex);
+                            Font redFont = workbook.createFont();
+                            redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
+                            redFont.setFontName(oldfontAt.getFontName());//设置字体
+                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                            newStyle.cloneStyleFrom(cell.getCellStyle());
+                            short fontHeightInPoints = redFont.getFontHeightInPoints();
+                            if (fontHeightInPoints >= 10 && StringUtils.isBlank(cell.getStringCellValue()) && fisRow <= 8) {
+                                String title = indexMap.get("projectName");
+                                if (title.length() >= 30) {
+                                    sheet.getRow(fisRow).setHeight((short) 900);
+                                    newStyle.setWrapText(true);
+                                }
+                                redFont.setBold(true);
+                                newStyle.setFont(redFont);
+                                cell.setCellStyle(newStyle);
+                                cell.setCellValue(title);
+                                break;
+                            }
+                        }
+                    }
 
                     try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
                         workbook.write(byteArrayOutputStream);
@@ -567,10 +644,11 @@ public class TrialSummaryController {
 
                 if (sortedElements.size() < data.length) {
                     /*html输入框数量 < 试验自检实体数据 ,存在多页,需翻页*/
-                    int countInputAdd = data.length - sortedElements.size();
-                    /*每页需要sortedElements.size()个输入框,共需要countPage页*/
-                    int countPage = (countInputAdd + sortedElements.size()) / sortedElements.size();
-                    countPage += (countInputAdd + sortedElements.size() - 1) % sortedElements.size() > 0 ? 1 : 0;
+//                    int countInputAdd = data.length - sortedElements.size();
+//                    /*每页需要sortedElements.size()个输入框,共需要countPage页*/
+//                    int countPage = (countInputAdd + sortedElements.size()) / sortedElements.size();
+//                    countPage += (countInputAdd + sortedElements.size() - 1) % sortedElements.size() > 0 ? 1 : 0;
+                    int countPage = data.length % sortedElements.size() == 0 ? data.length / sortedElements.size() : data.length / sortedElements.size() + 1;
 
                     List<Element> sortedElementsAll = new LinkedList<>();
                     for (int i = 0; i < countPage; i++) {

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

@@ -23,6 +23,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.enums.StorageTypeEnum;
 import org.springblade.manager.feign.ContractClient;
+import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -68,6 +69,19 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         this.iArchiveFileService.updateArchiveFileSort(vo.getList());
     }
 
+    @Override
+    public void batchUpdateInfo(ArchiveFileVO vo) {
+        List<ArchiveFileVO> list = vo.getList();
+        List<ArchiveFile> archiveFileList = list.stream()
+                .map(voen -> {
+                    ArchiveFile file = new ArchiveFile();
+                    BeanUtils.copyProperties(voen, file);
+                    return file;
+                })
+                .collect(Collectors.toList());
+        this.iArchiveFileService.saveOrUpdateBatch(archiveFileList);
+    }
+
     @Override
     public boolean updateArchiveFileByBoxName(Map<String, Object> jsons) {
         return this.iArchiveFileService.updateArchiveFileByBoxName(jsons);

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

@@ -1012,12 +1012,12 @@
     <update id="addCheckPdfInfoByNodeId" >
         update u_information_query a set a.chek_status=1
         where a.is_deleted = 0 and a.classify=#{classify} and a.wbs_id
-        in( select b.p_key_id from m_wbs_tree_contract b where b.is_deleted = 0 and b.ancestors_p_id like CONCAT(CONCAT('%', #{ids}), '%') and b.is_deleted = 0) and a.status in(1,2)
+        in( select b.p_key_id from m_wbs_tree_contract b where b.is_deleted = 0 and b.ancestors_p_id like CONCAT(CONCAT('%', #{ids}), '%') and b.is_deleted = 0) and a.status = 2
     </update>
 
     <update id="addCheckPdfInfoByIds">
         update u_information_query set chek_status=1
-        where is_deleted = 0 and classify=#{classify} and id in
+        where status = 2 and is_deleted = 0 and classify=#{classify} and id in
         <foreach collection="ids" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>

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

@@ -59,6 +59,7 @@ public interface IArchiveFileService extends BaseService<ArchiveFile> {
 
     void updateArchiveFileSort(List<ArchiveFileVO> list);
 
+
     boolean updateArchiveFileByBoxName(Map<String, Object> jsons);
 
     String isBoxName(String boxName);

+ 130 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -51,6 +51,7 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ExcelTabClient;
 import org.springblade.manager.feign.TableFileClient;
 import org.springblade.manager.feign.WbsTreePrivateClient;
+import org.springblade.manager.vo.TrialTableDataInfo;
 import org.springblade.resource.entity.Attach;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.IOSSClient;
@@ -2280,6 +2281,12 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (!b) {
                 throw new ServiceException("报告编号已存在");
             }
+            WbsTreePrivate nodeByPrimaryKeyId = wbsTreePrivateClient.getNodeByPrimaryKeyId(String.valueOf(dto.getNodeId()));
+            //初始化 table_ids
+            List<Long> tableIds = wbsTreePrivateClient.testFormInit(dto.getProjectId(),dto.getContractId(),nodeByPrimaryKeyId.getWbsId(),nodeByPrimaryKeyId.getId());
+            if(CollectionUtil.isNotEmpty(tableIds)){
+                record.setTableIds(StringUtil.join(tableIds, ","));
+            }
             this.save(record);
         } else {
             this.updateById(record);
@@ -2374,6 +2381,128 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         return record.getId();
     }
 
+//    @Override
+    public List<Map<String, Object>> getTrialTableData(List<Long> recordIds){
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = this.listByIds(recordIds);
+        Map<String, Dict> map = iDictClient.getList("trial_detection_category").getData().stream().collect(Collectors.toMap(Dict::getDictKey, Function.identity()));
+        Map<String, Long> projectPositionMap = new HashMap<>();
+        Set<String> entrustIds = new HashSet<>();
+        StringBuilder sb = new StringBuilder();
+        trialSelfInspectionRecords.forEach(record -> {
+            //工程部位及用途名称
+            if (ObjectUtil.isNotEmpty(record.getProjectPosition())) {
+                List<String> ids = Func.toStrList(record.getProjectPosition()); //关联的工程部位ids
+                for (String id : ids) {
+                    projectPositionMap.put(id, record.getId());
+                }
+            }
+            sb.append(record.getId()).append(",");
+            if (record.getEntrustId() != null && record.getEntrustId() > 0) {
+                entrustIds.add(record.getEntrustId() + "");
+            }
+        });
+        Map<Long, List<String>> projectPositionGroupMap = new HashMap<>();
+        Map<String, Map<String, Object>> entrustMap = new HashMap<>();
+        Map<String, String> rawMaterialMap = new HashMap<>();
+        if (!projectPositionMap.isEmpty()) {
+            //查询工程部位节点名称信息
+            List<WbsTreeContract> result = baseMapper.selectWbsTreeContractListByPKeyIds(new ArrayList<>(projectPositionMap.keySet()));
+            projectPositionGroupMap = result.stream().collect(Collectors.groupingBy(item -> projectPositionMap.get(item.getPKeyId() + ""), Collectors.mapping(WbsTreeContract::getNodeName, Collectors.toList())));
+        }
+        if (!entrustIds.isEmpty()) {
+            List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT a.id, a.entrust_name,a.entrust_no,b.specification_number, b.specification_model from u_entrust_info a INNER JOIN u_trial_sample_info b on a.sample_id = b.id where a.is_deleted = 0 and a.id in ( "
+                    + String.join(",", entrustIds) + " )");
+            if (!mapList.isEmpty()) {
+                entrustMap = mapList.stream().collect(Collectors.toMap(m -> m.get("id") + "", m -> m));
+            }
+        }
+        if (sb.length() > 0) {
+            sb.deleteCharAt(sb.length() - 1);
+            //原材料检测报告ids
+            List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT a.self_id,c.production_certificate from u_trial_self_sample a left JOIN u_trial_sampling_record b on a.sampling_id = b.sample_info_id " +
+                    "left JOIN u_trial_material_mobilization c on b.mobilization_id = c.id where a.self_id in (" + sb + ")");
+            if (!mapList.isEmpty()) {
+                rawMaterialMap = mapList.stream().collect(Collectors.toMap(m -> m.get("self_id") + "", m -> m.get("production_certificate") == null ? "" : m.get("production_certificate") + "", (m, n) -> m));
+            }
+        }
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (TrialSelfInspectionRecord record : trialSelfInspectionRecords) {
+            Map<String, Object> resultMap = new HashMap<>();
+            resultMap.put("group_id", record.getId());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.RECORD_NO.getKey(), record.getRecordNo());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.REPORT_NO.getKey(), record.getReportNo());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.TRIAL_PROJECT_NAME.getKey(), record.getTrialProjectName());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.TASK_STATUS.getKey(), record.getTaskStatus());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.REPORT_DATE.getKey(), DateUtil.format(record.getReportDate(), "yyyy-MM-dd"));
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.TRIAL_USER_NAME.getKey(), record.getTrialUserName());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.SPECIFICATION_MODEL.getKey(), record.getSpecificationModel());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.SAMPLING_LOCATION.getKey(), record.getSamplingLocation());
+
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.CONTRACT_NAME.getKey(), record.getContractId());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.COMPANY.getKey(), record.getCompany());
+            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.DETECTION_RESULT.getKey(), (new Integer(1)).equals(record.getDetectionResult()) ? "合格" : "不合格");
+
+            if (ObjectUtils.isNotEmpty(record.getDetectionCategory())) {
+                Dict dict = map.get(String.valueOf(record.getDetectionCategory()));
+                if (dict != null) {
+                    resultMap.put(TrialTableDataInfo.TrialTableElementEnum.DETECTION_CATEGORY.getKey(), dict.getDictValue());
+                }
+            }
+            //工程部位及用途名称
+            if (ObjectUtil.isNotEmpty(record.getProjectPosition())) {
+                List<String> projectPositionNames = projectPositionGroupMap.get(record.getId());
+                if (projectPositionNames != null) {
+                    String name = projectPositionNames.stream().findAny().orElse(null);
+                    if (projectPositionNames.size() > 1) {
+                        resultMap.put(TrialTableDataInfo.TrialTableElementEnum.PROJECT_POSITION.getKey(), name + "等" + projectPositionNames.size() + "个工程部位信息");
+                    } else {
+                        resultMap.put(TrialTableDataInfo.TrialTableElementEnum.PROJECT_POSITION.getKey(), name);
+                    }
+                }
+            }
+            //关联取样ids
+            String productionCertificate = rawMaterialMap.get(record.getId() + "");
+            if (productionCertificate != null) {
+                if (!productionCertificate.isEmpty()) {
+                    resultMap.put(TrialTableDataInfo.TrialTableElementEnum.IS_UPLOAD_CERTIFICATE.getKey(), "是");
+                } else {
+                    resultMap.put(TrialTableDataInfo.TrialTableElementEnum.IS_UPLOAD_CERTIFICATE.getKey(), "否");
+                }
+            }
+            //委托单名称 委托单编号
+            Map<String, Object> entrust = entrustMap.get(record.getEntrustId() + "");
+            if (entrust != null) {
+                resultMap.put(TrialTableDataInfo.TrialTableElementEnum.ENTRUST_NAME.getKey(), entrust.get("entrust_name") == null ? "" : entrust.get("entrust_name") + "");
+                resultMap.put(TrialTableDataInfo.TrialTableElementEnum.ENTRUST_NO.getKey(), entrust.get("entrust_no") == null ? "" : entrust.get("entrust_no") + "");
+                //材料id不为空
+                Object object = entrust.get("specification_number");
+                if (object != null) {
+                    resultMap.put(TrialTableDataInfo.TrialTableElementEnum.SPECIFICATION_NUMBER.getKey(), object);
+                }
+                Object object1 = entrust.get("specification_model");
+                if (object1 != null) {
+                    resultMap.put(TrialTableDataInfo.TrialTableElementEnum.SPECIFICATION_MODEL.getKey(), object1);
+                }
+            }
+            if (record.getBaseInfo() != null && !record.getBaseInfo().isEmpty()) {
+                try {
+                    TrialSeleInspectionRecordBaseInfoDTO baseInfoDTO = JSON.parseObject(record.getBaseInfo(), TrialSeleInspectionRecordBaseInfoDTO.class);
+                    if (baseInfoDTO != null) {
+                        if (StringUtil.hasText(baseInfoDTO.getEntrustNo())) {
+                            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.ENTRUST_NO.getKey(), baseInfoDTO.getEntrustNo());
+                        }
+                        if (StringUtil.hasText(baseInfoDTO.getProjectPosition())) {
+                            resultMap.put(TrialTableDataInfo.TrialTableElementEnum.PROJECT_POSITION.getKey(), baseInfoDTO.getProjectPosition());
+                        }
+                    }
+                } catch (Exception e) {
+                    log.warn("JSON反序列化失败:" + record.getBaseInfo());
+                }
+            }
+            result.add(resultMap);
+        }
+        return result;
+    }
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateSort(TrialSelfInspectionRecordPageDTO dto) {
@@ -2403,4 +2532,5 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             updateBatchById(trialSelfInspectionRecords);
         }
     }
+
 }

+ 25 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -963,7 +963,7 @@ public class ExcelTabController extends BladeController {
     }
 
     /**
-     * 客户端清表生成html
+     * 客户端清表生成html 日志
      */
     @GetMapping("/get-excel-html-two")
     @ApiOperationSupport(order = 15)
@@ -996,7 +996,27 @@ public class ExcelTabController extends BladeController {
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
 
-        //Elements col = doc.select("Col");
+
+        //获取公式颜色
+        String tabName = wbsTreePrivate.getInitTableName();
+        //字段查询、获取公式字段
+        String colKeys = "SELECT e_key from m_table_info a ,m_wbs_form_element b WHERE a.tab_en_name = '" + tabName + "' and a.id=b.f_id and b.id  in(SELECT element_id from m_element_formula_mapping c where c.is_deleted=0) ";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(colKeys);
+        if (maps.size() > 0) {
+            for (Map<String, Object> keys : maps) {
+                String key = keys.get("e_key") + "__";
+                Elements gsColor = doc.select("el-input[keyname~=^" + key + "]");
+                for (Element element : gsColor) {
+                    element.parent().attr("gscolor", "11");
+                }
+
+                Elements dateColor = doc.select("el-date-picker[keyname~=^" + key + "]");
+                for (Element element : dateColor) {
+                    element.parent().attr("gscolor", "11");
+                }
+            }
+        }
+
 
         doc.select("Col").remove();
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
@@ -1021,6 +1041,7 @@ public class ExcelTabController extends BladeController {
                 }
             }
         }
+
         return R.data(table + "");
     }
 
@@ -3861,6 +3882,8 @@ public class ExcelTabController extends BladeController {
             data = this.excelTabService.saveOrUpdateFirst(tableInfoList);
         } else {
             //保存日志
+            //------公式填充------
+            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodePrimaryKeyId), ExecuteType.LOGINFO);
             data = this.excelTabService.saveOrUpdateTheLog(tableInfoList);
         }
         this.getTheLogPdInfo(pkeyId, nodePrimaryKeyId, recordTime, contractId,null);

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

@@ -24,6 +24,7 @@ import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -103,6 +104,7 @@ public class ExctabCellController extends BladeController {
             Date date = new Date();
             Timestamp timestamp = new Timestamp(date.getTime());
             exctabCell.setCreateTime(timestamp);
+            exctabCell.setExid(SnowFlakeUtil.getId());
         }
         return R.status(exctabCellService.saveBatch(exctabCells));
     }

+ 29 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialSummaryClassificationConfigurationController.java

@@ -30,6 +30,7 @@ import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
 import org.springblade.manager.vo.ExcelTabTreeVO;
 import org.springblade.manager.vo.SelectedTabVO;
+import org.springblade.manager.vo.TrialTableDataInfo;
 import org.springblade.manager.vo.TrialTreeVO;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -65,6 +66,9 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
     @ApiOperation(value = "新增或修改", notes = "传入TrialSummaryClassificationConfiguration对象")
     @RequestMapping(value = "/submit", method = RequestMethod.POST)
     public R<Object> submit(@Valid @RequestBody TrialSummaryClassificationConfiguration obj) {
+        if (obj == null || obj.getProjectType() == null) {
+            return R.fail("参数错误");
+        }
         return R.status(iTrialSummaryClassificationConfigurationService.submit(obj));
     }
 
@@ -139,7 +143,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
             if (file1.exists()) {
                 fileInputStream = new FileInputStream(file1);
             } else {
-                String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+                String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "").replaceAll("/www/wwwroot/Users/hongchuangyanfa/Desktop/", "");
                 fileInputStream = CommonUtil.getOSSInputStream(path);
             }
             String htmlString = IoUtil.readToString(fileInputStream);
@@ -159,6 +163,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
     @RequestMapping(value = "/tab/list", method = RequestMethod.GET)
     public R<List<SelectedTabVO>> tabList(@RequestParam String classId) {
         TrialSummaryClassificationConfiguration trialSummaryClassificationConfiguration = iTrialSummaryClassificationConfigurationService.getById(classId);
+        List<SelectedTabVO> list = new ArrayList<>();
         if (trialSummaryClassificationConfiguration != null && ObjectUtil.isNotEmpty(trialSummaryClassificationConfiguration.getTrialTreeIds())) {
             List<WbsTreePrivate> query = jdbcTemplate.query("SELECT id,project_id,wbs_id,wbs_type FROM m_wbs_tree_private WHERE p_key_id in (" + trialSummaryClassificationConfiguration.getTrialTreeIds() + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
             List<Long> ids = query.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
@@ -172,7 +177,6 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                         .eq(WbsTreePrivate::getType, 2)
                         .isNull(WbsTreePrivate::getTrialTabContractId)
                         .eq(WbsTreePrivate::getWbsId, wbsId));
-                List<SelectedTabVO> list = new ArrayList<>();
                 for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
                     SelectedTabVO vo = new SelectedTabVO();
                     vo.setPKeyId(wbsTreePrivate.getPKeyId());
@@ -181,16 +185,24 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                     vo.setInitTableName(wbsTreePrivate.getInitTableName());
                     list.add(vo);
                 }
-                return R.data(list);
             }
         }
-        return null;
+        SelectedTabVO selectedTabVO = new SelectedTabVO();
+        selectedTabVO.setPKeyId(TrialTableDataInfo.LONG_ID);
+        selectedTabVO.setTabName(TrialTableDataInfo.TBN_CH);
+        selectedTabVO.setInitTableName(TrialTableDataInfo.TBN);
+        selectedTabVO.setInitTabId(TrialTableDataInfo.LONG_ID);
+        list.add(selectedTabVO);
+        return R.data(list);
     }
 
     @ApiOperationSupport(order = 11)
     @ApiOperation(value = "选择元素列表", notes = "传入/tab/list接口的initTabId")
     @RequestMapping(value = "/element/list", method = RequestMethod.GET)
     public R<List<WbsFormElement>> elementList(@RequestParam String id) {
+        if (TrialTableDataInfo.ID.equals( id)) {
+            return R.data(TrialTableDataInfo.getElementList());
+        }
         return R.data(wbsFormElementService.selectElementListByFid(id));
     }
 
@@ -203,6 +215,13 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
             String sql = "SELECT * FROM m_trial_summary_excel_tab_reflection WHERE excel_id = ? AND html_key_name = ?";
             TrialSummaryExcelTabReflection obj = jdbcTemplate.query(sql, new Object[]{classificationConfiguration.getExcelId(), keyName}, new BeanPropertyRowMapper<>(TrialSummaryExcelTabReflection.class)).stream().findAny().orElse(null);
             if (obj != null) {
+                if (TrialTableDataInfo.LONG_ID.equals(obj.getTrialTabId())) {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("id", obj.getId().toString());
+                    map.put("tabName", TrialTableDataInfo.TBN_CH);
+                    map.put("elementName", TrialTableDataInfo.getElementName(obj.getElementKey()));
+                    return R.data(map);
+                }
                 WbsTreePrivate trialTab = wbsTreePrivateServiceImpl.getBaseMapper().getByPKeyId(obj.getTrialTabId());
                 WbsFormElement element = wbsFormElementService.getById(obj.getElementId());
                 if (trialTab != null && element != null) {
@@ -296,8 +315,12 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                         map.put("id", obj.getId());
                         map.put("trialTabId", obj.getTrialTabId());
                         map.put("elementId", obj.getElementId());
-                        WbsFormElement orDefault = eleMap.getOrDefault(obj.getElementId(), null);
-                        map.put("elementValue", ObjectUtil.isNotEmpty(orDefault) ? orDefault.getEName() : null);
+                        if (TrialTableDataInfo.LONG_ID.equals(obj.getTrialTabId())) {
+                            map.put("elementValue", TrialTableDataInfo.getElementName(obj.getElementKey()));
+                        } else {
+                            WbsFormElement orDefault = eleMap.getOrDefault(obj.getElementId(), null);
+                            map.put("elementValue", ObjectUtil.isNotEmpty(orDefault) ? orDefault.getEName() : null);
+                        }
                         map.put("htmlKeyName", obj.getHtmlKeyName());
                         maps.add(map);
                     }

+ 72 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java

@@ -15,19 +15,25 @@ import org.springblade.manager.dto.FormElementDTO2;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.entity.WbsFormElement;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.excel.*;
 import org.springblade.manager.vo.WbsFormElementVO;
 import org.springblade.manager.vo.WbsFormElementVO2;
 import org.springblade.manager.vo.WbsNodeTableVO;
+import org.springblade.manager.vo.WbsTreePrivateTableVO;
 import org.springblade.manager.wrapper.WbsFormElementWrapper;
+import org.springblade.system.entity.Dict;
+import org.springblade.system.feign.IDictClient;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -36,6 +42,7 @@ import java.util.List;
 public class WbsFormElementController extends BladeController {
 
     private final IWbsFormElementService wbsFormElementService;
+    private final IDictClient dictClient;
 
     /**
      * 详情
@@ -251,4 +258,67 @@ public class WbsFormElementController extends BladeController {
         return R.fail(200, "");
     }
 
+    /**
+     * 元素识别关联公共WBS模板-查询节点下已关联的所有表单并按照所属方分组
+     */
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "元素识别关联公共WBS模板-查询节点下已关联的所有表单并按照所属方分组", notes = "传入节点id、清表id")
+    @RequestMapping(value = "/get-group-node-tables", method = RequestMethod.GET)
+    public R<List<WbsTreePrivateTableVO>> searchNodeTablesGroup(String nodeId, String excelTabId) {
+        List<WbsNodeTableVO> list = wbsFormElementService.searchNodeTables(nodeId, excelTabId);
+        if (list == null || list.isEmpty()) {
+            return R.fail(200, "操作失败");
+        }
+        R<List<Dict>> dictResult = dictClient.getList("owner_type");
+        if (!dictResult.isSuccess() || dictResult.getData() == null) {
+            return R.fail(200, "网络异常,请稍后再试");
+        }
+        Map<String, Dict> map = dictResult.getData().stream().collect(Collectors.toMap(Dict::getDictKey, Function.identity()));
+        Map<String, List<WbsNodeTableVO>> groupMap = list.stream().peek(item -> {
+            if (item.getInitTableName() != null && !item.getInitTableName().contains("m_")) {
+                item.setIsLinkTable(2);
+            }
+        }).collect(Collectors.groupingBy(item -> {
+            Dict dict = map.get(item.getTableOwner());
+            if (dict ==  null || dict.getDictValue() == null || !dict.getDictValue().contains("|")) {
+                return "其他";
+            }
+            return dict.getDictValue().split("\\|")[0].trim() + "___" + (dict.getSort() == null ? 999 : dict.getSort());
+        }));
+        Map<String, WbsTreePrivateTableVO> resultMap = new HashMap<>();
+        groupMap.forEach((key, value) -> {
+            String[] split = key.split("___");
+            WbsTreePrivateTableVO vo = resultMap.get(split[0]);
+            if (vo == null) {
+                vo = new WbsTreePrivateTableVO();
+                vo.setTitle(split[0]);
+                vo.setList(value);
+                if (key.contains("___")) {
+                    vo.setSort(Integer.parseInt(split[1]));
+                } else {
+                    vo.setSort(9999);
+                }
+                resultMap.put(split[0], vo);
+            } else {
+                List<WbsNodeTableVO> list1 = vo.getList();
+                if (list1 == null) {
+                    vo.setList(value);
+                } else {
+                    list1.addAll(value);
+                }
+            }
+        });
+        return R.data(resultMap.values().stream().sorted(Comparator.comparingInt(WbsTreePrivateTableVO::getSort)).collect(Collectors.toList()), "查询成功");
+    }
+
+    /**
+     * 元素识别关联公共WBS模板-查询节点下是否存在当前元素表
+     */
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "元素识别关联公共WBS模板-查询节点下是否存在当前元素表", notes = "传入节点id、表单名称")
+    @RequestMapping(value = "/checkTableExist", method = RequestMethod.GET)
+    public R<Object> checkTableExist(String nodeId, String tableName) {
+        return R.data(wbsFormElementService.checkTableExist(nodeId, tableName), "查询成功");
+    }
+
 }

+ 40 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 
+import cn.hutool.core.stream.CollectorUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -18,6 +19,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
@@ -754,11 +756,48 @@ public class WbsTreePrivateController extends BladeController {
        // 获取试验记录信息实体 从而获取委托单编号
         TrialSelfInspectionRecord trialSelfInspectionRecord = null;
         if(ObjectUtil.isNotEmpty(id)){
-            String sqlForInspectionRecord = "select entrust_id from u_trial_self_inspection_record  where id=" + id;
+            String sqlForInspectionRecord = "select table_ids, entrust_id from u_trial_self_inspection_record  where id=" + id;
             trialSelfInspectionRecord = jdbcTemplate.queryForObject(sqlForInspectionRecord, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class));
         }
 
         List<WbsTreePrivateVO4> wbsTreePrivateVO4s = wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId, isAdd, id);
+        if(trialSelfInspectionRecord != null && StringUtil.isNotBlank(trialSelfInspectionRecord.getTableIds())){
+            //根据表单类型分组
+            Map<Integer, List<WbsTreePrivateVO4>> collect = wbsTreePrivateVO4s.stream().collect(Collectors.groupingBy(WbsTreePrivateVO4::getTableType));
+            List<Long> list = Arrays.asList(trialSelfInspectionRecord.getTableIds().split(",")).stream().map(Long::parseLong).collect(Collectors.toList());
+
+            //判断是否存在记录表的数据
+            if("1".equals(tableType)){
+                //报告表
+                List<WbsTreePrivateVO4> wbsTreePrivateVO4s1 = collect.get(1);
+                if(CollectionUtil.isNotEmpty(wbsTreePrivateVO4s1)){
+                    List<Long> collect1 = wbsTreePrivateVO4s1.stream().map(WbsTreePrivateVO4::getPKeyId).collect(Collectors.toList());
+                    if(list.stream().anyMatch(collect1::contains)){
+                        wbsTreePrivateVO4s = wbsTreePrivateVO4s.stream().filter(f -> list.contains(f.getPKeyId())).collect(Collectors.toList());
+                    } else {
+                        //如果id为空 就不查询复制表
+                        wbsTreePrivateVO4s = wbsTreePrivateVO4s.stream().filter(f -> f.getIsCopyTab() == 0).collect(Collectors.toList());
+                    }
+                }
+            }
+            //判断是否存在报告单的数据
+            if("2".equals(tableType)){
+                //记录表
+                List<WbsTreePrivateVO4> wbsTreePrivateVO4s2 = collect.get(2);
+                if(CollectionUtil.isNotEmpty(wbsTreePrivateVO4s2)){
+                    List<Long> collect2 = wbsTreePrivateVO4s2.stream().map(WbsTreePrivateVO4::getPKeyId).collect(Collectors.toList());
+                    if(list.stream().anyMatch(collect2::contains)){
+                        wbsTreePrivateVO4s = wbsTreePrivateVO4s.stream().filter(f -> list.contains(f.getPKeyId())).collect(Collectors.toList());
+                    } else {
+                        //如果id为空 就不查询复制表
+                        wbsTreePrivateVO4s = wbsTreePrivateVO4s.stream().filter(f -> f.getIsCopyTab() == 0).collect(Collectors.toList());
+                    }
+                }
+            }
+        }else{
+            //如果id为空 就不查询复制表
+            wbsTreePrivateVO4s = wbsTreePrivateVO4s.stream().filter(f -> f.getIsCopyTab() == 0).collect(Collectors.toList());
+        }
         for (WbsTreePrivateVO4 treePrivate : wbsTreePrivateVO4s) {
             //试验新增
             if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {

+ 17 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
+import jodd.util.StringUtil;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
@@ -81,12 +82,19 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     }
 
     @Override
-    public boolean copyBussTab(Long pKeyId, Long id, Long contractId) {
+    public Long copyBussTab(Long pKeyId, Long id, Long contractId, String tableIds) {
         if (ObjectUtils.isNotEmpty(id)) {
             //编辑复制 复制数据 附件文件
             WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pKeyId));
             List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getId, wbsTreePrivate.getId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getWbsType, wbsTreePrivate.getWbsType()).eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getParentId, wbsTreePrivate.getParentId()));
             List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateList.stream().sorted(Comparator.comparing(WbsTreePrivate::getCreateTime).reversed()).collect(Collectors.toList());
+            //根据试验表单,只查询自身所属的复制表单
+            if(StringUtil.isBlank(tableIds)){
+                return null;
+            }
+            List<String> list = Arrays.asList(tableIds.split(","));
+            wbsTreePrivates = wbsTreePrivates.stream().filter(f -> list.contains(f.getPKeyId().toString())).collect(Collectors.toList());
+
             long newPkId = SnowFlakeUtil.getId();
             wbsTreePrivate.setPKeyId(newPkId);
             wbsTreePrivate.setCreateTime(new Date());
@@ -165,10 +173,10 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
             }
             if (ObjectUtils.isNotEmpty(wbsTreePrivate)) {
                 wbsTreePrivateService.save(wbsTreePrivate);
-                return true;
+                return newPkId;
             }
         }
-        return false;
+        return null;
     }
 
     @Override
@@ -361,4 +369,10 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         Set<Long> set = privateMapper.getAllPrivateTableByIds(projectId, ids);
         return set;
     }
+
+    @Override
+    public List<Long> testFormInit(Long projectId, Long contractId, String wbsId, Long id) {
+        List<Long> ids =  privateMapper.testFormInit(projectId,contractId,wbsId,id);
+        return ids;
+    }
 }

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

@@ -158,4 +158,9 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<Long> getContractAllLogWbsNodeIds(@Param("contractId") Long contractId);
 
     List<WbsTreePrivate> selectAllChildNode(List<String> leftIds);
+
+    List<Long> testFormInit(@Param("projectId") Long projectId,
+                            @Param("contractId") Long contractId,
+                            @Param("wbsId") String wbsId,
+                            @Param("id") Long id);
 }

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

@@ -1075,4 +1075,28 @@
             contract_id = #{contractId}
     </select>
     <select id="selectAllChildNode" resultType="org.springblade.manager.entity.WbsTreePrivate"></select>
+    <select id="testFormInit" resultType="java.lang.Long">
+        SELECT
+            p_key_id
+        FROM
+            m_wbs_tree_private
+        WHERE
+            project_id = #{projectId}
+            AND wbs_id = #{wbsId}
+            AND parent_id = #{id}
+            AND type = 2
+            AND STATUS = 1
+            AND is_deleted = 0
+            AND table_owner = 7
+            AND locate( '__', node_name ) = 0
+            /*解决不同合同段中复制表问题*/
+            <if test="contractId == null">
+                -- 后管加载原始表
+                AND trial_tab_contract_id is null
+            </if>
+            <if test="contractId != null and contractId != ''">
+                -- 客户端加载当前合同段表+原始表
+                AND (trial_tab_contract_id is null OR (trial_tab_contract_id = #{contractId}))
+            </if>
+    </select>
 </mapper>

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

@@ -57,4 +57,5 @@ public interface IWbsFormElementService extends BaseService<WbsFormElement> {
 
     boolean saveRelation(FormElementDTO2 formElementDTO);
 
+    Boolean checkTableExist(String nodeId, String tableName);
 }

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

@@ -458,7 +458,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 /*用来保存日志执行情况*/
                 FormulaLog log = new FormulaLog();
                 /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
-                List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify(), tableInfoList.get(0).getTestGroupId());
+                List<NodeTable> tableAll = new ArrayList<>();
+                if(type.equals(ExecuteType.LOGINFO)){
+                   List<String> pids = tableInfoList.stream().map(TableInfo::getPkeyId).collect(Collectors.toList());
+                   List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, pids));
+                   tableAll = BeanUtil.copyProperties(wbsTreePrivateList, NodeTable.class);
+                }else{
+                   tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type,tableInfoList.get(0).getClassify(), tableInfoList.get(0).getTestGroupId());
+                }
+
+
                 if (tableAll.size() > tableInfoList.size()) {
                     TableInfo example = tableInfoList.get(0);
 
@@ -527,6 +536,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         pKeyId = wtp.getPKeyId();
                         currentNode = createCurrentNode(wtp);
                         projectId = Long.parseLong(wtp.getProjectId());
+                    } else if (type.equals(ExecuteType.LOGINFO)) {
+                        WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, nodeId));
+                        pKeyId = wtp.getPKeyId();
+                        currentNode = createCurrentNode(wtp);
+                        projectId = Long.parseLong(wtp.getProjectId());
+                        contractId = Func.toLong(tableInfoList.get(0).getContractId());
                     }
                     if (currentNode != null) {
                         TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
@@ -6452,6 +6467,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             exctabCell.setIsDeleted(0);
             exctabCell.setTextInfo(title);
             exctabCell.setCreateTime(new Date());
+            exctabCell.setExid(SnowFlakeUtil.getId());
 
             if (title.contains("日期") || title.contains("年") || title.contains("月") || title.contains("日")) {
                 //日期

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

@@ -1210,7 +1210,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService calculate(TableElementConverter tec) {
-        if (ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+        if (ExecuteType.INSPECTION.equals(tec.getExecuteType()) || ExecuteType.LOGINFO.equals(tec.getExecuteType())) {
             /*天气*/
             weather(tec);
         }
@@ -1218,7 +1218,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         tec.formDataMap.putAll(baseMap);*/
         /*通用计算*/
         generalCalc(tec);
-        if (ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+        if (ExecuteType.INSPECTION.equals(tec.getExecuteType())|| ExecuteType.LOGINFO.equals(tec.getExecuteType()) ) {
             if (tec.isNew) {
                 //TODO
             } else {
@@ -2215,8 +2215,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*ids 表流水号 projectId项目 nodeId工序节点的pkeyId ExecuteType执行模式 质检或者试验 首件*/
         if (executeType.equals(ExecuteType.INSPECTION)) {
             return listForContract(ids, projectId, nodeId);
-        } else if (executeType.equals(ExecuteType.TESTING)) {
+        } else if (executeType.equals(ExecuteType.TESTING) ) {
             return listForPrivate(ids, projectId, nodeId);
+        } else if (executeType.equals(ExecuteType.LOGINFO) ) {
+            return listForPrivateByLog(ids, projectId, nodeId);
         }
         return Collections.emptyList();
     }
@@ -4991,6 +4993,24 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return Collections.emptyList();
     }
 
+    private List<KeyMapper> listForPrivateByLog(List<Long> ids, String projectId, String nodeId) {
+        /**/
+        List<Map<String, Object>> listMap = listMap(ids, ExecuteType.TESTING);
+        List<KeyMapper> list = listMap.stream().map(m -> BeanUtil.toBean(m, KeyMapper.class)).collect(Collectors.toList());
+        if (Func.isNotEmpty(listMap)) {
+            WbsTreePrivate wtp = this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, nodeId));
+            List<Map<String, Object>> efMap = this.jdbcTemplate.queryForList("select element_id elementId,formula_id formulaId,scope " +
+                    "from m_element_formula_mapping " +
+                    "where element_id in(" + list.stream().map(KeyMapper::getFieldId).distinct().map(Func::toStr).collect(Collectors.joining(",")) + ") " +
+                    "and is_deleted=0 " + " and ( scope<2 or (scope =10 and project_id = " + projectId + ") or (scope=20 and project_id =" + projectId + " and node_id=" + wtp.getId() + "))");
+            setFormula(list, efMap);
+            if (list.size() > 0) {
+                return list;
+            }
+        }
+        return Collections.emptyList();
+    }
+
     /*获取计量公式,计量表是被动加载的,也不存在表单,所以需要根据计量类型获取*/
     private void listForMeter(List<FormData> curFormDatas, String projectId, String parentId) {
         List<WbsTreePrivate> wtpList = this.wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getParentId, parentId));

+ 23 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -27,6 +27,7 @@ import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.StringCNUtils;
 import org.springblade.manager.utils.WbsElementUtil;
 import org.springblade.manager.vo.WbsFormElementVO;
 import org.springblade.manager.vo.WbsFormElementVO2;
@@ -644,9 +645,15 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     firstWbsFormElement = wbsFormElements.stream().findFirst().orElse(wbsFormElements.get(wbsFormElements.size() - 1));
 
                     //去重,元素表中名称已存在的元素不添加
-                    newList = formElementDTO.getElementList().stream().filter(a ->
-                            !wbsFormElements.stream().map(WbsFormElement::getEName).collect(Collectors.toList()).contains(a.getEName())
-                    ).collect(Collectors.toList());
+                    newList = formElementDTO.getElementList().stream().filter(a -> {
+//                            !wbsFormElements.stream().map(WbsFormElement::getEName).collect(Collectors.toList()).contains(a.getEName())
+                        for (WbsFormElement element : wbsFormElements) {
+                            if (StringCNUtils.compareStringIgnoreSpace(a.getEName(), element.getEName())) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }).collect(Collectors.toList());
 
                 } else {
                     //不存在元素
@@ -794,6 +801,15 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         return true;
     }
 
+    @Override
+    public Boolean checkTableExist(String nodeId, String tableName) {
+        if (tableName == null || tableName.trim().isEmpty()) {
+            throw new ServiceException("请输入表名");
+        }
+        Long l = wbsTreeMapper.selectCount(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getParentId, nodeId).eq(WbsTree::getNodeName, tableName.trim()).eq(WbsTree::getStatus, 1).eq(WbsTree::getType, 2));
+        return l != null && l > 0;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public boolean saveFormElement(FormElementDTO2 formElementDTO) {
         //获取新增节点ids
@@ -919,6 +935,10 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
             if (Func.toLong(dept.getParentId()) == Func.toLong(dept.getId())) {
                 throw new ServiceException("父节点不可选择自身!");
             }
+            Boolean exist = checkTableExist(dept.getParentId() + "", dept.getNodeName());
+            if (exist) {
+                throw new ServiceException("当前元素表已存在 (" + dept.getNodeName() + "), 不允许新增");
+            }
             dept.setTenantId(parent.getTenantId());
             String ancestors = parent.getAncestors() + StringPool.COMMA + dept.getParentId();
             dept.setAncestors(ancestors);

+ 5 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ComplexStringComparator.java

@@ -66,7 +66,11 @@ public class ComplexStringComparator<T> implements Comparator<T> {
 
         if (buffer.length() > 0) {
             if (numFlag == 1) {
-                parts.add(Integer.parseInt(buffer.toString()));
+                try {
+                    parts.add(Integer.parseInt(buffer.toString()));
+                } catch (NumberFormatException e) {
+                    parts.add(buffer.toString());
+                }
             } else {
                 parts.add(buffer.toString());
             }

+ 77 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/StringCNUtils.java

@@ -0,0 +1,77 @@
+package org.springblade.manager.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StringCNUtils {
+    private static final Map<Character, Character> SYMBOL_MAP = new HashMap<>();
+
+    static {
+        SYMBOL_MAP.put(',', ',');
+        SYMBOL_MAP.put('。', '.');
+        SYMBOL_MAP.put(';', ';');
+        SYMBOL_MAP.put(':', ':');
+        SYMBOL_MAP.put('?', '?');
+        SYMBOL_MAP.put('!', '!');
+        SYMBOL_MAP.put('“', '"');
+        SYMBOL_MAP.put('”', '"');
+        SYMBOL_MAP.put('‘', '\'');
+        SYMBOL_MAP.put('’', '\'');
+        SYMBOL_MAP.put('(', '(');
+        SYMBOL_MAP.put(')', ')');
+        SYMBOL_MAP.put('【', '[');
+        SYMBOL_MAP.put('】', ']');
+        SYMBOL_MAP.put('《', '<');
+        SYMBOL_MAP.put('》', '>');
+        SYMBOL_MAP.put('—', '-');
+        SYMBOL_MAP.put('…', '.');
+    }
+
+    /**
+     * 将中文符号替换为英文符号
+     * @param text 中文文本
+     * @return 替换后的英文文本
+     */
+    public static String replaceChineseSymbolsEfficiently(String text) {
+        if (text == null) return null;
+        StringBuilder sb = new StringBuilder(text.length());
+        for (int i = 0; i < text.length(); i++) {
+            char ch = text.charAt(i);
+            Character replacement = SYMBOL_MAP.get(ch);
+            if (replacement != null) {
+                sb.append(replacement);
+            } else {
+                sb.append(ch);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 比较两个字符串是否相等,忽略空格
+     * 将中文标点符号转换为英文标点符号后在比较
+     */
+    public static boolean compareStringIgnoreSpace(String a, String b) {
+        if (a == null || b == null) {
+            return false;
+        }
+        a = a.replaceAll("\\s", "");
+        b = b.replaceAll("\\s", "");
+        if (a.equals(b)) {
+            return true;
+        }
+        return replaceChineseSymbolsEfficiently(a).equals(replaceChineseSymbolsEfficiently(b));
+    }
+
+    /**
+     * 比较两个字符串是否相等,忽略空格,忽略所有中文标点符号和英文标点符号
+     */
+    public static boolean compareStringIgnoreSpaceAndSymbols(String a, String b) {
+        if (a == null || b == null) {
+            return false;
+        }
+        return a.replaceAll("\\p{Punct}\\s", "").equals(b.replaceAll("\\p{Punct}\\s", ""));
+    }
+
+
+}

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MaterialStartStatementMapper.xml

@@ -25,7 +25,7 @@
         <result column="pre_pdf_url" property="prePdfUrl"/>
     </resultMap>
     <select id="page2" resultType="org.springblade.meter.vo.MaterialStartStatementVO">
-        select IFNULL(pre_pdf_url,raw_url) as pre_pdf_url,mss.*,
+        select if(pre_pdf_url is null or pre_pdf_url = '',raw_url,pre_pdf_url) as pre_pdf_url,mss.*,
                (select id from u_task where form_data_id = mss.meter_period_id and is_deleted = 0 and status in (1,2)) as taskId
         from s_material_start_statement mss
         where contract_id = #{statement.contractId} and type = #{statement.type} and is_deleted = 0

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DictBizMapper.xml

@@ -41,7 +41,7 @@
             and parent_id > 0
         </if>
         <if test="tenantId != null and tenantId != ''">
-            and tenantId = #{tenantId}
+            and tenant_id = #{tenantId}
         </if>
         and is_sealed = 0 and is_deleted = 0
         order by sort

+ 4 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -17,6 +17,7 @@ import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
+import org.springblade.manager.vo.WbsTreeContractTreeAllVO;
 import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.util.ComplexStringComparator;
 import org.springblade.system.user.vo.InformationQueryBIMVO;
@@ -30,6 +31,8 @@ import org.springframework.web.bind.annotation.*;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping(value = "/wbs")
@@ -100,7 +103,7 @@ public class WbsTreeController extends BladeController {
                         .thenComparing(new ComplexStringComparator<>(obj ->
                                 obj.getTitle() != null ? obj.getTitle() : ""))
                         .thenComparing(Comparator.comparing(
-                                WbsTreeContractLazyVO::getCreateTime,
+                                WbsTreeContractLazyVO::getPrimaryKeyId,
                                 Comparator.nullsLast(Comparator.reverseOrder()))
                         );
                 //对结果进行排序

+ 3 - 3
blade-service/blade-user/src/main/java/org/springblade/system/user/util/ComplexStringComparator.java

@@ -31,8 +31,8 @@ public class ComplexStringComparator<T> implements Comparator<T> {
             Object p1 = parts1.get(i);
             Object p2 = parts2.get(i);
 
-            if (p1 instanceof Long && p2 instanceof Long) {
-                int cmp = ((Long) p1).compareTo((Long) p2);
+            if (p1 instanceof Integer && p2 instanceof Integer) {
+                int cmp = ((Integer) p1).compareTo((Integer) p2);
                 if (cmp != 0) return cmp;
             } else {
                 int cmp = p1.toString().compareTo(p2.toString());
@@ -69,7 +69,7 @@ public class ComplexStringComparator<T> implements Comparator<T> {
         if (buffer.length() > 0) {
             if (numFlag == 1) {
                 try {
-                    parts.add(Long.parseLong(buffer.toString()));
+                    parts.add(Integer.parseInt(buffer.toString()));
                 } catch (NumberFormatException e) {
                     parts.add(buffer.toString());
                 }