Procházet zdrojové kódy

试验一键重签 计量第一期特殊处理

DengLinLang před 7 měsíci
rodič
revize
9481c76690

+ 10 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialResignDto.java

@@ -0,0 +1,10 @@
+package org.springblade.business.dto;
+
+import lombok.Data;
+
+@Data
+public class TrialResignDto {
+    private String trialIds;
+    private Integer type;
+    private String projectId;
+}

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

@@ -6,6 +6,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springblade.manager.vo.WbsTreePrivateVO4;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -80,4 +81,8 @@ public interface WbsTreePrivateClient {
     @GetMapping(API_PREFIX + "/getProjectOpinionNode")
     R<WbsTreePrivate> getProjectOpinionNode(@RequestParam Long projectId);
 
+
+    @GetMapping("/search-node-tables")
+     R<List<WbsTreePrivateVO4>> searchNodeAllTable(@RequestParam String primaryKeyId,@RequestParam String type,@RequestParam String tableType, @RequestParam String contractId,@RequestParam String projectId,@RequestParam Integer isAdd,@RequestParam Long id) ;
+
 }

+ 305 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1497,6 +1497,296 @@ public class TaskController extends BladeController {
         return R.data(page);
     }
 
+    @PostMapping("/pageset")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "电签显示等待 batch中没有 用于跑电签数据的接口 手动调用", notes = "传入BusinessTaskDTO")
+    public R<IPage<BusinessTaskPageVO>> pageset(@RequestBody BusinessTaskDTO dto) throws IOException {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
+        }
+        if (ObjectUtil.isEmpty(dto.getProjectIdValue())) {
+            throw new ServiceException("未获取到当前用户所在的项目信息,请联系管理员");
+        }
+        if (ObjectUtil.isEmpty(dto.getCurrentContractId())) {
+            throw new ServiceException("未获取到当前用户所在的合同段信息,请联系管理员");
+        }
+        ProjectInfo projectInfo = jdbcTemplate.query("select approval_type from m_project_info where id = " + dto.getProjectIdValue(), new BeanPropertyRowMapper<>(ProjectInfo.class)).stream().findAny().orElse(null);
+        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 is_deleted = 0 AND approval_type not in(4,5)");
+        if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
+            sqlString.append(" AND type = ?");
+            params.add(dto.getTypeValue());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getStatusValue())) {
+            sqlString.append(" AND status = ?");
+            params.add(dto.getStatusValue());
+        }
+
+        ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (contractInfo != null && contractInfo.getContractType().equals(1)) {
+            //施工合同段正常查询
+            if (ObjectUtil.isNotEmpty(dto.getContractIdValue())) {
+                sqlString.append(" AND contract_id = ?");
+                params.add(dto.getContractIdValue());
+            } else {
+                //如果合同段id=null,那么查询当前项目下所有合同段任务
+                if (ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                    sqlString.append(" AND project_id = ?");
+                    params.add(dto.getProjectIdValue());
+                } else {
+                    throw new ServiceException("未获取到当前用户所在的项目信息,请联系管理员");
+                }
+            }
+        } else if (contractInfo != null && (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3))) {
+            if (ObjectUtil.isEmpty(dto.getOrdType())) { //Web端根据合同段查询
+                if (ObjectUtil.isNotEmpty(dto.getContractIdValue())) {
+                    if (dto.getContractIdValue().equals(dto.getCurrentContractId())) {
+                        //如果下拉框合同段选择框合同段=当前用户登陆合同段,那么查询全部合同段的数据
+                        List<ContractRelationJlyz> contractRelationJLYZ = jdbcTemplate.query("select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+                        Set<Long> ids = contractRelationJLYZ.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toSet());
+                        ids.add(dto.getCurrentContractId()); //把监理本身也加入查询
+                        sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
+                    } else {
+                        //如果下拉框合同段选择框合同段!=当前用户登陆合同段,那么查询下拉框合同段数据
+                        sqlString.append(" AND contract_id = ?");
+                        params.add(dto.getContractIdValue());
+                    }
+                } else {
+                    //如果下拉框合同段id=null,那么查询当前整个项目的数据
+                    sqlString.append(" AND project_id = ?");
+                    params.add(dto.getProjectIdValue());
+                }
+            } else { //App直接查询全部合同段,整个项目
+                sqlString.append(" AND project_id = ?");
+                params.add(dto.getProjectIdValue());
+            }
+        }
+        if (ObjectUtil.isNotEmpty(dto.getBatchValue())) {
+            sqlString.append(" AND batch = ?");
+            params.add(dto.getBatchValue());
+        }
+        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 (ObjectUtil.isNotEmpty(dto.getSelectedType())) {
+            sqlString.append(" AND (");
+            if (dto.getSelectedType().equals(1)) { //待办页面
+
+                //如果是待办页面,且 任务状态下拉框 选择的是 待审批状态 的任务,那么才查询数据
+                if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && dto.getStatusValue().equals(1)) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+
+                    //如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null
+                } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
+                    return null;
+
+                    //如果是待办页面,没选择 任务状态下拉框,那么就默认查询 待审批状态 任务
+                } else if (ObjectUtil.isEmpty(dto.getStatusValue())) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+                    sqlString.append(" AND status = 1");
+                }
+
+            } else if (dto.getSelectedType().equals(2)) { //已办页面
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status in(2,3) AND u_task_parallel.task_user = ?)");
+                //当前自己的任务必须是已审批、已废除 status = 2,3 ,才视为已办
+                params.add(SecureUtil.getUserId());
+
+            } else if (dto.getSelectedType().equals(3)) { //我发起页面
+                sqlString.append("report_user = ?");
+                params.add(SecureUtil.getUserId());
+            }
+            sqlString.append(")");
+        }
+
+        //总数量
+        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
+        int totalCount = totalCountOptional.orElse(0);
+
+        //分页
+        if (ObjectUtil.isNotEmpty(dto.getOrdType())) {
+            //App端排序
+            if (dto.getOrdType() == 1) {
+                sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            } else if (dto.getOrdType() == 2) {
+                sqlString.append(" ORDER BY create_time ASC LIMIT ? OFFSET ?");
+            } else {
+                sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            }
+        } else {
+            //Web端默认倒叙
+            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 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<BusinessTaskPageVO> page = new Page<>(current, size);
+        List<BusinessTaskPageVO> pageList = resultList.stream()
+                .map(task -> {
+                    BusinessTaskPageVO vo = new BusinessTaskPageVO();
+                    vo.setId(task.getId());
+                    vo.setTaskId(task.getId());
+                    vo.setTaskName(task.getTaskName());
+                    vo.setTaskTypeName(task.getType().equals(1) ? "普通任务" : task.getType().equals(2) ? "验收任务" : "移交任务");
+                    vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
+                    vo.setStartTime(task.getStartTime());
+                    vo.setEndTime(task.getEndTime());
+                    vo.setTaskDesc(task.getTaskContent());
+                    vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
+                    vo.setApprovalType(task.getApprovalType());
+                    vo.setFormDataId(task.getFormDataId());
+                    vo.setProcessInstanceId(task.getProcessInstanceId());
+                    List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                    if (taskParallelList != null && taskParallelList.size() > 0) {
+                        //如果是垂直签,且是待办页面,判断是否是当前用户审批轮次,不是当前用户审批轮次就不显示该任务
+                        if (projectInfo != null && projectInfo.getApprovalType() == 1 && dto.getSelectedType() == 1) {
+                            boolean shouldDisplayTask = false; //标记是否显示当前任务
+                            for (TaskParallel taskParallel : taskParallelList) {
+                                if (SecureUtil.getUserId().equals(Long.parseLong(taskParallel.getTaskUser()))) {
+                                    shouldDisplayTask = true; //当前用户是审批人,需要显示任务
+                                    break;
+                                } else if (taskParallel.getStatus() != 2) {
+                                    //之前的审批人员任务未完成,不显示任务
+                                    break;
+                                }
+                            }
+                            if (!shouldDisplayTask) {
+                                //跳过当前任务
+                                return null;
+                            }
+                        }
+
+                        List<String> names = taskParallelList.stream().map(TaskParallel::getTaskUserName).collect(Collectors.toList());
+                        if (names.size() > 0) {
+                            vo.setTaskApproveUserNames(StringUtils.join(names, ","));
+                        }
+
+                        //电签状态(始终只获取自己的电签任务状态信息)
+                        TaskParallel taskParallel = taskParallelList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getTaskUser()) && f.getTaskUser().equals(SecureUtil.getUserId().toString())).findAny().orElse(null);
+                        if (taskParallel != null) {
+                            vo.setEVisaStatus(taskParallel.getEVisaContent() != null ? taskParallel.getEVisaContent() : "");
+                            vo.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
+                        }
+                        if (vo.getTaskStatusName().equals("已废除")) {
+                            vo.setEVisaStatus("废除成功");
+                        }
+
+                        //判断签字人的验证 2=绿色 3=黄色 999=红色 其他代表=灰色
+                        List<TaskParallel> statList = new ArrayList<>();
+                        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);
+                            } else {
+                                taskPa.setEVisaStatus(1);
+                            }
+                            statList.add(taskPa);
+                        }
+                        vo.setTaskApproveUserNamesList(statList);
+                    }
+                    return vo;
+                })
+                .filter(Objects::nonNull) //过滤掉为null的任务
+                .collect(Collectors.toList());
+        //所有满足条件的任务 转map
+        Map<Long, Task> taskMap = new HashMap<>();
+        Map<String, List<OperationLog>> operationLogMap = new HashMap<>();
+        List<Long> taskIds = pageList.stream().filter(b -> "已废除".equals(b.getTaskStatusName())).map(BusinessTaskPageVO::getTaskId).collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(taskIds)){
+            String joinTaskIds = StringUtils.join(taskIds, ",");
+            List<Task> tasks = jdbcTemplate.query("select id, create_time,form_data_id from u_task where id in ( " + joinTaskIds+")", new BeanPropertyRowMapper<>(Task.class));
+            taskMap = tasks.stream()
+                    .collect(Collectors.toMap(
+                            Task::getId,
+                            task -> task));
+        }
+        //所有满足条件的日志 转map
+        String logQuery = "select business_id,create_user_name ,create_time from u_operation_log where  operation_content like '%废除%'";
+        List<OperationLog> operationLogs = jdbcTemplate.query(logQuery, new BeanPropertyRowMapper<>(OperationLog.class));
+        if(ObjectUtil.isNotEmpty(operationLogs)){
+            operationLogMap = operationLogs.stream().collect(Collectors.groupingBy(OperationLog::getBusinessId));
+        }
+        for (BusinessTaskPageVO businessTaskPageVO : pageList) {
+            if("已废除".equals(businessTaskPageVO.getTaskStatusName())){
+                Long taskId = businessTaskPageVO.getTaskId();
+                Task task = taskMap.get(taskId);
+                if (ObjectUtil.isEmpty(task)){
+                    continue;
+                }
+                //任务创建时间
+                Date createTime = task.getCreateTime();
+                //废除时间肯定在任务创建时间之后  选择距离当前任务创建时间最近的一条数据
+                List<OperationLog> operationLogsF = operationLogMap.get(task.getFormDataId());
+                /*List<OperationLog> operationLogs = jdbcTemplate.query("select create_user_name ,create_time from u_operation_log where business_id = '" +
+                                task.getFormDataId() + "'and operation_content like '%废除%' and create_time >= '"+format+"' ORDER BY ABS(TIMESTAMPDIFF(SECOND, '"+format+"', create_time)) LIMIT 1"
+                        , new BeanPropertyRowMapper<>(OperationLog.class));*/
+                if(ObjectUtil.isNotEmpty(operationLogsF)){
+                    Optional<OperationLog> min = operationLogsF.stream().filter(o -> o.getCreateTime().compareTo(createTime) >= 0)
+                            .min(Comparator.comparing(t -> t.getCreateTime().getTime() - createTime.getTime()));
+                    if (min.isPresent()){
+                        OperationLog operationLog = min.get();
+                        businessTaskPageVO.setEVisaStatus(businessTaskPageVO.getEVisaStatus()+":"+operationLog.getCreateUserName()+"-"+operationLog.getCreateTime());
+                    }
+                }
+            }
+        }
+        int i = 10;
+        for (BusinessTaskPageVO businessTaskPageVO : pageList) {
+            List<TaskParallel> taskApproveUserNamesList = businessTaskPageVO.getTaskApproveUserNamesList();
+            for (TaskParallel taskParallel : taskApproveUserNamesList) {
+                String eVisaContent = taskParallel.getEVisaContent();
+                if(ObjectUtil.isNotEmpty(eVisaContent) && eVisaContent.contains("当前等待电签的批次较多")){
+                    String sql = "INSERT INTO  `u_task_batch` (id,json_data,create_user,update_user,nick_name)VALUES("+i+",'{\"approvalFileList\":[],\"approvalType\":"+businessTaskPageVO.getApprovalType()+",\"comment\":\"OK\",\"flag\":\"OK\",\"formDataId\":\""+businessTaskPageVO.getFormDataId()+"\",\"parallelProcessInstanceId\":\""+taskParallel.getParallelProcessInstanceId()+"\",\"pass\":true,\"taskId\":\""+businessTaskPageVO.getTaskId()+"\"}',"+taskParallel.getTaskUser()+","+taskParallel.getTaskUser()+",'"+taskParallel.getTaskUserName()+"')";
+                    jdbcTemplate.execute(sql);
+                    i++;
+                }
+            }
+        }
+        page.setRecords(pageList);
+        page.setTotal(totalCount);
+        return R.data(page);
+    }
+
 
 
 
@@ -1672,6 +1962,21 @@ public class TaskController extends BladeController {
         return R.success("任务已经成功提交重签,请耐心等待!");
     }
 
+    /**
+     * 试验系统-试验检测(自检)-一键重签
+     */
+    @PostMapping("/reSigningTrial")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "试验检测(自检)-一键重签", notes = "传入试验自检id")
+    public R<Object> reSigningTrial(@RequestBody TrialResignDto dto,  HttpServletRequest request) {
+        if (ObjectUtil.isEmpty(dto.getTrialIds())) {
+            return R.fail("请选择一条记录");
+        }
+        String header = request.getHeader("Blade-Auth");
+        taskService.reSigningTrial(dto,request);
+        return R.success("任务已经成功提交重签,请耐心等待!");
+    }
+
     /**
      * 质检-日志-一键重签
      */

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.service;
 
+import org.springblade.business.dto.TrialResignDto;
 import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.vo.TaskApprovalVO;
@@ -119,4 +120,10 @@ public interface ITaskService extends BaseService<Task> {
      */
     @Async
     void logReSigningEVisa(String logIds,Long logPkeyId,Long nodePrimaryKeyId, String contractId,HttpServletRequest request, Integer type);
+
+    /**
+     * 试验-resign-一键重签
+     */
+    @Async
+    void reSigningTrial(TrialResignDto dto, HttpServletRequest request);
 }

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

@@ -12,8 +12,11 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.feign.ArchiveAutoClient;
+import org.springblade.business.dto.TrialResignDto;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.*;
 import org.springblade.business.mapper.TaskMapper;
+import org.springblade.business.mapper.TrialSelfInspectionRecordMapper;
 import org.springblade.business.service.*;
 import org.springblade.business.vo.*;
 import org.springblade.common.constant.CommonConstant;
@@ -46,6 +49,7 @@ import org.springblade.manager.entity.TabBusstimeInfo;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.feign.*;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
+import org.springblade.manager.vo.WbsTreePrivateVO4;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
@@ -122,6 +126,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     private final ExcelTabClient excelTabClient;
 
     private final NewIOSSClient newIOSSClient;
+    private final WbsTreePrivateClient wbsTreePrivateClient;
+    private final TrialSelfInspectionRecordMapper trialSelfInspectionRecordMapper;
     //超级管理员的角色id
     private final String SUPER_ADMIN_ROLE_ID ="1123598816738675201";
     //泓创智诚公司的部门id
@@ -1067,6 +1073,152 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         }
     }
 
+    @Override
+    public void reSigningTrial(TrialResignDto dto, HttpServletRequest request) {
+        int type = dto.getType();
+        //查询任务信息
+        List<Task> taskList = jdbcTemplate.query("select * from u_task where trial_self_inspection_record_id in(" + dto.getTrialIds() + ") and is_deleted  = 0 and (status = 1 or status =2)", new BeanPropertyRowMapper<>(Task.class));
+        if (taskList.size() > 0) {
+            //获取任务详情信息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,e_visa_status,task_user,task_user_name,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;
+            //获取每条任务对应的节点信息
+            List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            Map<String, String> queryMap = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(l -> l.getId() + "", l -> l.getWbsId() + ""));
+            Map<String, String> typeMap = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(l -> l.getId() + "", l -> l.getClassify() + ""));
+
+            try {
+                for (Task task : taskList) {
+                    R result = new R();
+                    jdbcTemplate.execute("DELETE from u_task_batch where json_data like '%"+task.getId()+"%'");
+                    boolean b = false;
+                    if(type == 1){
+                        b = informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                .eq(InformationQuery::getId, task.getFormDataId())
+                                .set(InformationQuery::getEVisaPdfUrl, null));
+                    }else {
+                        b = informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                .eq(InformationQuery::getId, task.getFormDataId())
+                                .set(InformationQuery::getEVisaPdfUrl, null));
+                    }
+
+                    if (type == 1) {
+                        //重新保存
+                        long startTime_1 = System.currentTimeMillis();
+                        result = this.saveTrialSelfNodePdf(dto,queryMap.get(task.getFormDataId()));
+                        long endTime_1 = System.currentTimeMillis();
+                        long executionTime_1 = endTime_1 - startTime_1;
+                        log.info("saveNodePdf执行时间:" + executionTime_1 + " 毫秒");
+                    }else{
+                        if (!b){
+                            throw new ServiceException("清空电签PDF失败");
+                        }
+                        result.setData("成功");
+                    }
+                    //重新电签
+                    if (result != null && "成功".equals(result.getData())) {
+                        List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+                        List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                        for (TaskParallel taskParallel : taskParallelList) {
+                            //待审批的不进行重签, 存在待审批,但是电签状态是失败的
+                            if ((new Integer(2)).equals(taskParallel.getStatus()) || Func.isNotEmpty(taskParallel.getEVisaStatus()) || Func.isNotEmpty(taskParallel.getEVisaContent()) ) {
+                                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());
+                                approvalVO.setYsNickName(taskParallel.getTaskUserName());
+                                approvalVO.setUserId(Long.parseLong(taskParallel.getTaskUser()));
+                                taskApprovalVOS.add(approvalVO);
+                            }
+                        }
+                        long startTime_2 = System.currentTimeMillis();
+                        if(taskApprovalVOS!=null && taskApprovalVOS.size()>=1){
+                            this.batchCompleteApprovalTask(taskApprovalVOS);
+                        }
+                        long endTime_2 = System.currentTimeMillis();
+                        long executionTime_2 = endTime_2 - startTime_2;
+                        log.info("batchCompleteApprovalTask执行时间:" + executionTime_2 + " 毫秒");
+                    } else {
+                        //修改重签状态为保存PDF失败
+                        this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
+                                .set(TaskParallel::getEVisaContent, "重新保存PDF失败")
+                                .eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
+                    }
+                }
+                //获取当前操作人
+                /*Long userId = AuthUtil.getUserId(request);
+                String userName = AuthUtil.getNickName(request);
+                //判断是否是超级管理员并且是泓创智诚下的部门
+                if(judgeRoleIdAndDeptId(userId)){
+                    //满足去除当前填报人的条件 去除当前任务的填报人中当前操作人的信息
+                    String taskIds = StringUtils.join(taskList, ",");
+                    removeUserAndName(taskIds, userId, userName);
+                }*/
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException("重新保存PDF信息失败,原因:" + e.getMessage());
+            }
+        }else {
+            throw new ServiceException("未获取到任务信息,操作失败!");
+        }
+
+
+    }
+
+    private R saveTrialSelfNodePdf(TrialResignDto dto,String trialId) {
+        //试验记录id
+        String trialIds = dto.getTrialIds();
+        TrialSelfInspectionRecord tRecord = trialSelfInspectionRecordMapper.selectById(trialIds);
+
+        //调用获取实验记录表和报告单的方法 "1,9,2,10" 查询记录表和报告单  isAdd 2 非新增
+        R<List<WbsTreePrivateVO4>> listR = wbsTreePrivateClient.searchNodeAllTable(tRecord.getNodeId().toString(), tRecord.getType().toString(), "1,9,2,10", tRecord.getContractId().toString(), dto.getProjectId(), 2, Long.parseLong(trialId));
+        List<WbsTreePrivateVO4> data = listR.getData();
+        //构造dataInfo
+        JSONArray orderList = new JSONArray();
+        for (WbsTreePrivateVO4 datum : data) {
+            Map<String, Object> bussDataInfoTrial = datum.getBussDataInfoTrial();
+            bussDataInfoTrial.put("nodeId", tRecord.getNodeId());
+            bussDataInfoTrial.put("pkeyId", datum.getPKeyId());
+            bussDataInfoTrial.put("projectId", datum.getProjectId());
+            bussDataInfoTrial.put("isCollapseLoad", datum.getIsCopyTab());
+            bussDataInfoTrial.put("isBussShow", datum.getIsBussShow());
+            bussDataInfoTrial.put("contractId", tRecord.getContractId());
+            bussDataInfoTrial.put("type", datum.getTableType());
+            JSONObject jsonObject = new JSONObject(bussDataInfoTrial);
+            orderList.add(jsonObject);
+        }
+        Map<String, Object> stringObjectMap = new HashMap<>();
+        stringObjectMap.put("orderList", orderList);
+        JSONObject dataInfo = new JSONObject(stringObjectMap);
+        //构造trialSelfInspectionRecordDTO数据
+        TrialSelfInspectionRecordDTO trialSelfInspectionRecordDTO = new TrialSelfInspectionRecordDTO();
+        trialSelfInspectionRecordDTO.setContractId(tRecord.getContractId());
+        trialSelfInspectionRecordDTO.setDataInfo(dataInfo);
+        trialSelfInspectionRecordDTO.setDetectionCategory(tRecord.getDetectionCategory());
+        trialSelfInspectionRecordDTO.setDetectionResult(tRecord.getDetectionResult());
+        trialSelfInspectionRecordDTO.setEntrustId(tRecord.getEntrustId());
+        trialSelfInspectionRecordDTO.setId(Long.parseLong(trialId));
+        trialSelfInspectionRecordDTO.setIsBatchSave(1);
+        trialSelfInspectionRecordDTO.setNodeId(tRecord.getNodeId());
+        trialSelfInspectionRecordDTO.setReportDate(tRecord.getReportDate());
+        trialSelfInspectionRecordDTO.setTableType("1,2");
+        trialSelfInspectionRecordDTO.setTrialUserName(tRecord.getTrialUserName());
+        trialSelfInspectionRecordDTO.setTrialProjectName(tRecord.getTrialProjectName());
+        trialSelfInspectionRecordDTO.setType(tRecord.getType());
+        String pdfUrl = excelTabClient.saveTabData(trialSelfInspectionRecordDTO, 1, tRecord.getType(), "1,2", Long.parseLong(trialId), tRecord.getTableIds());
+        return R.data("成功");
+    }
+
     @Override
     public Boolean startApproval(TaskVO vo) {
         if (ObjectUtil.isEmpty(vo.getReportUserId()) || ObjectUtil.isEmpty(vo.getReportUserName())) {

+ 63 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -14,6 +14,7 @@ import com.spire.xls.Workbook;
 import com.spire.xls.Worksheet;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.time.DateUtils;
+import org.jetbrains.annotations.NotNull;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -58,6 +59,7 @@ import org.springblade.system.user.feign.IUserClient;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -343,7 +345,6 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                         return pdfUrl.toString();
                     }
             }}
-
             return pdfUrl.toString();
         }
         return "";
@@ -1273,12 +1274,72 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
     public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
         String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
         if (StringUtils.isNotEmpty(pdfURL) && !pdfURL.equals("500")) {
-            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+            String file_path = FileUtils.getSysLocalFileUrl();
+            Long snowId = SnowFlakeUtil.getId();
+            String listPdf = file_path + "/pdf/" + snowId + ".pdf";
+            JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
+            boolean recordDataTable = false;
+            boolean reportDataTable = false;
+            for (int i = 0; i < dataArray.size(); i++) {
+                JSONObject jsonObject = dataArray.getJSONObject(i);
+                String type = jsonObject.getString("type");
+                if(ObjectUtil.isEmpty(type)){
+                    throw new RuntimeException("请点击表单后再进行保存");
+                }
+                if (type.equals("1")) {
+                    //记录表
+                    recordDataTable = true;
+                }
+                if (type.equals("2")) {
+                    //报告表
+                    reportDataTable = true;
+                }
+            }
+            String updateSql = null;
+            if (recordDataTable && !reportDataTable) {
+                //单独保存记录表 查询报告单pdf是否有值 如果有值就合并 合并存到pdf_url
+                updateSql = getUpdateSql(dto, pdfURL, listPdf, snowId, "report_pdf_url", 1, "record_pdf_url");
+
+            } else if (!recordDataTable && reportDataTable) {
+                //单独保存报告表 查询记录表pdf是否有值 如果有值就合并 合并存到pdf_url
+                updateSql = getUpdateSql(dto, pdfURL, listPdf, snowId, "record_pdf_url", 2, "report_pdf_url");
+            } else {
+                //一起保存的数据  只改变pdf_url
+                this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+            }
+            if (ObjectUtil.isNotEmpty(updateSql)) {
+                jdbcTemplate.execute(updateSql);
+            }
         } else if (pdfURL.equals("500")) {
             throw new ServiceException("试验填报保存操作失败");
         }
     }
 
+    @NotNull
+    private String getUpdateSql(TrialSelfInspectionRecordDTO dto, String pdfURL, String listPdf, Long snowId,String param1,int type,String param2) {
+        String updateSql;
+        String sqlForAntherPDF = "SELECT "+param1+ " from u_trial_self_inspection_record where id =  " + dto.getId() + " and is_deleted = 0";
+        String AntherPDFUrl = jdbcTemplate.queryForObject(sqlForAntherPDF, new SingleColumnRowMapper<String>(String.class));
+        if(ObjectUtil.isNotEmpty(AntherPDFUrl)){
+            //合并后保存  把报告单合并在前面
+            if(type == 1){
+                FileUtils.mergePdfPublicMethods(Arrays.asList(AntherPDFUrl, pdfURL), listPdf);
+            }else {
+                FileUtils.mergePdfPublicMethods(Arrays.asList(pdfURL,AntherPDFUrl), listPdf);
+            }
+
+            BladeFile bladeFile = this.newIOSSClient.uploadFile(snowId + ".pdf", listPdf);
+            updateSql = "update u_trial_self_inspection_record set pdf_url = '" + bladeFile.getLink() + "',"+param2+ "= '"+ pdfURL + "' where id='" + dto.getId()+"'";
+            //合并后更新queryInfo表的pdfurl
+            String updateForQurtyInfo = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' where classify='" + dto.getType() + "' and  wbs_id='" + dto.getId() + "' and contract_id ='" + dto.getContractId() + "' ";
+            jdbcTemplate.execute(updateForQurtyInfo);
+        }else {
+            updateSql = "update u_trial_self_inspection_record set "+param2+" = '"+ pdfURL + "' where id='" + dto.getId()+"'";
+        }
+        return updateSql;
+    }
+
+
     public boolean recordSampleSubmit(TrialSelfInspectionRecordDTO dto1, TrialSelfInspectionRecord obj) {
         RecordSampleSubmitDTO dto = new RecordSampleSubmitDTO();
         dto.setId(obj.getId());

+ 62 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -8,27 +8,29 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.entity.TableFile;
-import org.springblade.manager.entity.TextdictInfo;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.impl.ExcelTabServiceImpl;
 import org.springblade.manager.service.impl.TextdictInfoServiceImpl;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springblade.manager.vo.WbsTreePrivateVO4;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @RestController
@@ -42,6 +44,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     private final TextdictInfoServiceImpl textDictInfoService;
     private final WbsTreeContractServiceImpl wbsTreeContractService;
     private final WbsTreePrivateMapper privateMapper;
+    private final IExcelTabService iExcelTabService;
 
     @Override
     public List<WbsTreePrivate> queryAllNodeByProjectId(String projectId) {
@@ -262,6 +265,61 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
         return R.data(node);
     }
 
+    @Override
+    public R<List<WbsTreePrivateVO4>> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
+        // 获取试验记录信息实体 从而获取委托单编号
+        TrialSelfInspectionRecord trialSelfInspectionRecord = null;
+        if(ObjectUtil.isNotEmpty(id)){
+            String sqlForInspectionRecord = "select entrust_id from u_trial_self_inspection_record  where id=" + id;
+            trialSelfInspectionRecord = jdbcTemplate.queryForObject(sqlForInspectionRecord, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class));
+        }
+
+        List<WbsTreePrivateVO4> wbsTreePrivateVO4s = wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId, isAdd, id);
+        for (WbsTreePrivateVO4 treePrivate : wbsTreePrivateVO4s) {
+            //试验新增
+            if ((new Integer(1).equals(isAdd)) && ObjectUtil.isEmpty(id)) {
+                //按钮状态
+                treePrivate.setPdfUrl(null);
+                treePrivate.setIsBussShow(ObjectUtil.isNotEmpty(treePrivate.getIsBussShow()) ? treePrivate.getIsBussShow() : 1); //新增时通过项目wbs表的isBussShow字段单独控制
+                treePrivate.setIsTabPdf(1);
+                treePrivate.setTabFileType(1);
+            }
+
+            //试验编辑
+            else if (ObjectUtil.isNotEmpty(id)) {
+                //返回委托单id
+                treePrivate.setEntrustId(trialSelfInspectionRecord.getEntrustId());
+                //获取当前试验记录信息中表的按钮状态
+                String sql = "select tab_id,is_buss_show,is_tab_pdf,is_tab_file_type from u_trial_self_data_record where record_id = " + id;
+                Map<Long, TrialSelfDataRecord> map = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class)).stream().collect(Collectors.toMap(TrialSelfDataRecord::getTabId, Function.identity()));
+
+                //按钮状态
+                TrialSelfDataRecord record = map.get(treePrivate.getPKeyId());
+                if (record != null) {
+                    treePrivate.setIsBussShow(record.getIsBussShow()); //编辑时通过试验记录关联关系控制
+                    treePrivate.setIsTabPdf(record.getIsTabPdf());
+                    treePrivate.setTabFileType(record.getIsTabFileType());
+                } else {
+                    treePrivate.setPdfUrl(null);
+                    treePrivate.setIsBussShow(ObjectUtil.isNotEmpty(treePrivate.getIsBussShow()) ? treePrivate.getIsBussShow() : 1); //没有记录的就根据项目wbs表的isBussShow字段单独控制
+                    treePrivate.setIsTabPdf(1);
+                    treePrivate.setTabFileType(1);
+                }
+
+                //表单数据
+                List<Map<String, Object>> bussDataInfoTrial = iExcelTabService.getBussDataInfoTrial(id, treePrivate.getPKeyId(), Long.parseLong(contractId),null,null,null);
+                if (bussDataInfoTrial != null && bussDataInfoTrial.size() > 0) {
+                    bussDataInfoTrial.get(0).remove("group_id");
+                    treePrivate.setBussDataInfoTrial(bussDataInfoTrial.get(0));
+                    if(bussDataInfoTrial.get(0)!=null && Func.isNotEmpty(bussDataInfoTrial.get(0))){
+                        treePrivate.setLoadDataId(bussDataInfoTrial.get(0).get("loadDataId")+"");
+                    }
+                }
+            }
+        }
+        return R.data(wbsTreePrivateVO4s);
+    }
+
     private void foreachSetChildList(List<WbsTreeContractTreeVOS> vosResult, List<WbsTreePrivateVO> voList) {
         voList.forEach(wbsTreePrivateVO -> {
             WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();

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

@@ -101,5 +101,5 @@ public interface IFormulaService extends BaseService<Formula> {
     R<Object> syncWorkDate(@NotNull(message = "节点ID不能为空") Long nodeId);
 
     /** 万盛计量专用统计数据*/
-    List<ReportResult> execute4(Long reportId,Long contractId, Long periodId, Integer type,Long projectId) throws FileNotFoundException, IllegalAccessException;
+    List<ReportResult> (Long reportId,Long contractId, Long periodId, Integer type,Long projectId) throws FileNotFoundException, IllegalAccessException;
 }

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

@@ -2737,6 +2737,32 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             k7.setCellValue(endMoney.toString());
             //------------------------------------------------------------支付比例------------------------------------------------------------
             Cell m7 = getCellByAddress(sheet, "M7");
+            //--------------------------------------------------------------特殊情况---------------------------------------------------------------------
+            if(isOnePeriod){
+                ContractInfo contractInfo = getContractInfo(contractId);
+                //石林至青年公路升级改造工程(张家嘴至大山坡段)项目
+                if(ObjectUtil.isNotEmpty(contractInfo) && contractInfo.getPId().equals("1724003131995856897") && contractId.toString().equals("1724004695154237442")){//石林至青年公路升级改造工程(张家嘴至大山坡段)合同段
+                    //上期末累计支付写死
+                    lastEndPay = new BigDecimal(1260000);
+                    Cell e6New = getCellByAddress(sheet, "E6");
+                    e6New.setCellValue(lastEndPay.toString());
+                    //本期支付=本期末累计支付-上期末累计支付
+                    currentPay = endPay.subtract(lastEndPay);
+                    Cell i6New = getCellByAddress(sheet, "I6");
+                    i6New.setCellValue(currentPay.toString());
+                }else if (ObjectUtil.isNotEmpty(contractInfo) && contractInfo.getPId().equals("1701065246615506946") && contractId.toString().equals("1701169960321519618")){//万盛城区至方家山公路工程合同段
+                    //万盛城区至方家山公路工程项目
+                    //上期末累计支付写死
+                    lastEndPay = new BigDecimal(2050000);
+                    Cell e6New = getCellByAddress(sheet, "E6");
+                    e6New.setCellValue(lastEndPay.toString());
+                    //本期支付=本期末累计支付-上期末累计支付
+                    currentPay = endPay.subtract(lastEndPay);
+                    Cell i6New = getCellByAddress(sheet, "I6");
+                    i6New.setCellValue(currentPay.toString());
+                }
+
+            }
 
             //***************************************************************合计*************************************************************************
             //------------------------------------------------------------项目总投资------------------------------------------------------------
@@ -2768,6 +2794,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             //------------------------------------------------------------支付比例------------------------------------------------------------
             Cell m8 = getCellByAddress(sheet, "M8");
 
+
             //***************************************************************所有日期*************************************************************************
             //顶部日期
             Cell j4 = getCellByAddress(sheet, "J4");
@@ -2879,7 +2906,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             a5.setCellValue(totalMoney.toString());
             //------------------------------------------------------------上期末累计变更------------------------------------------------------------
             BigDecimal lastEndChangeMoney = new BigDecimal(0);
-            if (isOnePeriod){
+            if (isOnePeriod){//第一期
                 lastEndChangeMoney = lastEndChangeMoney;
             }else {
                 if(list.size()>0){
@@ -3008,6 +3035,32 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             BigDecimal endDeductionMoney = lastEndDeduct.add(deductionMoney);
             Cell i9 = getCellByAddress(sheet, "I9");
             i9.setCellValue(endDeductionMoney.toString());
+            //--------------------------------------------------------------特殊情况---------------------------------------------------------------------
+            if(isOnePeriod){
+                ContractInfo contractInfo = getContractInfo(contractId);
+
+                if(ObjectUtil.isNotEmpty(contractInfo) && contractInfo.getPId().equals("1724003131995856897") && contractId.toString().equals("1724004695154237442")){// 石林至青年公路升级改造工程(张家嘴至大山坡段)合同段
+                    //石林至青年公路升级改造工程(张家嘴至大山坡段)项目
+                    //上期末累计支付写死
+                    lastEndPay = new BigDecimal(1260000);
+                    Cell c7New = getCellByAddress(sheet, "C7");
+                    c7New.setCellValue(lastEndPay.toString());
+                    //本期支付=本期末累计支付-上期末累计支付
+                    currentPay = endPay.subtract(lastEndPay);
+                    Cell i7New = getCellByAddress(sheet, "I7");
+                    i7New.setCellValue(currentPay.toString());
+                }else if(ObjectUtil.isNotEmpty(contractInfo) && contractInfo.getPId().equals("1701065246615506946") && contractId.toString().equals("1701169960321519618")){//万盛城区至方家山公路工程合同段
+                    //万盛城区至方家山公路工程项目
+                    //上期末累计支付写死
+                    lastEndPay = new BigDecimal(2050000);
+                    Cell c7New = getCellByAddress(sheet, "C7");
+                    c7New.setCellValue(lastEndPay.toString());
+                    //本期支付=本期末累计支付-上期末累计支付
+                    currentPay = endPay.subtract(lastEndPay);
+                    Cell i7New = getCellByAddress(sheet, "I7");
+                    i7New.setCellValue(currentPay.toString());
+                }
+            }
             //------------------------------------------------------------日期------------------------------------------------------------
             //顶部日期
             Cell g3 = getCellByAddress(sheet, "G3");

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

@@ -39,7 +39,6 @@ import org.springblade.manager.service.IElementFormulaMappingService;
 import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsTreePrivateService;
-import org.springblade.manager.utils.CompositeKey;
 import org.springblade.manager.utils.CompositeKey1;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
@@ -2670,7 +2669,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         if (wbsTreePrivate == null) {
             return Collections.emptyList();
         }
-
+        //试验一键重签专用  会传这个四个参数 只是为了重签查询数据  直接查了返回就行 不用校验角色
+        if(tableType.equals("1,9,2,10")){
+            return baseMapper.selectWbsTreeTrialTabList(tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), contractId);
+        }
         //当前项目合同段只会存在一个角色roleId
         SaveUserInfoByProject userInfo = wbsTreeContractMapper.selectRoleInfo(AuthUtil.getUserId(), contractId, projectId);
         if (userInfo == null) {