Explorar o código

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

yangyj hai 1 ano
pai
achega
d3e5c4bc0e
Modificáronse 19 ficheiros con 693 adicións e 71 borrados
  1. 38 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskFailedDTO.java
  2. 40 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskFailedPageVO.java
  3. 22 0
      blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/ClearingAgreementInfoVO.java
  4. 10 0
      blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/TableDataVO.java
  5. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  6. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java
  7. 1 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  8. 208 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  9. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  10. 3 2
      blade-service/blade-land/src/main/java/org/springblade/land/controller/ClearingAgreementInfoController.java
  11. 10 1
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.java
  12. 16 2
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.xml
  13. 4 0
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/CompensationInfoMapper.java
  14. 15 3
      blade-service/blade-land/src/main/java/org/springblade/land/mapper/CompensationInfoMapper.xml
  15. 2 1
      blade-service/blade-land/src/main/java/org/springblade/land/service/IClearingAgreementInfoService.java
  16. 2 1
      blade-service/blade-land/src/main/java/org/springblade/land/service/ICompensationInfoService.java
  17. 263 30
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java
  18. 36 24
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/CompensationInfoServiceImpl.java
  19. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

+ 38 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskFailedDTO.java

@@ -0,0 +1,38 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 资料填报-任务管理-电签失败分页查询DTO
+ */
+@Data
+public class BusinessTaskFailedDTO implements Serializable {
+
+    @ApiModelProperty(value = "电签任务人")
+    private String eVisaUserName;
+
+    @ApiModelProperty(value = "合同段id")
+    private String contractId;
+
+    @ApiModelProperty(value = "电签状态")
+    private String eVisaStatus;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTimeValue;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTimeValue;
+
+    @ApiModelProperty(value = "任务名关键字查询输入框")
+    private String queryValue;
+
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+}

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

@@ -0,0 +1,40 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.TaskParallel;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 任务管理,电签失败pageVO
+ */
+@Data
+public class BusinessTaskFailedPageVO implements Serializable {
+
+    @ApiModelProperty(value = "任务id")
+    private Long id;
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "任务状态")
+    private String taskStatusName;
+
+    @ApiModelProperty(value = "电签状态名称")
+    private String eVisaStatusName;
+
+    @ApiModelProperty(value = "审批时间")
+    private String eVisaUpdateDate;
+
+    @ApiModelProperty(value = "电签失败原因")
+    private String eVisaFailedInfo;
+
+    @ApiModelProperty(value = "上报人")
+    private String taskReportUserName;
+
+    @ApiModelProperty(value = "签字人员集合(电签任务人)")
+    private List<TaskParallel> taskApproveUserNamesList;
+
+}

+ 22 - 0
blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/ClearingAgreementInfoVO.java

@@ -0,0 +1,22 @@
+package org.springblade.land.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.land.entity.ClearingAgreementInfo;
+import org.springblade.system.user.entity.User;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/10/12 16:59
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ClearingAgreementInfoVO extends ClearingAgreementInfo {
+
+    @ApiModelProperty(value = "用户集合")
+    private String typeValue;
+}

+ 10 - 0
blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/TableDataVO.java

@@ -22,4 +22,14 @@ public class TableDataVO {
 
     @ApiModelProperty(value = "表单字段值")
     private String tabVal;
+
+    @ApiModelProperty(value = "配置key")
+    private String dictKey;
+
+    @ApiModelProperty(value = "行")
+    private Integer dictRow;
+
+    @ApiModelProperty(value = "字典值")
+    private Integer dictValue;
+
 }

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

@@ -1,6 +1,7 @@
 package org.springblade.manager.feign;
 
 import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -45,5 +46,10 @@ public interface ExcelTabClient {
                             @RequestParam String tabIds,
                             @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception;
 
+    @PostMapping(API_PREFIX + "/synPDFInfo")
+    R synPDFInfo(@RequestParam String contractId,
+                 @RequestParam String nodeIds,
+                 @RequestParam String classify,
+                 @RequestParam String projectId) throws Exception;
 
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java

@@ -3,6 +3,7 @@ package org.springblade.manager.feign;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -38,4 +39,9 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
         return null;
     }
 
+    @Override
+    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId) throws Exception {
+        return null;
+    }
+
 }

+ 1 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -218,7 +218,6 @@ public class ArchiveFileTaskController extends BladeController {
         }
         if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
             sqlString.append(" AND start_time >= ?")
-                    .append(dto.getStartTimeValue())
                     .append(" AND end_time <= ?");
             params.add(dto.getStartTimeValue());
             params.add(dto.getEndTimeValue());
@@ -330,7 +329,7 @@ public class ArchiveFileTaskController extends BladeController {
                                 taskPa.setEVisaStatus(2);
                             } else if (taskPa.getStatus() == 3 && taskPa.getTaskUser().equals(SecureUtil.getUserId().toString())) {
                                 taskPa.setEVisaStatus(3);
-                            } else if (taskPa.getStatus() == 999) {
+                            } else if (ObjectUtil.isNotEmpty(taskPa.getEVisaStatus()) && taskPa.getEVisaStatus() == 99) {
                                 taskPa.setEVisaStatus(999);
                             } else {
                                 taskPa.setEVisaStatus(1);

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

@@ -26,6 +26,7 @@ import org.springblade.business.entity.*;
 import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
 import org.springblade.business.vo.*;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
@@ -47,9 +48,11 @@ import org.springblade.flow.core.vo.SendPageVO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ExcelTabClient;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.entity.Role;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
@@ -60,6 +63,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.*;
 import java.util.function.Function;
@@ -92,6 +96,7 @@ public class TaskController extends BladeController {
     private final ContractClient contractClient;
     private final IInformationQueryService informationQueryService;
     private final EVisaClient eVisaClient;
+    private final ExcelTabClient excelTabClient;
 
     /**
      * 记录短信验证码超时时间
@@ -1147,7 +1152,6 @@ public class TaskController extends BladeController {
         }
         if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
             sqlString.append(" AND start_time >= ?")
-                    .append(dto.getStartTimeValue())
                     .append(" AND end_time <= ?");
             params.add(dto.getStartTimeValue());
             params.add(dto.getEndTimeValue());
@@ -1276,7 +1280,7 @@ public class TaskController extends BladeController {
                                 taskPa.setEVisaStatus(2);
                             } else if (taskPa.getStatus() == 3 && taskPa.getTaskUser().equals(SecureUtil.getUserId().toString())) {
                                 taskPa.setEVisaStatus(3);
-                            } else if (taskPa.getStatus() == 999) {
+                            } else if (ObjectUtil.isNotEmpty(taskPa.getEVisaStatus()) && taskPa.getEVisaStatus() == 99) {
                                 taskPa.setEVisaStatus(999);
                             } else {
                                 taskPa.setEVisaStatus(1);
@@ -1336,5 +1340,207 @@ public class TaskController extends BladeController {
         }
     }
 
+    /**
+     * 任务管理-电签失败分页查询
+     */
+    @PostMapping("/eVisaFailedPage")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "任务管理-电签失败分页查询", notes = "传入BusinessTaskFailedDTO")
+    public R<IPage<BusinessTaskFailedPageVO>> eVisaFailedPage(@RequestBody BusinessTaskFailedDTO dto) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前登陆的用户信息");
+        } else {
+            if (!SecureUtil.getUser().getRoleName().contains("administrator")) {
+                return R.data(200, null, "当前用户不是超管角色,未查询到信息");
+            }
+        }
+        if (ObjectUtil.isEmpty(dto.getContractId())) {
+            throw new ServiceException("合同段不能为空");
+        }
+        if (ObjectUtil.isEmpty(dto.getCurrent()) || ObjectUtil.isEmpty(dto.getSize())) {
+            throw new ServiceException("分页current或size不能为空");
+        }
+
+        int current = dto.getCurrent();
+        int size = dto.getSize();
+
+        //封装入参SQL
+        List<Object> params = new ArrayList<>();
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND status = 1 AND approval_type != 4 AND contract_id = " + dto.getContractId()); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
+
+        if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
+            sqlString.append(" AND start_time >= ?")
+                    .append(" AND end_time <= ?");
+            params.add(dto.getStartTimeValue());
+            params.add(dto.getEndTimeValue());
+        }
+
+        if (StringUtils.isNotBlank(dto.getQueryValue())) {
+            sqlString.append(" AND task_name LIKE ?");
+            params.add("%" + dto.getQueryValue() + "%");
+        }
+
+        if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
+            sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3 AND u_task_parallel.task_user_name LIKE ?)");
+            params.add("%" + dto.getEVisaUserName() + "%");
+        } else {
+            sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3)");
+        }
+
+        //总数量
+        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
+        int totalCount = totalCountOptional.orElse(0);
+
+        //分页
+        sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+        params.add(size);
+        params.add((current - 1) * size);
+
+        //执行SQL获取数据
+        String sqlPage = sqlString.toString();
+        List<Task> resultList = jdbcTemplate.query(
+                sqlPage,
+                new BeanPropertyRowMapper<>(Task.class),
+                params.toArray()
+        );
+
+        //获取任务详情信息Map
+        Set<String> processInstanceIds = resultList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
+        Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
+        if (processInstanceIds.size() > 0) {
+            String resultIds = processInstanceIds.stream()
+                    .map(id -> "'" + id + "'")
+                    .collect(Collectors.joining(","));
+            taskParallelGroupMap = jdbcTemplate.query("select update_time,process_instance_id,task_user,task_user_name,e_visa_status,e_visa_content,parallel_process_instance_id,status 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;
+        //获取用户信息Map
+        Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
+
+        //解析page分页数据
+        IPage<BusinessTaskFailedPageVO> page = new Page<>(current, size);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        List<BusinessTaskFailedPageVO> pageList = resultList.stream()
+                .map(task -> {
+                    BusinessTaskFailedPageVO vo = new BusinessTaskFailedPageVO();
+                    vo.setId(task.getId());
+                    vo.setTaskName(task.getTaskName());
+                    vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
+                    vo.setEVisaStatusName("电签失败");
+                    vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
+                    List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                    if (taskParallelList != null && taskParallelList.size() > 0) {
+                        //判断签字人的验证 2=绿色 3=黄色 999=红色 其他代表=灰色
+                        List<TaskParallel> statList = new ArrayList<>();
+                        String formatDate = "";
+                        String eVisaFailedInfo = "";
+                        for (TaskParallel taskPa : taskParallelList) {
+                            if (taskPa.getStatus() == 2 && ObjectUtil.isNotEmpty(taskPa.getEVisaStatus()) && taskPa.getEVisaStatus() == 1) {
+                                taskPa.setEVisaStatus(2);
+                            } else if (taskPa.getStatus() == 3 && taskPa.getTaskUser().equals(SecureUtil.getUserId().toString())) {
+                                taskPa.setEVisaStatus(3);
+                            } else if (ObjectUtil.isNotEmpty(taskPa.getEVisaStatus()) && taskPa.getEVisaStatus() == 99) {
+                                taskPa.setEVisaStatus(999);
+                                if (ObjectUtil.isEmpty(formatDate)) {
+                                    formatDate = simpleDateFormat.format(taskPa.getUpdateTime());
+                                }
+                                if (ObjectUtil.isEmpty(eVisaFailedInfo)) {
+                                    eVisaFailedInfo = taskPa.getEVisaContent();
+                                }
+                            } else {
+                                taskPa.setEVisaStatus(1);
+                            }
+                            statList.add(taskPa);
+                        }
+                        vo.setTaskApproveUserNamesList(statList);
+                        vo.setEVisaUpdateDate(formatDate);
+                        vo.setEVisaFailedInfo(eVisaFailedInfo);
+                    }
+                    return vo;
+                }).collect(Collectors.toList());
+        page.setRecords(pageList);
+        page.setTotal(totalCount);
+        return R.data(page);
+    }
+
+    /**
+     * 资料填报-任务管理-一键重签
+     */
+    @PostMapping("/reSigningEVisa")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "任务管理-一键重签", notes = "传入taskIds、下拉框的contractId、projectId")
+    public R<Object> reSigningEVisa(@RequestParam String taskIds, @RequestParam String contractId, @RequestParam String projectId) {
+        if (ObjectUtil.isEmpty(taskIds)) {
+            throw new ServiceException("请选择至少一条任务进行重签");
+        }
+        List<Task> taskList = jdbcTemplate.query("select * from u_task where id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
+        if (taskList.size() > 0) {
+            List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            List<InformationQuery> informationQueryList = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+            if (informationQueryList.size() > 0) {
+                List<Long> nodePKeyIdList = informationQueryList.stream().map(InformationQuery::getWbsId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+                if (nodePKeyIdList.size() > 0) {
+                    try {
+                        //重新保存
+                        long startTime_1 = System.currentTimeMillis();
+                        R result = this.saveNodePdf(StringUtils.join(nodePKeyIdList, ","), contractId, projectId);
+                        long endTime_1 = System.currentTimeMillis();
+                        long executionTime_1 = endTime_1 - startTime_1;
+                        log.info("saveNodePdf执行时间:" + executionTime_1 + " 毫秒");
+
+                        //重新电签
+                        if (result != null && "成功".equals(result.getData())) {
+                            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+                            //获取任务详情信息Map
+                            Set<String> processInstanceIds = taskList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
+                            Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
+                            if (processInstanceIds.size() > 0) {
+                                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));
+                            }
+                            Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
+
+                            for (Task task : taskList) {
+                                List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                                for (TaskParallel taskParallel : taskParallelList) {
+                                    TaskApprovalVO approvalVO = new TaskApprovalVO();
+                                    approvalVO.setTaskId(task.getId().toString());
+                                    approvalVO.setFlag("OK");
+                                    approvalVO.setComment("重新发起电签");
+                                    approvalVO.setApprovalType(1);
+                                    approvalVO.setFormDataId(task.getFormDataId());
+                                    approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
+                                    taskApprovalVOS.add(approvalVO);
+                                }
+                            }
+                            long startTime_2 = System.currentTimeMillis();
+                            taskService.batchCompleteApprovalTask(taskApprovalVOS);
+                            long endTime_2 = System.currentTimeMillis();
+                            long executionTime_2 = endTime_2 - startTime_2;
+                            log.info("batchCompleteApprovalTask执行时间:" + executionTime_2 + " 毫秒");
+
+                            return R.success("任务已经成功提交重签,请耐心等待!");
+                        } else {
+                            throw new ServiceException("重新保存PDF信息失败");
+                        }
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new ServiceException("重新保存PDF信息失败,原因:" + e.getMessage());
+                    }
+                }
+            }
+        }
+        return R.fail("未获取到任务信息,操作失败!");
+    }
+
+    @Async
+    R saveNodePdf(String nodePKeyIds, String contractId, String projectId) throws Exception {
+        return excelTabClient.synPDFInfo(contractId, nodePKeyIds, "1", projectId);
+    }
 
 }

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

@@ -548,16 +548,16 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                 .set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
                 .in(TaskParallel::getParallelProcessInstanceId, taskIds));
 
-        List<TaskBatch> tabskList = new ArrayList<>();
+        List<TaskBatch> taskList = new ArrayList<>();
         for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
             //保存批次
             TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVO));
             taskBatch.setCreateUser(userId);
             taskBatch.setNickName(nickName);
             taskBatch.setCreateTime(new Date());
-            tabskList.add(taskBatch);
+            taskList.add(taskBatch);
         }
-        this.taskBatchService.saveBatch(tabskList);
+        this.taskBatchService.saveBatch(taskList);
     }
 
 

+ 3 - 2
blade-service/blade-land/src/main/java/org/springblade/land/controller/ClearingAgreementInfoController.java

@@ -12,6 +12,7 @@ import org.springblade.land.entity.ClearingAgreementInfo;
 import org.springblade.land.entity.CompensationInfo;
 import org.springblade.land.service.IClearingAgreementInfoService;
 import org.springblade.land.vo.AreaPictureVO;
+import org.springblade.land.vo.ClearingAgreementInfoVO;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -65,8 +66,8 @@ public class ClearingAgreementInfoController {
             @ApiImplicitParam(name = "type", value = "协议类型1征地补偿2坟地补偿3专项设施", required = false),
             @ApiImplicitParam(name = "periodId", value = "结算期", required = false)
     })
-    public R<IPage<ClearingAgreementInfo>> page(Query query, ClearingAgreementInfo info)  {
-        IPage<ClearingAgreementInfo> page = infoService.page(query, info);
+    public R<IPage<ClearingAgreementInfoVO>> page(Query query, ClearingAgreementInfo info)  {
+        IPage<ClearingAgreementInfoVO> page = infoService.page(query, info);
         return R.data(page);
     }
 

+ 10 - 1
blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.java

@@ -20,9 +20,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.core.mp.support.Query;
+import org.springblade.land.entity.AgreementLinkTable;
 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.manager.entity.WbsFormElement;
+
+import java.util.List;
 
 
 /**
@@ -34,5 +39,9 @@ import org.springblade.land.entity.SettlementInterval;
 public interface ClearingAgreementInfoMapper extends BaseMapper<ClearingAgreementInfo> {
 
 
-    IPage<ClearingAgreementInfo> page(IPage<ClearingAgreementInfo> iPage,@Param("info") ClearingAgreementInfo info);
+    IPage<ClearingAgreementInfoVO> page(IPage<ClearingAgreementInfo> iPage, @Param("info") ClearingAgreementInfo info);
+
+    List<WbsFormElement> getTableElement(@Param("tableId") Long tableId);
+
+    List<AgreementLinkTable> getAllAssignTable(@Param("ids") List<Long> ids, @Param("tableName") String tableName);
 }

+ 16 - 2
blade-service/blade-land/src/main/java/org/springblade/land/mapper/ClearingAgreementInfoMapper.xml

@@ -2,8 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.land.mapper.ClearingAgreementInfoMapper">
 
-    <select id="page" resultType="org.springblade.land.entity.ClearingAgreementInfo">
-        select * from l_clearing_agreement_info
+
+    <select id="getTableElement" resultType="org.springblade.manager.entity.WbsFormElement">
+        select * from m_wbs_form_element
+        where is_deleted = 0 and f_id = #{tableId} and dynamic_dict > 0
+    </select>
+    <select id="getAllAssignTable" resultType="org.springblade.land.entity.AgreementLinkTable">
+        select * from l_agreement_link_table where  is_deleted = 0 and agreement_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        and table_name like CONCAT(CONCAT('%', #{tableName}), '%')
+    </select>
+    <select id="page" resultType="org.springblade.land.vo.ClearingAgreementInfoVO">
+        select *,
+               (SELECT dict_value  from blade_dict WHERE code = 'land_agreement_type' and dict_key = lcai.type) as typeValue
+        from l_clearing_agreement_info lcai
         where project_id = #{info.projectId} and is_deleted = 0
         <if test="info.type != null and info.type != ''">
             and `type` = #{info.type}

+ 4 - 0
blade-service/blade-land/src/main/java/org/springblade/land/mapper/CompensationInfoMapper.java

@@ -77,4 +77,8 @@ public interface CompensationInfoMapper extends BaseMapper<CompensationInfo> {
     List<CompensationInfo> getAllAgreementList(@Param("projectId") Long projectId,@Param("areaId") Long areaId);
 
     List<CompensationInfo> getQuote(@Param("info") CompensationInfo info,@Param("ids") List<Long> ids);
+
+    List<Long> getPdfIsNull(@Param("projectId") Long projectId);
+
+    void deleteBatch(@Param("ids") List<Long> ids);
 }

+ 15 - 3
blade-service/blade-land/src/main/java/org/springblade/land/mapper/CompensationInfoMapper.xml

@@ -16,7 +16,13 @@
         delete from l_compensation_info
         where id = #{id}
     </delete>
-
+    <delete id="deleteBatch">
+        delete from l_compensation_info
+        where id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </delete>
 
     <select id="getTables" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT * FROM m_wbs_tree_private
@@ -39,13 +45,16 @@
     </select>
     <select id="getTableElement" resultType="org.springblade.manager.entity.WbsFormElement">
         select * from m_wbs_form_element
-        where is_deleted = 0 and dynamic_dict is not null and dynamic_dict > 0 and f_id in
+        where is_deleted = 0 and dynamic_dict > 0 and f_id in
         <foreach collection="ids" item="id" open="(" close=")" separator=",">
             #{id}
         </foreach>
     </select>
     <select id="getBussDataInfoByDataIds" resultType="org.springblade.land.vo.TableDataVO">
-        select p_key_id as pKeyId,tab_key as tabKey,key_val as tabVal from table_data_info
+        select p_key_id as pKeyId,tab_key as tabKey,key_val as tabVal,
+               SUBSTRING_INDEX(tab_key,"__",1) as dictKey,
+               SUBSTRING_INDEX( SUBSTRING_INDEX(tab_key,"__",-1),"_",1) as dictRow
+        from table_data_info
         where p_key_id in
         <foreach collection="ids" item="id" open="(" close=")" separator=",">
             #{id}
@@ -93,6 +102,9 @@
             #{id}
         </foreach>
     </select>
+    <select id="getPdfIsNull" resultType="java.lang.Long">
+        select id from l_compensation_info where project_id = #{projectId} and merge_pdf_url is null
+    </select>
 
 
 </mapper>

+ 2 - 1
blade-service/blade-land/src/main/java/org/springblade/land/service/IClearingAgreementInfoService.java

@@ -26,6 +26,7 @@ import org.springblade.land.entity.AgreementLinkTable;
 import org.springblade.land.entity.ClearingAgreementInfo;
 import org.springblade.land.entity.SettlementInterval;
 import org.springblade.land.vo.AreaPictureVO;
+import org.springblade.land.vo.ClearingAgreementInfoVO;
 
 import java.util.List;
 
@@ -41,7 +42,7 @@ public interface IClearingAgreementInfoService extends BaseService<ClearingAgree
 
     void add(ClearingAgreementInfo info) throws Exception;
 
-    IPage<ClearingAgreementInfo> page(Query query, ClearingAgreementInfo info);
+    IPage<ClearingAgreementInfoVO> page(Query query, ClearingAgreementInfo info);
 
     List<AgreementLinkTable> getFileList(Long id);
 

+ 2 - 1
blade-service/blade-land/src/main/java/org/springblade/land/service/ICompensationInfoService.java

@@ -32,6 +32,7 @@ import org.springblade.manager.entity.WbsTreePrivate;
 
 import java.io.FileNotFoundException;
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -82,7 +83,7 @@ public interface ICompensationInfoService extends BaseService<CompensationInfo>
     void mergePdfs(Long agreementId) throws Exception;
 
     //获取单个PDF
-    R getBussPdfInfo(Long id) throws Exception;
+    R getBussPdfInfo(Long id, Map<String, Object> DataInfo) throws Exception;
 
     void unSave(Long agreementId);
 }

+ 263 - 30
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/ClearingAgreementInfoServiceImpl.java

@@ -5,7 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
+import lombok.Data;
 import org.apache.commons.lang.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -17,13 +21,14 @@ import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.land.dto.SettlementIntervalDTO;
 import org.springblade.land.entity.*;
 import org.springblade.land.mapper.ClearingAgreementInfoMapper;
+import org.springblade.land.mapper.CompensationInfoMapper;
 import org.springblade.land.mapper.SettlementIntervalMapper;
-import org.springblade.land.service.IAgreementLinkTableService;
-import org.springblade.land.service.IClearingAgreementInfoService;
-import org.springblade.land.service.ICompensationInfoService;
-import org.springblade.land.service.ISettlementIntervalService;
+import org.springblade.land.service.*;
 import org.springblade.land.utils.FileUtils;
 import org.springblade.land.vo.AreaPictureVO;
+import org.springblade.land.vo.ClearingAgreementInfoVO;
+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.stereotype.Service;
@@ -32,8 +37,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.File;
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -41,11 +46,14 @@ import java.util.stream.Collectors;
 public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAgreementInfoMapper, ClearingAgreementInfo> implements IClearingAgreementInfoService {
 
     private final ICompensationInfoService compensationInfoService;
+    private final CompensationInfoMapper compensationInfoMapper;
     private final IAgreementLinkTableService linkTableService;
     private final NewIOSSClient newIOSSClient;
+    private final IRegionTreeInfoService treeInfoService;
 
     /**
      * 新增或修改结算协议
+     *
      * @param info
      */
     @Override
@@ -53,7 +61,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
     public void add(ClearingAgreementInfo info) throws Exception {
         //修改选择的补偿协议的引用状态
         String agreementIds = info.getAgreementIds();
-        if (StringUtils.isBlank(agreementIds)){
+        if (StringUtils.isBlank(agreementIds)) {
             throw new ServiceException("请选择补偿协议");
         }
         //是新增还是修改
@@ -82,14 +90,15 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
             }).collect(Collectors.toList());
             linkTableService.saveBatch(linkTables);
             info.setId(agreeId);
-        }else {
+        } else {
+            //存在则直接获取所有结算表单
             linkTables = linkTableService.getByAgreementId(info.getId());
             //修改则先还原之前补偿协议的状态
             ClearingAgreementInfo agreementInfo = this.getById(info.getId());
-            compensationInfoService.batchUpdateStatus(Func.toLongList(agreementInfo.getAgreementIds()),0);
+            compensationInfoService.batchUpdateStatus(Func.toLongList(agreementInfo.getAgreementIds()), 0);
         }
         //批量修改选中的状态
-        compensationInfoService.batchUpdateStatus(ids,1);
+        compensationInfoService.batchUpdateStatus(ids, 1);
         //获取所有选中的补偿协议
         List<CompensationInfo> compensationInfos = compensationInfoService.listByIds(ids);
         //统计补偿协议的统计字段
@@ -103,45 +112,265 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
                 allCount = allCount.add(fo.getAllMoney());
             }
             //名称拼接
-            str.append(fo.getName()+"、");
+            str.append(fo.getName() + "、");
         }
         info.setAgreementMoney(allCount);
         String names = str.toString();
-        if (StringUtils.isNotBlank(names)){
-            info.setName(names.substring(0, names.length() - 1)+"结算");
-        }else {
+        if (StringUtils.isNotBlank(names)) {
+            info.setName(names.substring(0, names.length() - 1) + "结算");
+        } else {
             info.setName("未找到用户名称");
         }
         if (isAdd) {
             this.save(info);
-        }else {
+        } else {
             this.updateById(info);
         }
         //循环结算协议的统计字段,把补偿协议统计出来的字段设置到结算协议
         //生成封面
+        buildPdf1(linkTables.get(0), info.getStage());
         //生成补偿结算表
+        buildPdf2(linkTables.get(1),info.getAreaId());
         //生成补偿费发放统计表
+        buildPdf3(linkTables.get(2),ids);
         //生成补偿费明细表
+//        buildPdf4();
         //生成补偿资金数量分配表
         //生成面积统计明细表
         //合并PDF
 //        try {
-            this.mergePdfs(info.getId());
+        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);
+                //统计补偿总和
+                BigDecimal big = new BigDecimal(0);
+                for (Integer dict : elementMap.keySet()) {
+                    if (batchKey.contains(dict)) {
+                        //取出数据集合
+                        List<TableDataVO> voList = listMap.get(dict);
+                        //重置数据顺序,先按表单分组,再按照行顺序重新装入集合
+                        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()));
+                        }
+                        //取出位置集合
+                        List<TableDataVO> voList2 = listMap2.get(dict);
+                        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) + ""));
+                            }
+                        }
+                    }
+                }
+                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;
+                        }
+                    }
+                }
+
+            }
+            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 (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());
+                            }
+                            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()) {
+                    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;
+                    }
+                }
+            }
+            compensationInfoService.getBussPdfInfo(linkTable.getId(), DataInfo);
+        } catch (Exception e) {
+            throw new ServiceException("生成封面失败");
+        }
+    }
+
     /**
      * 分页查询结算周期
+     *
      * @param query
      * @param info
      * @return
      */
     @Override
-    public IPage<ClearingAgreementInfo> page(Query query, ClearingAgreementInfo info) {
-        IPage<ClearingAgreementInfo> iPage = new Page<>(query.getCurrent(),query.getSize());
-        return  baseMapper.page(iPage,info);
+    public IPage<ClearingAgreementInfoVO> page(Query query, ClearingAgreementInfo info) {
+        IPage<ClearingAgreementInfo> iPage = new Page<>(query.getCurrent(), query.getSize());
+        return baseMapper.page(iPage, info);
     }
 
     /**
@@ -154,6 +383,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
 
     /**
      * 结算统计面积
+     *
      * @param projectId
      * @param areaId
      * @return
@@ -163,17 +393,17 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         List<String> list = new ArrayList<>();
         //获取当前项目下,当前节点下所有补偿协议
         List<CompensationInfo> infoList = compensationInfoService.getAllAgreementList(projectId, areaId);
-        if (infoList == null || infoList.size() == 0){
+        if (infoList == null || infoList.size() == 0) {
             return R.data(list);
         }
         //已签协议面积
         BigDecimal all = infoList.stream().map(l -> l.getAreaAll()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
-        list.add(all+"");
+        list.add(all + "");
         //已签协议比例
         list.add("0%");
         //已结算面积
-        BigDecimal endAll = infoList.stream().filter(l->l.getIsQuote().equals(1)).map(l -> l.getAreaAll()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
-        list.add(endAll+"");
+        BigDecimal endAll = infoList.stream().filter(l -> l.getIsQuote().equals(1)).map(l -> l.getAreaAll()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
+        list.add(endAll + "");
         //已结算比例
         list.add("0%");
         return R.data(list);
@@ -181,6 +411,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
 
     /**
      * 结算统计面积柱状图
+     *
      * @param projectId
      * @param areaId
      * @return
@@ -190,7 +421,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         List<AreaPictureVO> vo = new ArrayList<>();
         //获取当前项目下,当前节点下所有补偿协议
         List<CompensationInfo> infoList = compensationInfoService.getAllAgreementList(projectId, areaId);
-        if (infoList == null || infoList.size() == 0){
+        if (infoList == null || infoList.size() == 0) {
             return R.data(vo);
         }
         //已签面积
@@ -220,6 +451,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
 
     /**
      * 结算统计-金额进度
+     *
      * @param projectId
      * @param areaId
      * @return
@@ -229,7 +461,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         List<AreaPictureVO> vo = new ArrayList<>();
         //获取当前项目下,当前节点下所有补偿协议
         List<CompensationInfo> infoList = compensationInfoService.getAllAgreementList(projectId, areaId);
-        if (infoList == null || infoList.size() == 0){
+        if (infoList == null || infoList.size() == 0) {
             return R.data(vo);
         }
         BigDecimal zero = new BigDecimal(0);
@@ -241,7 +473,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         AreaPictureVO vo1 = new AreaPictureVO();
         vo1.setName("实际补助总金额");
         List<BigDecimal> ll = new ArrayList<>();
-        BigDecimal a1 = infoList.stream().filter(l->l.getType().equals(1)).map(l -> l.getAllMoney()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
+        BigDecimal a1 = infoList.stream().filter(l -> l.getType().equals(1)).map(l -> l.getAllMoney()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
         ll.add(a1);
         ll.add(zero);
         ll.add(zero);
@@ -262,7 +494,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         AreaPictureVO vo3 = new AreaPictureVO();
         vo3.setName("已结算总金额");
         List<BigDecimal> lbl = new ArrayList<>();
-        BigDecimal c1 = l2.stream().filter(l->l.getType().equals(1)).map(l -> l.getAllMoney()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
+        BigDecimal c1 = l2.stream().filter(l -> l.getType().equals(1)).map(l -> l.getAllMoney()).reduce(BigDecimal.valueOf(0), BigDecimal::add);
         lbl.add(c1);
         lbl.add(zero);
         lbl.add(zero);
@@ -278,6 +510,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
 
     /**
      * 批量删除
+     *
      * @param ids
      */
     @Override
@@ -292,9 +525,9 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
         List<Long> li = new ArrayList<>();
         List<ClearingAgreementInfo> list = this.listByIds(id);
         for (ClearingAgreementInfo info : list) {
-            li.addAll( Func.toLongList(info.getAgreementIds()));
+            li.addAll(Func.toLongList(info.getAgreementIds()));
         }
-        compensationInfoService.batchUpdateStatus(li,0);
+        compensationInfoService.batchUpdateStatus(li, 0);
         //最后删除结算协议
         this.deleteLogic(id);
 
@@ -311,7 +544,7 @@ public class ClearingAgreementInfoServiceImpl extends BaseServiceImpl<ClearingAg
             if (StringUtils.isNotEmpty(table.getPdfUrl())) {
                 data.add(table.getPdfUrl());
             } else {
-                R bussPdfInfo = compensationInfoService.getBussPdfInfo(table.getId());
+                R bussPdfInfo = compensationInfoService.getBussPdfInfo(table.getId(), null);
                 if (bussPdfInfo.getCode() == 200) {
                     if (StringUtils.isNotBlank(bussPdfInfo.getData() + "")) {
                         data.add(bussPdfInfo.getData() + "");

+ 36 - 24
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/CompensationInfoServiceImpl.java

@@ -9,6 +9,7 @@ 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.google.common.base.Joiner;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -247,8 +248,10 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         BigDecimal b2 = new BigDecimal(0);
         //地面附着物
         BigDecimal b3 = new BigDecimal(0);
-        //金额总计
+        //时段奖
         BigDecimal b4 = new BigDecimal(0);
+        //金额总计
+        BigDecimal b5 = new BigDecimal(0);
         //农用地面积
         BigDecimal a1 = new BigDecimal(0);
         //建设用地面积
@@ -258,7 +261,7 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         //总面积
         BigDecimal a4 = new BigDecimal(0);
         //户主姓名(协议名称)
-        StringBuilder str = new StringBuilder("");
+        Set<String> str = new HashSet<>();
         CompensationInfo info = new CompensationInfo();
         info.setId(id);
         //查看当前表单是否配置统计值
@@ -292,7 +295,7 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                     //循环统计字段
                     for (WbsFormElement element : elements) {
                         Integer dict = element.getDynamicDict();
-                        if (dict.equals(7)){
+                        if (dict.equals(41)){
                             continue;
                         }
                         //获取当前统计字段所有填写的值
@@ -302,10 +305,10 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                             continue;
                         }
                         //单独计算面积
-                        if (dict.equals(6)) {
-                            //统计面积,去找到当前行的地类dict为7
-                            List<WbsFormElement> collect = elements.stream().filter(l -> l.getDynamicDict().equals(7)).collect(Collectors.toList());
-                            //获取dict为7的key,如果key不存在则提示未配置土地性质
+                        if (dict.equals(42)) {
+                            //统计面积,去找到当前行的地类dict为41
+                            List<WbsFormElement> collect = elements.stream().filter(l -> l.getDynamicDict().equals(41)).collect(Collectors.toList());
+                            //获取dict为41的key,如果key不存在则提示未配置土地性质
                             if (collect == null || collect.size() == 0){
                                 throw new ServiceException("未配置地类");
                             }
@@ -340,16 +343,18 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                         }else {
                             //当前统计值
                             try {
-                                if (dict.equals(1)) {
+                                if (dict.equals(80)) {
+                                    str.add(StringUtils.join(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()), "、") + "、");
+                                } 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(2)) {
+                                } 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(3)) {
+                                } 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(4)) {
-                                    str.append(StringUtils.join(vos.stream().map(l -> l.getTabVal()).collect(Collectors.toList()), "、") + "、");
-                                } else if (dict.equals(5)) {
+                                } 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));
                                 }
                             } catch (Exception e) {
                                 throw new ServiceException("金额字段不能包含其他字符,请重新填写");
@@ -358,19 +363,18 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
                     }
                 }
                 //设置名称
-                String names = str.toString();
-                if (StringUtils.isNotBlank(names)){
-                    info.setName(names.substring(0, names.length() - 1));
+                if (str.size() > 0){
+                    info.setName(Joiner.on(",").join(str));
                 }else {
                     info.setName("未找到用户名称");
                 }
                 //设置金额
                 info.setLandMoney(b1);
                 info.setCropsMoney(b2.add(b3));
-                if (!info.getLandMoney().add(info.getCropsMoney()).equals(b4)){
+                if (!info.getLandMoney().add(info.getCropsMoney()).add(b4).equals(b5)){
                     throw new ServiceException("补偿金额合计不对,请校验土地、青苗、等金额之和,是否等于补偿金额合计");
                 }
-                info.setAllMoney(b4);
+                info.setAllMoney(b5);
                 //设置面积
                 info.setAreaA(a1);
                 info.setAreaB(a2);
@@ -443,6 +447,12 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
 
     @Override
     public IPage<CompensationInfo> page(Query query, CompensationInfo info) {
+        //查看列表先删除之前未保存的补偿协议
+        List<Long> ids = baseMapper.getPdfIsNull(info.getProjectId());
+        if (ids != null && ids.size() > 0){
+            linkTableService.deleteByAgreementIds(ids);
+            baseMapper.deleteBatch(ids);
+        }
         IPage<CompensationInfo> iPage = new Page<>(query.getCurrent(),query.getSize());
         return baseMapper.page(iPage,info);
     }
@@ -814,12 +824,13 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         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());
             } else {
-                R bussPdfInfo = this.getBussPdfInfo(table.getId());
+                R bussPdfInfo = this.getBussPdfInfo(table.getId(),null);
                 if (bussPdfInfo.getCode() == 200) {
                     if (StringUtils.isNotBlank(bussPdfInfo.getData() + "")) {
                         data.add(bussPdfInfo.getData() + "");
@@ -854,12 +865,12 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
     }
 
     /**
-     * 获取单个PDF,传入映射表主键
+     * 获取单个PDF,传入映射表主键,如果DataInfo为null会去查,如果不为null则直接使用
      * @param id
      * @return
      * @throws Exception
      */
-    public R getBussPdfInfo(Long id) throws Exception {
+    public R getBussPdfInfo(Long id,Map<String, Object> DataInfo) throws Exception {
         String file_path = FileUtils.getSysLocalFileUrl();
 
         AgreementLinkTable linkTable = linkTableService.getById(id);
@@ -884,8 +895,9 @@ public class CompensationInfoServiceImpl extends BaseServiceImpl<CompensationInf
         if (excelTab == null) {
             return R.fail("未获取到清表信息");
         }
-
-        Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(id).getData();
+        if (DataInfo == null) {
+            DataInfo = (Map<String, Object>) getBussDataInfo(id).getData();
+        }
 
         //获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());

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

@@ -11,9 +11,11 @@ import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.bean.TableInfo;
+import org.springblade.manager.controller.ExcelTabController;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.TrialSelfDataRecord;
 import org.springblade.manager.enums.ExecuteType;
@@ -37,6 +39,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     private final JdbcTemplate jdbcTemplate;
     private final NewIOSSClient newIOSSClient;
     private final InformationQueryClient informationQueryClient;
+    private final ExcelTabController excelTabController;
     private static final Logger logger = LoggerFactory.getLogger(ExcelTabClientImpl.class);
 
     @Override
@@ -120,5 +123,10 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         return excelTabService.getBussPDFSTrial(nodeId, tableType, classify, contractId, projectId, Long.parseLong(id), tabIds, dto);
     }
 
+    @Override
+    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId) throws Exception {
+        return excelTabController.synPDFInfo(contractId, nodeIds, classify, projectId);
+    }
+
 
 }