浏览代码

Merge remote-tracking branch 'origin/master' into master

yangyj 1 年之前
父节点
当前提交
8f40138b1e
共有 20 个文件被更改,包括 643 次插入280 次删除
  1. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskFailedPageVO.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java
  3. 7 1
      blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/TableDataVO.java
  4. 7 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java
  5. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  6. 0 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveProjectConfigServiceImpl.java
  7. 14 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  8. 44 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  9. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  10. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  11. 5 0
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.java
  12. 21 0
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.xml
  13. 353 231
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java
  14. 76 7
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/CompensationInfoServiceImpl.java
  15. 37 0
      blade-service/blade-land/src/main/java/org/springblade/land/utils/CommonUtils.java
  16. 5 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  17. 12 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  18. 13 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  19. 9 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  20. 18 3
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskFailedPageVO.java

@@ -25,6 +25,12 @@ public class BusinessTaskFailedPageVO implements Serializable {
     @ApiModelProperty(value = "电签状态名称")
     private String eVisaStatusName;
 
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+
     @ApiModelProperty(value = "审批时间")
     private String eVisaUpdateDate;
 

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

@@ -42,6 +42,9 @@ public class TaskApprovalVO {
     @ApiModelProperty("签字人名")
     private String nickName;
 
+    @ApiModelProperty("重签对应的原始签字人名")
+    private String ysNickName;
+
     @ApiModelProperty("附件信息")
     private List<ApprovalFile> approvalFileList = new ArrayList<>();
 

+ 7 - 1
blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/TableDataVO.java

@@ -29,7 +29,13 @@ public class TableDataVO {
     @ApiModelProperty(value = "行")
     private Integer dictRow;
 
-    @ApiModelProperty(value = "字典值")
+    @ApiModelProperty(value = "element的字典值")
     private Integer dictValue;
 
+    @ApiModelProperty(value = "映射表id")
+    private Long linkId;
+
+    @ApiModelProperty(value = "tableId")
+    private Long tableId;
+
 }

+ 7 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -155,7 +155,6 @@ public class ProjectInfo extends BaseEntity {
      */
     private Integer isArchivesAuto;
 
-
     /**
      * wbs私有树引用wbs模板类型--征拆
      */
@@ -167,4 +166,11 @@ public class ProjectInfo extends BaseEntity {
      */
     @ApiModelProperty(value = "wbs私有树引用wbs模板id--征拆")
     private String referenceWbsTemplateTypeLar;
+
+    /**
+     * 审批类型(电签方式) 1=垂直审批(顺序审批) 2=平行审批
+     */
+    @ApiModelProperty(value = "审批类型(电签方式) 1=垂直审批(顺序审批) 2=平行审批")
+    private Integer approvalType;
+
 }

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

@@ -264,4 +264,10 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "数据分组Id")
     private Long tabGroupId;
 
+    /**
+     * 填报率
+     */
+    @ApiModelProperty(value = "实际填报率")
+    private Integer realFillRate;
+
 }

+ 0 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveProjectConfigServiceImpl.java

@@ -23,7 +23,6 @@ public class ArchiveProjectConfigServiceImpl extends BaseServiceImpl<ArchiveProj
     @Override
     public ArchiveProjectConfig getByProjectIdOrNew(Long projectId) {
         List<ArchiveProjectConfig> configs = baseMapper.selectList(new LambdaQueryWrapper<ArchiveProjectConfig>()
-                .eq(ArchiveProjectConfig::getTenantId, SecureUtil.getTenantId())
                 .eq(ArchiveProjectConfig::getProjectId, projectId)
                 .last("LIMIT 1")
         );

+ 14 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -519,13 +519,25 @@ public class FileUtils {
                         BladeFile bladeFile = newIOSSClient.uploadFile(absoluteFileName, filePath);
                         //BladeFile bladeFile  = newIOSSClient.uploadFile(fileName,filePath,OssConstant.ARCHIVE_DIRECTORY,projectId);
                         result.add(bladeFile.getLink());
-//                        File f = new File(filePath);
-//                        f.deleteOnExit();
+
+
                     } else {
                         result.add(filePath);
                     }
 
                     out.close();
+
+                    //删除临时文件
+                    try {
+                        File fileToDelete = new File(filePath);
+                        if (fileToDelete.exists()) {
+                            fileToDelete.delete();
+                            log.info("已删除临时文件:" + filePath);
+                        }
+                    } catch (Exception ex) {
+                        ex.printStackTrace();
+                    }
+
                     e = System.currentTimeMillis();
                     log.info("pdf打码耗时:"+(e-s));
                 } catch (Exception e) {

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

@@ -47,6 +47,7 @@ import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.vo.SendPageVO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
+import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ExcelTabClient;
 import org.springblade.resource.feign.CommonFileClient;
@@ -301,7 +302,7 @@ public class TaskController extends BladeController {
     }
 
     /**
-     * 批量审批(质检、试验 平行审批)
+     * 批量审批(质检、试验 平行或垂直审批)
      */
     @PostMapping("/batch-complete-approval-task")
     @ApiOperationSupport(order = 8)
@@ -311,6 +312,44 @@ public class TaskController extends BladeController {
         String parallelProcessInstanceIds = batchTaskVO.getParallelProcessInstanceIds();
         if (StringUtils.isNotEmpty(taskIds)) {
             String[] taskIdArray = taskIds.split(",");
+            if (taskIdArray.length == 0) {
+                throw new ServiceException("未获取到任务信息");
+            }
+
+            //校验当前项目是否为垂直审批
+            List<Task> taskList = taskService.getBaseMapper().selectList(Wrappers.<Task>lambdaQuery().select(Task::getProjectId, Task::getTaskName, Task::getProcessInstanceId).in(Task::getId, Arrays.asList(taskIdArray)));
+            for (Task task : taskList) {
+                if (ObjectUtil.isEmpty(task.getProjectId())) {
+                    throw new ServiceException("未获取到任务【" + task.getTaskName() + "】对应的项目信息");
+                }
+                ProjectInfo projectInfo = jdbcTemplate.query("select approval_type from m_project_info where id = " + task.getProjectId(), new BeanPropertyRowMapper<>(ProjectInfo.class)).stream().findAny().orElse(null);
+                //如果是垂直审批,那么检查当前用户是否符合当前顺序
+                if (projectInfo != null && projectInfo.getApprovalType() != null && new Integer(1).equals(projectInfo.getApprovalType())) {
+                    List<TaskParallel> taskParallelList = jdbcTemplate.query("select id,process_instance_id,task_user,task_user_name,status from u_task_parallel where process_instance_id ='" + task.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(TaskParallel.class));
+                    taskParallelList.sort(Comparator.comparing(TaskParallel::getId)); //根据id排序
+                    Map<String, List<TaskParallel>> taskParallelGroup = taskParallelList.stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+                    for (Map.Entry<String, List<TaskParallel>> taskObj : taskParallelGroup.entrySet()) {
+                        //获取当前审批人前面的审批人信息
+                        List<TaskParallel> frontTaskUser = new LinkedList<>();
+                        for (TaskParallel taskParallel : taskObj.getValue()) {
+                            Long userId = SecureUtil.getUserId();
+                            if (!userId.toString().equals(taskParallel.getTaskUser())) {
+                                frontTaskUser.add(taskParallel);
+                            } else {
+                                //如果是当前的审批人,那么直接跳过
+                                break;
+                            }
+                        }
+                        List<TaskParallel> resultTaskStatus = frontTaskUser.stream().filter(f -> !f.getStatus().equals(2)).collect(Collectors.toList());
+                        if (resultTaskStatus.size() > 0) {
+                            String names = resultTaskStatus.stream().map(TaskParallel::getTaskUserName).collect(Collectors.joining("、"));
+                            throw new ServiceException("当前任务【" + task.getTaskName() + "】还有【" + names + "】未完成审批,请您稍后再试");
+                        }
+                    }
+                }
+            }
+
+            //正常流程(平行签直接执行,垂直签会校验完再执行)
             String[] parallelProcessInstanceIdArray = parallelProcessInstanceIds.split(",");
             String[] approvalType = batchTaskVO.getApprovalType().split(",");
             String[] formDataId = batchTaskVO.getFormDataId().split(",");
@@ -1427,6 +1466,8 @@ public class TaskController extends BladeController {
                     BusinessTaskFailedPageVO vo = new BusinessTaskFailedPageVO();
                     vo.setId(task.getId());
                     vo.setTaskName(task.getTaskName());
+                    vo.setStartTime(task.getStartTime());
+                    vo.setEndTime(task.getEndTime());
                     vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
                     vo.setEVisaStatusName("电签失败");
                     vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
@@ -1500,7 +1541,7 @@ public class TaskController extends BladeController {
                                 String resultIds = processInstanceIds.stream()
                                         .map(id -> "'" + id + "'")
                                         .collect(Collectors.joining(","));
-                                taskParallelGroupMap = jdbcTemplate.query("select parallel_process_instance_id,process_instance_id from u_task_parallel where process_instance_id in(" + resultIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+                                taskParallelGroupMap = jdbcTemplate.query("select parallel_process_instance_id,process_instance_id,task_user_name from u_task_parallel where process_instance_id in(" + resultIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
                             }
                             Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
 
@@ -1514,6 +1555,7 @@ public class TaskController extends BladeController {
                                     approvalVO.setApprovalType(1);
                                     approvalVO.setFormDataId(task.getFormDataId());
                                     approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
+                                    approvalVO.setYsNickName(taskParallel.getTaskUserName());
                                     taskApprovalVOS.add(approvalVO);
                                 }
                             }

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

@@ -40,7 +40,7 @@
     </update>
 
     <select id="queryCurrentContractImageFileType" resultType="java.lang.Integer">
-        select `type` from u_image_classification_file where contract_id = #{contractId} and is_deleted = 0
+        select `type` from u_image_classification_file where contract_id = #{contractId} and is_deleted = 0 and type > 0
     </select>
 
     <select id="queryCurrentClassifyAllFileCount" resultType="java.lang.Integer">

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -29,6 +29,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.evisa.redissionUtil.DistributedRedisLock;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
@@ -550,6 +551,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
         List<TaskBatch> taskList = new ArrayList<>();
         for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
+            //重签时,需要对应任务的签字人
+            if (ObjectUtil.isNotEmpty(taskApprovalVO.getYsNickName())){
+                nickName = taskApprovalVO.getYsNickName();
+            }
+
             //保存批次
             TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVO));
             taskBatch.setCreateUser(userId);

+ 5 - 0
blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.java

@@ -25,6 +25,7 @@ import org.springblade.land.entity.ClearingAgreementInfo;
 import org.springblade.land.entity.CompensationInfo;
 import org.springblade.land.entity.SettlementInterval;
 import org.springblade.land.vo.ClearingAgreementInfoVO;
+import org.springblade.land.vo.TableDataVO;
 import org.springblade.manager.entity.WbsFormElement;
 
 import java.util.List;
@@ -44,4 +45,8 @@ public interface ClearingAgreementInfoMapper extends BaseMapper<ClearingAgreemen
     List<WbsFormElement> getTableElement(@Param("tableId") Long tableId);
 
     List<AgreementLinkTable> getAllAssignTable(@Param("ids") List<Long> ids, @Param("tableName") String tableName);
+
+    List<TableDataVO> getAllDataByAgreeIds(@Param("ids") List<Long> ids);
+
+    List<WbsFormElement> getALLConfigByAgreeIds(@Param("ids") List<Long> ids);
 }

+ 21 - 0
blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.xml

@@ -27,4 +27,25 @@
             and name like CONCAT(CONCAT('%', #{info.name}), '%')
         </if>
     </select>
+    <select id="getAllDataByAgreeIds" resultType="org.springblade.land.vo.TableDataVO">
+        select tdi.p_key_id as pKeyId,tdi.tab_key as tabKey,tdi.key_val as tabVal,
+               SUBSTRING_INDEX(tdi.tab_key,"__",1) as dictKey,
+               SUBSTRING_INDEX( SUBSTRING_INDEX(tdi.tab_key,"__",-1),"_",1) as dictRow,
+               (select dynamic_dict from m_wbs_form_element WHERE f_id = alt.table_id and dynamic_dict > 0 and e_key = SUBSTRING_INDEX(tdi.tab_key,"__",1)) as dictValue,
+               alt.id as linkId,
+               alt.table_id as tableId
+        from l_agreement_link_table alt inner join table_data_info tdi on alt.table_data_id = tdi.p_key_id
+        WHERE alt.agreement_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getALLConfigByAgreeIds" resultType="org.springblade.manager.entity.WbsFormElement">
+        select * from m_wbs_form_element
+        where is_deleted = 0  and dynamic_dict > 0 and f_id in
+        (select table_id from l_agreement_link_table where is_deleted = 0 and agreement_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>)
+    </select>
 </mapper>

+ 353 - 231
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java

@@ -24,6 +24,7 @@ import org.springblade.land.mapper.ClearingAgreementInfoMapper;
 import org.springblade.land.mapper.CompensationInfoMapper;
 import org.springblade.land.mapper.SettlementIntervalMapper;
 import org.springblade.land.service.*;
+import org.springblade.land.utils.CommonUtils;
 import org.springblade.land.utils.FileUtils;
 import org.springblade.land.vo.AreaPictureVO;
 import org.springblade.land.vo.ClearingAgreementInfoVO;
@@ -31,6 +32,8 @@ import org.springblade.land.vo.TableDataVO;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -50,6 +53,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
     private final IAgreementLinkTableService linkTableService;
     private final NewIOSSClient newIOSSClient;
     private final IRegionTreeInfoService treeInfoService;
+    private final JdbcTemplate jdbcTemplate;
 
     /**
      * 新增或修改结算协议
@@ -67,37 +71,33 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         //是新增还是修改
         Boolean isAdd = false;
         List<Long> ids = Func.toLongList(agreementIds);
-        List<AgreementLinkTable> linkTables = new ArrayList<>();
         if (info.getId() == null) {
             isAdd = true;
-            //复制一份当前合同下对应的结算协议到中间表
-            Long agreeId = SnowFlakeUtil.getId();
-            //先新增中间表,
-            List<WbsTreePrivate> tables = compensationInfoService.getTables(info.getProjectId(), info.getType() + 3);
-            linkTables = tables.stream().map(l -> {
-                AgreementLinkTable table = new AgreementLinkTable();
-                table.setTableId(Long.parseLong(l.getInitTableId()));
-                table.setProjectId(info.getProjectId());
-//            table.setTableDataId(SnowFlakeUtil.getId());
-//            table.setId(SnowFlakeUtil.getId());
-                table.setAgreementId(agreeId);
-                table.setPrivateId(l.getId());
-                table.setSort(l.getSort());
-                table.setExcelId(l.getExcelId());
-                table.setHtmlUrl(l.getHtmlUrl());
-                table.setTableName(l.getNodeName());
-                return table;
-            }).collect(Collectors.toList());
-            linkTableService.saveBatch(linkTables);
-            info.setId(agreeId);
+            info.setId(SnowFlakeUtil.getId());
         } else {
-            //存在则直接获取所有结算表单
-            linkTables = linkTableService.getByAgreementId(info.getId());
+            //存在则删除所有结算表单
+            linkTableService.deleteByAgreementIds(Arrays.asList(info.getId()));
             //修改则先还原之前补偿协议的状态
             ClearingAgreementInfo agreementInfo = this.getById(info.getId());
             compensationInfoService.batchUpdateStatus(Func.toLongList(agreementInfo.getAgreementIds()), 0);
         }
-        //批量修改选中的状态
+        //复制一份当前合同下对应的结算协议到中间表
+        List<WbsTreePrivate> tables = compensationInfoService.getTables(info.getProjectId(), info.getType() + 3);
+        List<AgreementLinkTable> linkTables = tables.stream().map(l -> {
+            AgreementLinkTable table = new AgreementLinkTable();
+            table.setTableId(Long.parseLong(l.getInitTableId()));
+            table.setProjectId(info.getProjectId());
+            table.setAgreementId(info.getId());
+            table.setPrivateId(l.getId());
+            table.setSort(l.getSort());
+            table.setExcelId(l.getExcelId());
+            table.setHtmlUrl(l.getHtmlUrl());
+            table.setTableName(l.getNodeName());
+            return table;
+        }).collect(Collectors.toList());
+        //先保存中间表
+        linkTableService.saveBatch(linkTables);
+        //批量修改补偿协议状态
         compensationInfoService.batchUpdateStatus(ids, 1);
         //获取所有选中的补偿协议
         List<CompensationInfo> compensationInfos = compensationInfoService.listByIds(ids);
@@ -126,240 +126,348 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         } else {
             this.updateById(info);
         }
-        //循环结算协议的统计字段,把补偿协议统计出来的字段设置到结算协议
-        //生成封面
-        buildPdf1(linkTables.get(0), info.getStage());
-        //生成补偿结算表
-        buildPdf2(linkTables.get(1),info.getAreaId());
-        //生成补偿费发放统计表
-        buildPdf3(linkTables.get(2),ids);
-        //生成补偿费明细表
-//        buildPdf4();
-        //生成补偿资金数量分配表
-        //生成面积统计明细表
+        //自动生成后管配置的所有结算表单,超过一页自动分页
+        buildPdf(linkTables,info);
         //合并PDF
-//        try {
         this.mergePdfs(info.getId());
-//        }catch (Exception e){
-//            throw new ServiceException("合并PDF失败");
-//        }
-    }
 
-    private void buildPdf3(AgreementLinkTable linkTable,List<Long> ids) {
-        try {
-            List<WbsFormElement> list = baseMapper.getTableElement(linkTable.getTableId());
-            Map<String, Object> DataInfo = new HashMap<>();
-            //获取所有的补偿协议映射表中的发放表
-            List<AgreementLinkTable> assignTable = baseMapper.getAllAssignTable(ids, "发放表");
-            List<Long> longs = assignTable.stream().map(l -> l.getTableDataId()).collect(Collectors.toList());
-            //获取发放表的配置
-            List<WbsFormElement> dataElements = baseMapper.getTableElement(assignTable.get(0).getTableId());
-            if (dataElements == null || dataElements.size() == 0){
-                compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-            }
-            Map<String, Integer> dataMap = dataElements.stream().collect(Collectors.toMap(WbsFormElement::getEKey, WbsFormElement::getDynamicDict));
-            //获取所有补偿费发放表中的数据
-            List<TableDataVO> dataVOS = compensationInfoMapper.getBussDataInfoByDataIds(longs);
-            dataVOS = dataVOS.stream().filter(l -> dataMap.get(l.getDictKey()) != null).collect(Collectors.toList());
-            if (dataVOS.size() == 0){
-                compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-            }
-            dataVOS.stream().forEach(l->l.setDictValue(dataMap.get(l.getDictKey())));
-            Map<Integer, List<TableDataVO>> listMap = dataVOS.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
+    }
 
-            if (list != null && list.size() > 0) {
-                //字典为key,位置为value
-                Map<Integer, String> elementMap = list.stream().collect(Collectors.toMap(WbsFormElement::getDynamicDict, WbsFormElement::getEKey));
-                //位置为key,字典为value
-                Map<String, Integer> overMap = list.stream().collect(Collectors.toMap(WbsFormElement::getEKey, WbsFormElement::getDynamicDict));
-                //解析html获取所以实际的key
-                Document doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
-//                Document doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1704076712393834496.html"), "utf-8");
-                Element table = doc.select("table").first();
-                //此表key重复,直接获取所有
-                List<TableDataVO> allKey = table.getElementsByAttribute("id").stream().map(l -> {
-                    TableDataVO vo = new TableDataVO();
-                    String s = l.attr("id");
-                    vo.setTabKey(s);
-                    if (s.contains("__")) {
-                        String[] s1 = s.split("__");
-                        vo.setDictKey(s1[0]);
-                        String[] s2 = s1[1].split("_");
-                        vo.setDictRow(Integer.parseInt(s2[0]));
-                    }
-                    return vo;
-                }).collect(Collectors.toList());
-                allKey = allKey.stream().filter(l -> overMap.get(l.getDictKey()) != null).collect(Collectors.toList());
-                if (allKey.size() == 0){
-                    compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-                }
-                allKey.stream().forEach(l->l.setDictValue(overMap.get(l.getDictKey())));
-                Map<Integer, List<TableDataVO>> listMap2 = allKey.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
-                //重复key的字典
-                List<Integer> batchKey = Arrays.asList(4, 5, 10, 11);
+    /**
+     * 整合生成所有结算PDF
+     */
+    private void buildPdf(List<AgreementLinkTable> list,ClearingAgreementInfo info){
+        List<Long> agreeIds = Func.toLongList(info.getAgreementIds());
+        //获取选择的补偿协议下所有的填报数据
+        List<TableDataVO> dataVOS = baseMapper.getAllDataByAgreeIds(agreeIds);
+        //填报数据按照字典分组
+        Map<Integer, List<TableDataVO>> allDataMap = dataVOS.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
+        //获取结算协议所有表单的配置
+        List<Long> endTableIds = list.stream().map(l -> l.getTableId()).collect(Collectors.toList());
+        List<WbsFormElement> endConfigs = compensationInfoMapper.getTableElement(endTableIds);
+        //配置按照tableId分组
+        Map<String, List<WbsFormElement>> endAllConfigMap = endConfigs.stream().collect(Collectors.groupingBy(WbsFormElement::getFId));
+        //----------------------生成通用值--------------------------//
+        //周期格式
+        String stage = info.getStage();
+        stage = stage.substring(1,stage.length()-1);
+        //项目名称
+        String projectName = jdbcTemplate.queryForObject("select project_name from m_project_info where id = " + info.getProjectId(), String.class);
+        //当前时间
+        String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
+        //被征收土地桩号
+        String areaNumber = "当前区域未配置桩号";
+        RegionTreeInfo treeInfo = treeInfoService.getById(info.getAreaId());
+        if (StringUtils.isNotBlank(treeInfo.getStakeMark())){
+            areaNumber = treeInfo.getStakeMark();
+        }
+        //----------------------字典分类--------------------------//
+        //确定长度的key的字典,因为其他字段可能为空,姓名不为空,所以通过姓名获取数据长度
+        Integer nameDict = 80;
+        //重复key的字典,目前只根据发放表,到时候根据主表附表再分配
+        //80户主姓名,81身份证号,82土地金额,83青苗金额,84地上金额,(400为83,84合并统计)85时段奖,86补偿金额合计,87银行卡号
+        List<Integer> batchKey2 = Arrays.asList(81,82,400,85, 86);
+        //------------------循环表单,为每张表生成值-----------------//
+        for (AgreementLinkTable linkTable : list) {
+            try {
                 //统计补偿总和
-                BigDecimal big = new BigDecimal(0);
-                for (Integer dict : elementMap.keySet()) {
-                    if (batchKey.contains(dict)) {
-                        //取出数据集合
-                        List<TableDataVO> voList = listMap.get(dict);
+                Map<Long,BigDecimal> big = new HashMap<>();
+                //土地总和
+                Map<Long,BigDecimal> big2 = new HashMap<>();
+                //青苗及地上总和
+                Map<Long,BigDecimal> big3 = new HashMap<>();
+                //时段奖总和
+                Map<Long,BigDecimal> big4 = new HashMap<>();
+                //当前数据的第一行
+                Integer oneRows = 0;
+                //生成结算表有多少行,用于跨页后复制表单
+                Integer oneTableRows = 0;
+                //判断每一张表有多少行,合并表时用于填充统计
+                Map<Long,Integer> tableRows = new LinkedHashMap<>();
+                //一共需要多少表
+                Integer tableTotal = 0;
+                //表单id,按顺序
+                LinkedList<Long> tableIds = new LinkedList<>();
+                Map<Long,Map<String, Object>> dataInfos = new LinkedHashMap<>();
+                //获取本表配置
+                List<WbsFormElement> configList = endAllConfigMap.get(linkTable.getTableId()+"");
+                //------------------当前表单没有配置字典直接跳过-----------------//
+                if (configList != null && configList.size() > 0) {
+                    //字典为key,位置为value
+                    Map<Integer, String> elementMap = configList.stream().collect(Collectors.toMap(WbsFormElement::getDynamicDict, WbsFormElement::getEKey));
+                    //位置为key,字典为value
+                    Map<String, Integer> overMap = configList.stream().collect(Collectors.toMap(WbsFormElement::getEKey, WbsFormElement::getDynamicDict));
+                    //解析html获取所以实际的key
+                    Document doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
+//                Document doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1704076903561822208.html"), "utf-8");
+                    Element table = doc.select("table").first();
+                    //此表key重复,直接获取所有
+                    List<TableDataVO> allKey = table.getElementsByAttribute("id").stream().map(l -> {
+                        TableDataVO vo = new TableDataVO();
+                        String s = l.attr("id");
+                        vo.setTabKey(s);
+                        if (s.contains("__")) {
+                            String[] s1 = s.split("__");
+                            vo.setDictKey(s1[0]);
+                            String[] s2 = s1[1].split("_");
+                            vo.setDictRow(Integer.parseInt(s2[0]));
+                        }
+                        return vo;
+                    }).collect(Collectors.toList());
+                    allKey = allKey.stream().filter(l -> overMap.get(l.getDictKey()) != null).collect(Collectors.toList());
+                    if (allKey.size() == 0) {
+                        continue;
+                    }
+                    allKey.stream().forEach(l -> l.setDictValue(overMap.get(l.getDictKey())));
+                    Map<Integer, List<TableDataVO>> listMap2 = allKey.stream().collect(Collectors.groupingBy(TableDataVO::getDictValue));
+                    //------------------有姓名,先生成姓名,姓名决定行数与是否分表-----------------//
+                    if (elementMap.get(nameDict) != null && StringUtils.isNotBlank(elementMap.get(nameDict))
+                            && allDataMap.get(nameDict) != null && allDataMap.get(nameDict).size() > 0) {
+                        List<TableDataVO> voList = allDataMap.get(nameDict);
                         //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
                         Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
                         List<Long> collect = map.keySet().stream().sorted().collect(Collectors.toList());
                         List<Object> data = new ArrayList<>();
                         for (Long aLong : collect) {
                             List<TableDataVO> vos = map.get(aLong);
-                            data.addAll(vos.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabVal()).collect(Collectors.toList()));
+                            tableRows.put(aLong, vos.size());
+                            vos = vos.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).collect(Collectors.toList());
+                            oneRows = vos.get(0).getDictRow();
+                            data.addAll(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()));
                         }
                         //取出位置集合
-                        List<TableDataVO> voList2 = listMap2.get(dict);
+                        List<TableDataVO> voList2 = listMap2.get(nameDict);
                         List<String> keys = new ArrayList<>();
-                        keys.addAll(voList2.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabKey()).collect(Collectors.toList()));
-                        //重置key位置,按照行从小到大
-                        //!!暂时没判断多页,到时候要分隔集合
-                        for (int i = 0; i < data.size(); i++) {
-                            DataInfo.put(keys.get(i), data.get(i));
-                            if (dict == 5) {
-                                big = big.add(new BigDecimal(data.get(i) + ""));
+                        voList2 = voList2.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).collect(Collectors.toList());
+                        keys.addAll(voList2.stream().map(l -> l.getTabKey()).collect(Collectors.toList()));
+                        //单表总行数
+                        oneTableRows = keys.size();
+                        //判断数据长度是否超过单表总行数
+                        List<List<Object>> lists = CommonUtils.splitList(data, oneTableRows);
+                        tableTotal = lists.size();
+                        for (int i = 0; i < tableTotal; i++) {
+                            Map<String, Object> DataInfo = new HashMap<>();
+                            if (i == 0){
+                                dataInfos.put(linkTable.getId(),DataInfo);
+                                tableIds.add(linkTable.getId());
+                            }else {
+                                //复制表,返回表id
+                                Long aLong = this.copyTable(linkTable);
+                                dataInfos.put(aLong,DataInfo);
+                                tableIds.add(aLong);
                             }
                         }
-                    }
-                }
-                for (Integer dict : elementMap.keySet()) {
-                    if (!batchKey.contains(dict)) {
-                        TableDataVO vo = listMap2.get(dict).get(0);
-                        switch (dict) {
-                            case 301:
-                                //合计补偿总计
-                                DataInfo.put(vo.getTabKey(), big);
-                                break;
-                            case 300:
-                                //统计员
-                                DataInfo.put(vo.getTabKey(), "王文");
-                                break;
+                        //为多表的统计字段设置默认值
+                        for (Long id : tableIds) {
+                            big.put(id,new BigDecimal(0));
+                            big2.put(id,new BigDecimal(0));
+                            big3.put(id,new BigDecimal(0));
+                            big4.put(id,new BigDecimal(0));
                         }
-                    }
-                }
 
-            }
-            compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-        } catch (Exception e) {
-            throw new ServiceException("补偿费发放统计表生成失败");
-        }
-    }
-
-    private void buildPdf2(AgreementLinkTable linkTable,Long areaId) {
-        List<WbsFormElement> list = baseMapper.getTableElement(linkTable.getTableId());
-        Map<String, Object> DataInfo = new HashMap<>();
-        try {
-            if (list != null && list.size() > 0) {
-                //字典为key,位置为value
-                Map<Integer, String> elementMap = list.stream().collect(Collectors.toMap(WbsFormElement::getDynamicDict, WbsFormElement::getEKey));
-                //解析html获取所以实际的key
-                Document doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
-//                Document doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1711593963032412160.html"), "utf-8");
-                Element table = doc.select("table").first();
-                //因为此表的key不会重复,所以直接转map
-                Map<String,String> tableKeys = new HashMap<>();
-                table.getElementsByAttribute("id").stream().forEach(l -> {
-                    String s = l.attr("id");
-                    if (s.contains("__")) {
-                        String[] s1 = s.split("__");
-                        tableKeys.put(s1[0], s);
+                        //多页分开存入
+                        for (int i = 0; i < tableTotal; i++) {
+                            Map<String, Object> DataInfo = dataInfos.get(tableIds.get(i));
+                            List<Object> data2 = lists.get(i);
+                            for (int j = 0; j < data2.size(); j++) {
+                                DataInfo.put(keys.get(j), data2.get(j));
+                            }
+                        }
+                        elementMap.remove(nameDict);
+                    }else {
+                        //没有姓名代表数据只有单表
+                        tableTotal = 1;
+                        Map<String, Object> DataInfo = new HashMap<>();
+                        dataInfos.put(linkTable.getId(),DataInfo);
+                        tableIds.add(linkTable.getId());
                     }
-                });
-                for (Integer dict : elementMap.keySet()) {
-                    String s1 = tableKeys.get(elementMap.get(dict));
-                    switch (dict){
-                        case 198:
-                            //当天日期
-                            DataInfo.put(s1,LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
-                            break;
-                        case 200:
-                            //申请单位
-                            DataInfo.put(s1,"重庆申请单位");
-                            break;
-                        case 201:
-                            //申请次数
-                            DataInfo.put(s1,5);
-                            break;
-                        case 202:
-                            //被征收土地桩号
-                            RegionTreeInfo treeInfo = treeInfoService.getById(areaId);
-                            if (StringUtils.isBlank(treeInfo.getStakeMark())){
-                                DataInfo.put(s1,"当前区域未配置桩号");
-                            }else {
-                                DataInfo.put(s1, treeInfo.getStakeMark());
+                    //------------------先设置批量字段,最后设置统计字段-----------------//
+                    for (Integer dict : elementMap.keySet()) {
+                        if (batchKey2.contains(dict)) {
+                            //获取本表数据
+                            List<Object> values = new ArrayList<>();
+                            if (dict.equals(400)) {
+                                //单独处理青苗+地面
+                                //取出83(青苗)数据集合
+                                List<TableDataVO> voList = new ArrayList<>();
+                                if (allDataMap.get(83) != null) {
+                                    voList = allDataMap.get(83);
+                                }
+                                //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
+                                Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
+                                //取出84(地面)数据集合
+                                List<TableDataVO> voList2 = new ArrayList<>();
+                                if (allDataMap.get(84) != null){
+                                    voList2 = allDataMap.get(84);
+                                }
+                                //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
+                                Map<Long, List<TableDataVO>> map2 = voList2.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
+                                //根据总行数和起始位置,生成青苗+地面的集合
+                                for (Long aLong : tableRows.keySet()) {
+                                    Integer ro = tableRows.get(aLong);
+                                    //获取当前表青苗集合,并且按照行转换为map
+                                    List<TableDataVO> vos = new ArrayList<>();
+                                    //因为可能整张表都没填写,所以为null
+                                    if (map.size() != 0 && map.get(aLong) != null) {
+                                        vos = map.get(aLong);
+                                    }
+                                    Map<Integer, BigDecimal> map3 = vos.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
+                                            Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+                                    //获取当前表地面集合
+                                    List<TableDataVO> vos2 = new ArrayList<>();
+                                    if (map2.size() != 0 && map2.get(aLong) != null) {
+                                        vos2 = map2.get(aLong);
+                                    }
+                                    Map<Integer, BigDecimal> map4 = vos2.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
+                                            Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+                                    for (int i = oneRows; i < (oneRows + ro); i++) {
+                                        BigDecimal value = new BigDecimal(0);
+                                        if (map3.size() != 0 && map3.get(i) != null) {
+                                            value = value.add(map3.get(i));
+                                        }
+                                        if (map4.size() != 0 && map4.get(i) != null) {
+                                            value = value.add(map4.get(i));
+                                        }
+                                        values.add(value);
+                                    }
+                                }
+                            } else {
+                                //取出数据
+                                List<TableDataVO> voList = new ArrayList<>();
+                                if (allDataMap.get(dict) != null) {
+                                    voList = allDataMap.get(dict);
+                                }
+                                //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
+                                Map<Long, List<TableDataVO>> map = voList.stream().collect(Collectors.groupingBy(TableDataVO::getPKeyId));
+                                for (Long aLong : tableRows.keySet()) {
+                                    Integer ro = tableRows.get(aLong);
+                                    //获取当前表青苗集合,并且按照行转换为map
+                                    List<TableDataVO> vos = new ArrayList<>();
+                                    if (map.size() != 0 && map.get(aLong) != null) {
+                                        vos = map.get(aLong);
+                                    }
+                                    Map<Integer, BigDecimal> map3 = vos.stream().collect(Collectors.groupingBy(TableDataVO::getDictRow,
+                                            Collectors.mapping(l -> new BigDecimal(l.getTabVal()), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+                                    for (int i = oneRows; i < (oneRows + ro); i++) {
+                                        BigDecimal value = new BigDecimal(0);
+                                        if (map3.size() != 0 && map3.get(i) != null) {
+                                            value = value.add(map3.get(i));
+                                        }
+                                        values.add(value);
+                                    }
+                                }
+                            }
+                            //取出位置集合
+                            List<TableDataVO> voList3 = listMap2.get(dict);
+                            List<String> keys = new ArrayList<>();
+                            keys.addAll(voList3.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabKey()).collect(Collectors.toList()));
+                            //判断数据长度是否超过单表总行数
+                            List<List<Object>> lists = CommonUtils.splitList(values, oneTableRows);
+                            //多页分开存入
+                            for (int i = 0; i < tableTotal; i++) {
+                                Map<String, Object> DataInfo = dataInfos.get(tableIds.get(i));
+                                List<Object> data2 = lists.get(i);
+                                for (int j = 0; j < data2.size(); j++) {
+                                    DataInfo.put(keys.get(j), data2.get(j));
+                                }
+                                if (dict == 82) {
+                                    //土地
+                                    big2.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                } else
+                                if (dict == 400) {
+                                    big3.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                } else
+                                if (dict == 85) {
+                                    //时段
+                                    big4.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                } else
+                                //如果是合计的就要添加进总合计
+                                if (dict == 86) {
+                                    big.put(tableIds.get(i),data2.stream().map(l -> new BigDecimal(l + "")).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                }
                             }
-                            break;
-                        case 203:
-                            //被征收土地单位
-                            DataInfo.put(s1,"重庆被征收单位");
-                            break;
-                        case 204:
-                            //本期补偿金额
-                            DataInfo.put(s1,"9000");
-                            break;
-                        case 205:
-                            //累计补偿金额
-                            DataInfo.put(s1,"15000");
-                            break;
+                        }
                     }
-                }
-            }
-            compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-        } catch (Exception e) {
-            throw new ServiceException("补偿结算表生成失败");
-        }
-    }
-
-
-    /**
-     * 生成封面
-     *
-     * @param linkTable 表单信息
-     * @param stage              第几期
-     */
-    private void buildPdf1(AgreementLinkTable linkTable, String stage) {
-        List<WbsFormElement> list = baseMapper.getTableElement(linkTable.getTableId());
-        Map<String, Object> DataInfo = new HashMap<>();
-        try {
-            if (list != null && list.size() > 0) {
-                //字典为key,位置为value
-                Map<Integer, String> elementMap = list.stream().collect(Collectors.toMap(WbsFormElement::getDynamicDict, WbsFormElement::getEKey));
-                //解析html获取所以实际的key
-                Document doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
-//                Document doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1711593963032412160.html"), "utf-8");
-                Element table = doc.select("table").first();
-                //因为此表的key不会重复,所以直接转map
-                Map<String,String> tableKeys = new HashMap<>();
-                table.getElementsByAttribute("id").stream().forEach(l -> {
-                    String s = l.attr("id");
-                    if (s.contains("__")) {
-                        String[] s1 = s.split("__");
-                        tableKeys.put(s1[0], s);
+                    //------------------再设置单个字段与统计字段----------------//
+                    for (Integer dict : elementMap.keySet()) {
+                        if (!batchKey2.contains(dict)) {
+                            TableDataVO vo = listMap2.get(dict).get(0);
+                            for (int i = 0; i < tableTotal; i++) {
+                                Map<String, Object> DataInfo = dataInfos.get(tableIds.get(i));
+                                switch (dict) {
+                                    case 197:
+                                        //项目名称
+                                        DataInfo.put(vo.getTabKey(), projectName);
+                                        break;
+                                    case 198:
+                                        //当天日期
+                                        DataInfo.put(vo.getTabKey(), date);
+                                        break;
+                                    case 199:
+                                        //周期
+                                        DataInfo.put(vo.getTabKey(), stage);
+                                        break;
+                                    case 200:
+                                        //申请单位
+                                        DataInfo.put(vo.getTabKey(),"重庆申请单位");
+                                        break;
+                                    case 201:
+                                        //申请次数
+                                        DataInfo.put(vo.getTabKey(),5);
+                                        break;
+                                    case 202:
+                                        //被征收土地桩号
+                                        DataInfo.put(vo.getTabKey(),areaNumber);
+                                        break;
+                                    case 203:
+                                        //被征收土地单位
+                                        DataInfo.put(vo.getTabKey(),"重庆被征收单位");
+                                        break;
+                                    case 204:
+                                        //本期补偿金额
+                                        DataInfo.put(vo.getTabKey(),"9000");
+                                        break;
+                                    case 205:
+                                        //累计补偿金额
+                                        DataInfo.put(vo.getTabKey(),"15000");
+                                        break;
+                                    case 301:
+                                        //合计补偿总计
+                                        DataInfo.put(vo.getTabKey(), big.get(tableIds.get(i)));
+                                        break;
+                                    case 401:
+                                        //制表人
+                                        DataInfo.put(vo.getTabKey(), "王文");
+                                        break;
+                                    case 402:
+                                        //总计土地
+                                        DataInfo.put(vo.getTabKey(), big2.get(tableIds.get(i)));
+                                        break;
+                                    case 403:
+                                        //总计青苗及地上
+                                        DataInfo.put(vo.getTabKey(), big3.get(tableIds.get(i)));
+                                        break;
+                                    case 404:
+                                        //总计时段奖
+                                        DataInfo.put(vo.getTabKey(), big4.get(tableIds.get(i)));
+                                        break;
+                                }
+                            }
+                        }
                     }
-                });
-                for (Integer dict : elementMap.keySet()) {
-                    String s1 = tableKeys.get(elementMap.get(dict));
-                    switch (dict){
-                        case 198:
-                            //当天日期
-                            DataInfo.put(s1,LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
-                            break;
-                        case 199:
-                            //周期
-                            DataInfo.put(s1,stage);
-                            break;
+                    //------------------分别为表单生成PDF----------------//
+                    for (Long aLong : dataInfos.keySet()) {
+                        compensationInfoService.getBussPdfInfo(aLong, dataInfos.get(aLong));
                     }
                 }
+            }catch (Exception e){
+                throw new ServiceException("生成:"+linkTable.getTableName()+"失败");
             }
-            compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
-        } catch (Exception e) {
-            throw new ServiceException("生成封面失败");
         }
     }
 
+
+
     /**
      * 分页查询结算周期
      *
@@ -381,6 +489,19 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         return linkTableService.getByAgreementId(id);
     }
 
+    /**
+     * 根据结算表单信息,复制表单,返回id
+     */
+    public Long copyTable(AgreementLinkTable linkTable){
+        Long id = SnowFlakeUtil.getId();
+        linkTable.setId(id);
+        Integer count = compensationInfoMapper.getTableCount(linkTable.getAgreementId(), linkTable.getTableId());
+        String[] s = linkTable.getTableName().split("__");
+        linkTable.setTableName(s[0]+"__"+ count);
+        linkTableService.save(linkTable);
+        return id;
+    }
+
     /**
      * 结算统计面积
      *
@@ -539,7 +660,8 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         List<String> data = new ArrayList<>();
         //获取协议所有的表单
         List<AgreementLinkTable> list = linkTableService.list(new LambdaQueryWrapper<AgreementLinkTable>()
-                .eq(AgreementLinkTable::getAgreementId, agreementId));
+                .eq(AgreementLinkTable::getAgreementId, agreementId)
+                .orderByAsc(AgreementLinkTable::getSort,AgreementLinkTable::getId));
         for (AgreementLinkTable table : list) {
             if (StringUtils.isNotEmpty(table.getPdfUrl())) {
                 data.add(table.getPdfUrl());

+ 76 - 7
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/CompensationInfoServiceImpl.java

@@ -199,13 +199,55 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         Map<String, Object> reData = new HashMap<>();
         //获取表单数据
         List<Map<String, Object>> mapList = baseMapper.getBussDataInfo(linkId);
-        //表单没有保存过
-        if (mapList == null || mapList.size() == 0){
-            return R.data(null);
+        //表单保存过才获取数据
+        if (mapList != null && mapList.size() > 0){
+            reData = mapList.stream().collect(
+                    Collectors.toMap(map1 -> (String) map1.get("tableKey"),
+                            map2 ->  map2.get("tableValue")));
+        }
+        //需要自动生成的字典集合,项目名称197
+        List<Integer> buildDict = Arrays.asList(197);
+        //获取当前表单
+        AgreementLinkTable linkTable = linkTableService.getById(linkId);
+        //获取当前表单配置字典
+        List<WbsFormElement> tableElement = baseMapper.getTableElement(Arrays.asList(linkTable.getTableId()));
+        Map<Integer, List<WbsFormElement>> map = tableElement.stream().collect(Collectors.groupingBy(WbsFormElement::getDynamicDict));
+        List<Integer> list = tableElement.stream().map(l -> l.getDynamicDict()).collect(Collectors.toList());
+        //获取当前表单内需要自动生成的字典
+        list.retainAll(buildDict);
+        //如果配置字典中包含需要自动生成的数据,才去执行
+        if (list.size() > 0) {
+            Document doc = null;
+            try {
+                doc = Jsoup.parse(new File(linkTable.getHtmlUrl()), "utf-8");
+//                doc = Jsoup.parse(new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1704045947043971072.html"), "utf-8");
+            } catch (IOException e) {
+                throw new ServiceException("解析表单html出错");
+            }
+            Element table = doc.select("table").first();
+            //因为当前配置的key不会重复,所以直接转map
+            Map<String,String> tableKeys = new HashMap<>();
+            table.getElementsByAttribute("id").stream().forEach(l -> {
+                String s = l.attr("id");
+                if (s.contains("__")) {
+                    String[] s1 = s.split("__");
+                    tableKeys.put(s1[0], s);
+                }
+            });
+            for (Integer dict : list) {
+                //解析当前所有的位置
+                String eKey = map.get(dict).get(0).getEKey();
+                String key = tableKeys.get(eKey);
+                //根据字典设置表单值
+                switch (dict){
+                    case 197 :
+                        //项目名称
+                        String projectName = jdbcTemplate.queryForObject("select project_name from m_project_info where id = " + linkTable.getProjectId(), String.class);
+                        reData.put(key,projectName);
+                        break;
+                }
+            }
         }
-        reData = mapList.stream().collect(
-                Collectors.toMap(map1 -> (String) map1.get("tableKey"),
-                map2 ->  map2.get("tableValue")));
         return R.data(reData);
     }
 
@@ -262,6 +304,10 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         BigDecimal a4 = new BigDecimal(0);
         //户主姓名(协议名称)
         Set<String> str = new HashSet<>();
+        //身份证长度
+        int size1 = 0;
+        //银行账号长度
+        int size2 = 0;
         CompensationInfo info = new CompensationInfo();
         info.setId(id);
         //查看当前表单是否配置统计值
@@ -344,17 +390,30 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                             //当前统计值
                             try {
                                 if (dict.equals(80)) {
-                                    str.add(StringUtils.join(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()), "、") + "、");
+                                    //户主姓名
+                                    List<String> list = vos.stream().sorted(Comparator.comparing(TableDataVO::getDictRow)).map(l -> l.getTabVal()).collect(Collectors.toList());
+                                    str.addAll(list);
+                                }else if (dict.equals(81)){
+                                    //身份证
+                                    size1 = vos.size();
                                 } else if (dict.equals(82)) {
+                                    //土地
                                     b1 = b1.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
                                 } else if (dict.equals(83)) {
+                                    //青苗
                                     b2 = b2.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
                                 } else if (dict.equals(84)) {
+                                    //地面
                                     b3 = b3.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
                                 } else if (dict.equals(85)){
+                                    //时段
                                     b4 = b4.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
                                 } else if (dict.equals(86)) {
+                                    //补偿合计
                                     b5 = b5.add(vos.stream().map(l -> new BigDecimal(l.getTabVal())).reduce(BigDecimal.valueOf(0), BigDecimal::add));
+                                } else if (dict.equals(87)){
+                                    //银行卡
+                                    size2 = vos.size();
                                 }
                             } catch (Exception e) {
                                 throw new ServiceException("金额字段不能包含其他字符,请重新填写");
@@ -362,6 +421,13 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                         }
                     }
                 }
+                //校验数据
+                if (str.size() != size1){
+                    throw new ServiceException("身份证信息请填写完整");
+                }
+                if (str.size() != size2){
+                    throw new ServiceException("银行卡信息请填写完整");
+                }
                 //设置名称
                 if (str.size() > 0){
                     info.setName(Joiner.on(",").join(str));
@@ -640,6 +706,9 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                 for(String key : tableInfo.keySet()){
                     if(key.contains("key")&&key.contains("__")){
                         Long id = SnowFlakeUtil.getId();
+                        if (StringUtils.isBlank(tableInfo.getString(key))){
+                            continue;
+                        }
                         list.add(new Object[]{id,linkTable.getTableDataId(),key,tableInfo.getString(key)});
 
                         Elements datas = doc.getElementsByAttributeValue("keyname", key);

+ 37 - 0
blade-service/blade-land/src/main/java/org/springblade/land/utils/CommonUtils.java

@@ -0,0 +1,37 @@
+package org.springblade.land.utils;
+
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/10/16 15:40
+ **/
+public class CommonUtils {
+    /**
+     * Description: Java8 Stream分割list集合
+     *
+     * @param list      集合数据
+     * @param splitSize 几个分割一组
+     * @return 集合分割后的集合
+     */
+    public static <T> List<List<T>> splitList(List<T> list, int splitSize) {
+        //判断集合是否为空
+        if (CollectionUtils.isEmpty(list))
+            return Collections.emptyList();
+        //计算分割后的大小
+        int maxSize = (list.size() + splitSize - 1) / splitSize;
+        //开始分割
+        return Stream.iterate(0, n -> n + 1)
+                .limit(maxSize)
+                .parallel()
+                .map(a -> list.parallelStream().skip(a * splitSize).limit(splitSize).collect(Collectors.toList()))
+                .filter(b -> !b.isEmpty())
+                .collect(Collectors.toList());
+    }
+}

+ 5 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -407,8 +407,9 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                                 .peek(vo -> {
                                     Integer colorStatus = informationQueryMaps.get(vo.getPKeyId());
                                     if (colorStatus != null) {
-                                        //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色、任务状态3=已废除=颜色1黑色
-                                        vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 1)));
+                                        //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色
+                                        ///*任务状态3=已废除=颜色1黑色*/(2023年10月16日13:59:00 已废除改为=颜色2蓝色)
+                                        vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
                                     } else {
                                         //未填报的=颜色1黑色
                                         vo.setColorStatus(1);
@@ -531,7 +532,8 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                                     .peek(vo -> {
                                         Integer colorStatus = informationQueryMaps.get(vo.getPKeyId());
                                         if (colorStatus != null) {
-                                            vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 1)));
+                                            ///*任务状态3=已废除=颜色1黑色*/(2023年10月16日13:59:00 已废除改为=颜色2蓝色)
+                                            vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
                                         } else {
                                             vo.setColorStatus(1);
                                         }

+ 12 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1509,6 +1509,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId, 0).getData();
+        //真实填报率
+        Integer realFillRate = 0;
+        //获取已经填报的数据
+        Long fillNumbers = DataInfo.keySet().stream().filter(e -> e.contains("__")).count();
 
         //获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
@@ -1585,10 +1589,17 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract.getHtmlUrl());
+//            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1578963584895942656.html");
             String htmlString = IoUtil.readToString(inputStreamByUrl);
 
             Document doc = Jsoup.parse(htmlString);
             Element table = doc.select("table").first();
+            //计算填报率
+            Long keySize = table.getElementsByAttribute("v-model").stream().count();
+            if (fillNumbers != 0 && keySize != 0){
+                Double v = fillNumbers.doubleValue() / keySize.doubleValue() * 100;
+                realFillRate = v.intValue();
+            }
             Elements trs = table.select("tr");
             if (ObjectUtil.isNotEmpty(DataInfo)) {
                 for (String val : DataInfo.keySet()) {
@@ -1832,6 +1843,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
         updateWrapper.in("p_key_id", pkeyId + "");
         updateWrapper.set("pdf_url", fileUrl);
+        updateWrapper.set("real_fill_rate", realFillRate);
         wbsTreeContractService.update(updateWrapper);
 
         //关闭流

+ 13 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -277,12 +277,14 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         }
                     });
                 }
-                List<String> nodeNames = tableNames.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
-                if (nodeNames.size() > 0) {
-                    String names = StringUtils.join(nodeNames, " , ");
-                    throw new ServiceException(StringUtil.format("节点下的 {} 中存在填报数据,删除失败!", names));
+                if (tableNames.size() > 0) {
+                    List<String> nodeNames = tableNames.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
+                    if (nodeNames.size() > 0) {
+                        String names = StringUtils.join(nodeNames, " , ");
+                        throw new ServiceException(StringUtil.format("节点下的 {} 中存在填报数据,删除失败!", names));
+                    }
+                    baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
                 }
-                baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
             }
 
             //TODO ---------新增---------
@@ -733,8 +735,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 .peek(vo -> {
                                     Integer colorStatus = queryInfoMaps.get(vo.getPKeyId());
                                     if (colorStatus != null) {
-                                        //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色、任务状态3=已废除=颜色1黑色
-                                        vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 1)));
+                                        //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色、
+                                        ///*任务状态3=已废除=颜色1黑色*/(2023年10月16日13:59:00 已废除改为=颜色2蓝色)
+                                        vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
                                     } else {
                                         //未填报的=颜色1黑色
                                         vo.setColorStatus(1);
@@ -866,8 +869,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                         .peek(vo -> {
                                             Integer colorStatus = queryInfoMaps.get(vo.getPKeyId());
                                             if (colorStatus != null) {
-                                                //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色、任务状态3=已废除=颜色1黑色
-                                                vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 1)));
+                                                //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色
+                                                ///*任务状态3=已废除=颜色1黑色*/(2023年10月16日13:59:00 已废除改为=颜色2蓝色)
+                                                vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
                                             } else {
                                                 //未填报的=颜色1黑色
                                                 vo.setColorStatus(1);

+ 9 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -860,17 +860,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getWbsId(), pawDTO.getProjectId(), ids1);
 
                         if (wbsTreeContractList.size() > 0) {
-                            List<ContractInfo> contractInfoArrayList = new ArrayList<>();
-                            wbsTreeContractList.forEach(list -> {
-                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
-                                        .select(ContractInfo::getContractName)
-                                        .eq(ContractInfo::getId, list.getContractId()));
-                                contractInfoArrayList.add(contractInfos);
-                            });
-                            List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
-                            if (wbsTreeContractList.size() > 0) {
+                            Set<String> contractIds = wbsTreeContractList.stream().map(WbsTreeContract::getContractId).collect(Collectors.toSet());
+                            List<ContractInfo> contractInfoArrayList = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().select(ContractInfo::getContractName).in(ContractInfo::getId, contractIds));
+                            if (contractInfoArrayList.size() > 0) {
+                                List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
                                 String join = StringUtils.join(names, ",");
-                                throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                                return R.fail(400, StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
                             }
                         }
 
@@ -902,15 +897,10 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getPrimaryKeyId(), pawDTO.getProjectId(), ids2);
 
                         if (wbsTreeContractList.size() > 0) {
-                            List<ContractInfo> contractInfoArrayList = new ArrayList<>();
-                            wbsTreeContractList.forEach(list -> {
-                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
-                                        .select(ContractInfo::getContractName)
-                                        .eq(ContractInfo::getId, list.getContractId()));
-                                contractInfoArrayList.add(contractInfos);
-                            });
-                            List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
-                            if (wbsTreeContractList.size() > 0) {
+                            Set<String> contractIds = wbsTreeContractList.stream().map(WbsTreeContract::getContractId).collect(Collectors.toSet());
+                            List<ContractInfo> contractInfoArrayList = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().select(ContractInfo::getContractName).in(ContractInfo::getId, contractIds));
+                            if (contractInfoArrayList.size() > 0) {
+                                List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
                                 String join = StringUtils.join(names, ",");
                                 return R.fail(400, StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
                             }

+ 18 - 3
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -499,7 +499,7 @@ public class UserController {
      * 定时同步白马项目用户信息
      */
     @Scheduled(cron = "0 0 4 * * ?")
-    //@Scheduled(cron = "0 */3 * * * ?")
+    //@Scheduled(cron = "0 */2 * * * ?")
     public void syncProjectUserInfo() throws ParseException, IOException {
         JSONObject json = new JSONObject();
         json.put("fn", "all");
@@ -522,6 +522,7 @@ public class UserController {
                         //String password = jsonObject.getString("password"); //MD5加密后的密码
                         String name = jsonObject.getString("name"); //人员姓名
                         String idCard = jsonObject.getString("idcard"); //身份证号
+                        String phone = jsonObject.getString("phone"); //电话号码
 
                         /*这里实际接口返回的数据都是companyName对应的公司名称*/
                         String companyName = jsonObject.getString("companyName"); //公司名称
@@ -569,9 +570,22 @@ public class UserController {
                                 || companyName.contains("重庆市交通工程监理咨询有限责任公司")
                                 || companyName.contains("中铁长江交通设计集团有限公司")
                                 || companyName.contains("中铁八局集团有限公司")) {
-                            Long sysUser = userService.getBaseMapper().selectCount(Wrappers.<User>lambdaQuery().eq(User::getSysId, id).eq(User::getSysType, 2));
+                            List<User> sysUser = userService.getBaseMapper().selectList(Wrappers.<User>lambdaQuery().eq(User::getSysId, id).eq(User::getSysType, 2));
+
+                            /*修改电话号码*/
+                            if (sysUser.size() > 0 && ObjectUtil.isNotEmpty(phone) && phone.length() == 11) {
+                                for (User user : sysUser) {
+                                    if (ObjectUtil.isEmpty(user.getPhone())) {
+                                        userService.lambdaUpdate()
+                                                .set(User::getPhone, phone)
+                                                .eq(User::getId, user.getId())
+                                                .update();
+                                    }
+                                }
+                            }
+
                             /*只有本系统不存在时才去新增*/
-                            if (sysUser == 0L) {
+                            if (sysUser.size() == 0L) {
                                 User newUser = new User();
                                 newUser.setId(SnowFlakeUtil.getId());
                                 newUser.setDeptId("1588069957940674562"); //白马部门
@@ -593,6 +607,7 @@ public class UserController {
                                 newUser.setStatus(Integer.parseInt(status));
                                 newUser.setIdNumber(idCard);
                                 newUser.setCompanyName(companyName);
+                                newUser.setPhone(ObjectUtil.isNotEmpty(phone) && phone.length() == 11 ? phone : null);
 
                                 //所有合同段(白马)
                                 if (companyName.contains("重庆白马航运发展有限公司")) {