Ver código fonte

Merge branch 'dev'

lvy 3 meses atrás
pai
commit
7c37bca782

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

@@ -18,6 +18,9 @@ package org.springblade.resource.builder.oss;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.OssTemplate;
@@ -33,10 +36,12 @@ import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.core.tool.utils.WebUtil;
 import org.springblade.resource.entity.Oss;
 import org.springblade.resource.service.IOssService;
+import org.springblade.system.cache.ParamCache;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import static org.springblade.core.cache.constant.CacheConstant.PARAM_CACHE;
 import static org.springblade.core.cache.constant.CacheConstant.RESOURCE_CACHE;
 
 /**
@@ -85,9 +90,14 @@ public class OssBuilder {
 	public OssTemplate template(String code) {
 		String tenantId = AuthUtil.getTenantId();
 		Oss oss = getOss(tenantId, code);
-
-		//oss.setEndpoint("http://183.247.216.148:9000/");
-		// oss.setEndpoint("https://xinan1.zos.ctyun.cn");
+        String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
+        if(SystemUtils.isMacOs()||SystemUtils.isWindows()){
+            if("20".equals(sys_isonline)){
+                oss.setEndpoint("http://183.247.216.148:9000/");
+            }else {
+                oss.setEndpoint("https://xinan1.zos.ctyun.cn");
+            }
+        }
 		Oss ossCached = ossPool.get(tenantId);
 		OssTemplate template = templatePool.get(tenantId);
 		// 若为空或者不一致,则重新加载

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InterimPayCertificate.java

@@ -131,6 +131,9 @@ InterimPayCertificate extends BaseEntity {
     @ApiModelProperty(value = "电签前-预览pdf")
     private String prePdfUrl;
 
+    @ApiModelProperty(value = "分页之后的PDF地址")
+    private String pagePdfUrl;
+
     /**
      * 每份表格独立的PDF地址
      */

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

@@ -3,6 +3,10 @@ package org.springblade.evisa.service.impl;
 
 import cfca.paperless.base.util.Base64;
 import cn.hutool.core.io.file.FileReader;
+
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
@@ -45,10 +49,7 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -83,6 +84,7 @@ public class EVDataServiceImpl implements EVDataService {
                 return;
             }
             this.addSignatureTaskBatch(taskApp);
+            //for循环 pdfUrl分割
             String fileUrl = CommonUtil.replaceOssUrl(taskApp.getSignPdfUrl());
             System.out.println("s1231312"+fileUrl);
             List<String> eVisaConfigList = PDFUtils.getPdfSignIds(fileUrl, taskApp);
@@ -167,6 +169,7 @@ public class EVDataServiceImpl implements EVDataService {
             // 添加废除通知
             //messageWarningClient.
         }
+        //循环结束
     }
 
 
@@ -417,7 +420,24 @@ public class EVDataServiceImpl implements EVDataService {
 
             } else if (taskApp.getApprovalType() == 5) {
                 map = this.jdbcTemplate.queryForMap("select * from s_interim_pay_certificate where  is_deleted=0 and contract_period_id = " + taskApp.getFormDataId());
-                taskApp.setSignPdfUrl(map.get("raw_url") + "");
+                String pdfUrl=map.get("raw_url") + "";
+                //中间计量用逗号拼接pagePdfUrl
+                if(StringUtils.isNotEmpty(map.get("page_pdf_url")+"")){
+                    String jsonStr=map.get("page_pdf_url")+"";
+                    ObjectMapper mapper = new ObjectMapper();
+                    JsonNode jsonNode = mapper.readTree(jsonStr);
+                    StringBuilder result = new StringBuilder();
+                    Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
+                    while (fields.hasNext()) {
+                        Map.Entry<String, JsonNode> entry = fields.next();
+                        result.append(entry.getValue().asText());
+                        if (fields.hasNext()) {
+                            result.append(",");
+                        }
+                    }
+                    pdfUrl=result.toString();
+                }
+                taskApp.setSignPdfUrl(pdfUrl);
             } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                 map = this.jdbcTemplate.queryForMap("select * from  s_material_start_statement where is_deleted=0 and meter_period_id = " + taskApp.getFormDataId());
                 taskApp.setSignPdfUrl(map.get("raw_url") + "");

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

@@ -148,7 +148,7 @@ public class NodeBaseInfoController extends BladeController {
     @GetMapping("/getNodeBaseInfoByPkeyId")
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "设置自动获取", notes = "pkeyId表单Id,nodeId节点Id")
-    public R getNodeBaseInfoByPkeyId(@RequestParam Long pkeyId, @RequestParam Long nodeId, @RequestParam Integer autoType,@RequestParam(required = false) BigDecimal min,@RequestParam(required = false)BigDecimal max){
+    public R getNodeBaseInfoByPkeyId(@RequestParam Long pkeyId, @RequestParam Long nodeId, @RequestParam String autoType,@RequestParam(required = false) BigDecimal min,@RequestParam(required = false)BigDecimal max){
         return R.data(nodeBaseInfoService.getNodeBaseInfoByPkeyId(pkeyId,nodeId,autoType,min,max));
     }
 

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

@@ -43,7 +43,7 @@ public interface INodeBaseInfoService extends BaseService<NodeBaseInfo> {
 
     NodeBaseInfo getOrSaveNodeBaseInfo(Long pKeyId);
 
-    Object getNodeBaseInfoByPkeyId(Long pkeyId, Long nodeId, Integer autoType, BigDecimal min,BigDecimal max);
+    Object getNodeBaseInfoByPkeyId(Long pkeyId, Long nodeId, String autoType, BigDecimal min,BigDecimal max);
 
 	Map<String,Object> getAllNodeBaseInfoByPkeyId(Long pkeyId,Long nodeId) throws Exception;
 }

+ 24 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/NodeBaseInfoServiceImpl.java

@@ -23,6 +23,7 @@ import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
@@ -160,34 +161,40 @@ public class NodeBaseInfoServiceImpl extends BaseServiceImpl<NodeBaseInfoMapper,
 
 
     @Override
-    public Object getNodeBaseInfoByPkeyId(Long pkeyId, Long nodeId, Integer autoType, BigDecimal min, BigDecimal max) {
+    public Object getNodeBaseInfoByPkeyId(Long pkeyId, Long nodeId, String autoType, BigDecimal min, BigDecimal max) {
         String result="";
-        if(autoType!=8){
+        String[] strings = autoType.split(",");
+        List<String> types = Arrays.asList(strings);
+        if(types.size()>1&&types.contains("8")){
+            throw  new ServiceException("高程偏差/顶面偏差不能和节点类型同时选择");
+        }
+        if(types.size()>0&&!types.contains("8")){
             NodeBaseInfo nodeBaseInfo = baseMapper.selectOne(new QueryWrapper<NodeBaseInfo>().eq("node_id", nodeId));
             if(nodeBaseInfo!=null){
-                if(autoType==1){
-                    result= nodeBaseInfo.getUnit();
+                if(types.contains("1")&&!StringUtil.isEmpty(nodeBaseInfo.getUnit())){
+                    result=result+nodeBaseInfo.getUnit();
                 }
-                if(autoType==2){
-                    result= nodeBaseInfo.getSubUnit();
+                if(types.contains("2")&&!StringUtil.isEmpty(nodeBaseInfo.getSubUnit())){
+                    result= result+nodeBaseInfo.getSubUnit();
                 }
-                if (autoType==3){
-                    result= nodeBaseInfo.getDivision();
+                if (types.contains("3")&&!StringUtil.isEmpty(nodeBaseInfo.getDivision())){
+                    result=result+nodeBaseInfo.getDivision();
                 }
-                if(autoType==4){
-                    result= nodeBaseInfo.getSubDivision();
+                if(types.contains("4")&&!StringUtil.isEmpty(nodeBaseInfo.getSubDivision())){
+                    result=result+nodeBaseInfo.getSubDivision();
                 }
-                if(autoType==5){
-                    result= nodeBaseInfo.getItem();
+                if(types.contains("5")&&!StringUtil.isEmpty(nodeBaseInfo.getItem())){
+                    result=result+nodeBaseInfo.getItem();
                 }
-                if (autoType==6){
-                    result= nodeBaseInfo.getSubItem();
+                if (types.contains("6")&&!StringUtil.isEmpty(nodeBaseInfo.getSubItem())){
+                    result=result+nodeBaseInfo.getSubItem();
                 }
-                if (autoType==7){
-                    result= nodeBaseInfo.getProcesses();
+                if (types.contains("7")&&!StringUtil.isEmpty(nodeBaseInfo.getProcesses())){
+                    result=result+nodeBaseInfo.getProcesses();
                 }
             }
-        }else {
+        }
+        if(types.size()==1&&types.contains("8")) {
             if (min.compareTo(max) >= 0) {
                 throw new IllegalArgumentException("max must be greater than min");
             }

+ 241 - 147
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -78,6 +78,7 @@ import org.springblade.meter.service.ITaskRepealMessageService;
 import org.springblade.meter.service.impl.*;
 import org.springblade.meter.utils.*;
 import org.springblade.meter.vo.*;
+import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.user.entity.User;
@@ -96,6 +97,7 @@ import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -161,6 +163,7 @@ public class TaskController extends BladeController {
     private final IInterimPayCertificateService interimPayCertificateService;
     private final IInterimPayCertificateItemService interimPayCertificateItemService;
     private final OperationLogClient operationLogClient;
+    private final CommonFileClient commonFileClient;
     // 计量公式入口
     private final FormulaClient formulaClient;
 
@@ -173,7 +176,7 @@ public class TaskController extends BladeController {
     @ApiOperation(value = "获取任务名称", notes = "传入合同段contractId、期数id(变更令传勾选的id字符串英文逗号拼接)、type=1(中间计量申请)、=2(材料计量单)、3=(开工预付款计量单)、=4(变更令)")
     public R<Object> name(@RequestParam String contractId, @RequestParam String id, @RequestParam String type) {
         String name = null;
-        BigDecimal bigDecimal=null;
+        BigDecimal bigDecimal=BigDecimal.ZERO;
         if (ObjectUtil.isNotEmpty(contractId) && ObjectUtil.isNotEmpty(id)) {
             ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name FROM m_contract_info WHERE id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
             String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
@@ -202,7 +205,14 @@ public class TaskController extends BladeController {
                     }
                 }
             }
-             bigDecimal = middleMeterApplyTaskMapper.selectAllMoney(Long.valueOf(contractId), Long.valueOf(id));
+            List<Long> longs = Func.toLongList(id);
+            for (Long l : longs) {
+               BigDecimal bigDecimal1 = middleMeterApplyTaskMapper.selectAllMoney(Long.valueOf(contractId), Long.valueOf(l));
+                if(bigDecimal1!=null&&bigDecimal1.compareTo(BigDecimal.ZERO)==0){
+                    bigDecimal=bigDecimal.add(bigDecimal1);
+                }
+            }
+
         }
         Map<String,Object> map=new HashMap<>();
         map.put("name",name);
@@ -217,7 +227,7 @@ public class TaskController extends BladeController {
 //    @PushMessage(clientId = ClientIdConstant.METER_CLIENT_ID)
     @Transactional(rollbackFor = Exception.class)
     public R<Object> approval(@RequestBody MeterApprovalDTO approvalDTO) {
-        if (ObjectUtil.isEmpty(approvalDTO.getBatch()) || ObjectUtil.isEmpty(approvalDTO.getPeriodId()) || ObjectUtil.isEmpty(approvalDTO.getProjectId()) || ObjectUtil.isEmpty(approvalDTO.getContractId()) || ObjectUtil.isEmpty(approvalDTO.getTaskName()) || ObjectUtil.isEmpty(approvalDTO.getRestrictDay())) {
+        if (ObjectUtil.isEmpty(approvalDTO.getBatch()) || ObjectUtil.isEmpty(approvalDTO.getPeriodId()) || ObjectUtil.isEmpty(approvalDTO.getProjectId()) || ObjectUtil.isEmpty(approvalDTO.getTaskName())||ObjectUtil.isEmpty(approvalDTO.getContractId()) ||  ObjectUtil.isEmpty(approvalDTO.getRestrictDay())) {
             throw new ServiceException("请求入参数据异常,操作失败");
         }
 
@@ -304,7 +314,7 @@ public class TaskController extends BladeController {
                     /*构造创建审批任务*/
                     Set<String> aopParamsSet = new HashSet<>();
                     try {
-                        this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 1);
+                        this.buildTaskInfo(taskId+"", approvalDTO, aopParamsSet, 1);
                     } catch (Exception e) {
                         throw new ServiceException("创建审批任务异常," + e.getMessage());
                     }
@@ -419,7 +429,7 @@ public class TaskController extends BladeController {
                     /*构造创建审批任务*/
                     Set<String> aopParamsSet = new HashSet<>();
                     try {
-                        this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 2);
+                        this.buildTaskInfo(taskId+"", approvalDTO, aopParamsSet, 2);
                     } catch (Exception e) {
                         throw new ServiceException("创建审批任务异常," + e.getMessage());
                     }
@@ -487,7 +497,7 @@ public class TaskController extends BladeController {
                     /*构造创建审批任务*/
                     Set<String> aopParamsSet = new HashSet<>();
                     try {
-                        this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 3);
+                        this.buildTaskInfo(taskId+"", approvalDTO, aopParamsSet, 3);
                     } catch (Exception e) {
                         throw new ServiceException("创建审批任务异常," + e.getMessage());
                     }
@@ -513,8 +523,10 @@ public class TaskController extends BladeController {
             } else if (approvalDTO.getType().equals(4)) {
                 /*==================== 变更令 ====================*/
                 Set<String> aopParamsSet = new HashSet<>();
-                Long taskId = SnowFlakeUtil.getId();
+                String taskIds="";
                 for (String id : approvalDTO.getPeriodId().split(",")) {
+                    Long taskId = SnowFlakeUtil.getId();
+                    taskIds=taskIds+","+taskId;
                     /*获取变更令信息*/
                     ChangeTokenForm changeTokenForm = changeTokenFormService.getById(id);
                     if (changeTokenForm != null) {
@@ -574,10 +586,10 @@ public class TaskController extends BladeController {
                         throw new ServiceException("未获取到当前变更令信息,操作失败");
                     }
                 }
-
+                taskIds=taskIds.substring(1,taskIds.length());
                 /*构造创建审批任务*/
                 try {
-                    this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 4);
+                    this.buildTaskInfo(taskIds, approvalDTO, aopParamsSet, 4);
                 } catch (Exception e) {
                     throw new ServiceException("创建审批任务异常," + e.getMessage());
                 }
@@ -601,7 +613,7 @@ public class TaskController extends BladeController {
      * @param aopParamsSet
      * @param meterTaskType
      */
-    private void buildTaskInfo(Long taskId, MeterApprovalDTO approvalDTO, Set<String> aopParamsSet, Integer meterTaskType) {
+    private void buildTaskInfo(String taskId, MeterApprovalDTO approvalDTO, Set<String> aopParamsSet, Integer meterTaskType) {
         /*预设流程*/
         Map<String, List<FixedFlowLink>> sortedMap = null;
         if (ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId())) {
@@ -629,157 +641,163 @@ public class TaskController extends BladeController {
             throw new ServiceException(objectR.getMsg());
         }
 
-        /*主任务*/
-        Long processInstanceId = SnowFlakeUtil.getId();
-        Task task = new Task();
-        task.setId(taskId);
-        Date nowTime = new Date();
-        task.setStartTime(DateUtil.format(nowTime, "yyyy-MM-dd"));
-        task.setEndTime(DateUtil.format(DateUtils.addDays(nowTime, approvalDTO.getRestrictDay()), "yyyy-MM-dd"));
-        task.setProcessDefinitionId(SnowFlakeUtil.getId().toString());
-        task.setProcessInstanceId(processInstanceId.toString()); //实例id
-        task.setReportUser(AuthUtil.getUserId().toString());
-        task.setReportUserName(AuthUtil.getNickName());
-        task.setCreateUser(AuthUtil.getUserId());
-        task.setCreateTime(nowTime);
-        task.setUpdateTime(nowTime);
-        task.setUpdateUser(AuthUtil.getUserId());
-        task.setCreateDept(null);
-        task.setTaskContent(ObjectUtil.isNotEmpty(approvalDTO.getTaskDesc()) ? approvalDTO.getTaskDesc() : null);
-        task.setTaskUser(null);
-        task.setFormDataId(approvalDTO.getPeriodId()); //数据指向,指向期数id(变更令为id英文逗号拼接)
-        task.setTaskName(approvalDTO.getTaskName());
-        task.setContractId(approvalDTO.getContractId().toString());
-        task.setProjectId(approvalDTO.getProjectId().toString());
-        task.setBatch(approvalDTO.getBatch());
-        task.setMeterTaskType(meterTaskType); //计量任务类型 1=中间计量申请,2=材料计量单,3=开工预付款计量单、4=变更令
-        task.setIsBuildAudit(approvalDTO.getIsBuildAudit());
-
-        task.setType(1);
-
-        task.setApprovalType(meterTaskType+4); //计量
-        task.setFixedFlowId(ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId()) ? Long.parseLong(approvalDTO.getFixedFlowId()) : 0L);
-        task.setStatus(1); //待审批
-        task.setIsDeleted(0);
-
-        try {
-            boolean taskBool = taskClient.saveTask(task);
-            if (!taskBool) {
-                throw new ServiceException("任务创建失败");
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new ServiceException("任务创建失败:" + e.getMessage());
-        }
-
-        /*副任务*/
-        /*1.非预设流程*/
-        if (sortedMap == null) {
-            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));
-
-            /*(approvalDTO.getTaskUserIds()是按顺序构造,所以创建的任务也是按照顺序构造)*/
-            String[] userIds = approvalDTO.getTaskUserIds().split(",");
-            int sort = 1;
-            for (String userId : userIds) {
-                TaskParallel taskParallel = new TaskParallel();
-                taskParallel.setId(SnowFlakeUtil.getId());
-                taskParallel.setProcessInstanceId(processInstanceId.toString());
-                taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
-                taskParallel.setTaskUser(userId);
-                if (nameMap.get(Long.parseLong(userId)) != null) {
-                    taskParallel.setTaskUserName(nameMap.get(Long.parseLong(userId)));
-                }
-                taskParallel.setInitiative(1);
-                taskParallel.setCreateUser(AuthUtil.getUserId());
-                taskParallel.setCreateTime(nowTime);
-                taskParallel.setUpdateTime(nowTime);
-                taskParallel.setUpdateUser(AuthUtil.getUserId());
-                taskParallel.setCreateDept(null);
-                taskParallel.setStatus(1); //待审批
-                taskParallel.setIsDeleted(0);
-                taskParallel.setSort(sort++);
-                taskClient.saveTaskParallel(taskParallel);
-
-                String param = userId + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
-                aopParamsSet.add(param);
-            }
-
-        } else {
+        String[] formDataIds = approvalDTO.getPeriodId().split(",");
+        String[] taskIdList = taskId.split(",");
+        for (int i = 0; i < formDataIds.length; i++) {
+            /*主任务*/
+            Long processInstanceId = SnowFlakeUtil.getId();
+            Task task = new Task();
+            task.setId(Long.valueOf(taskIdList[i]));
+            Date nowTime = new Date();
+            task.setStartTime(DateUtil.format(nowTime, "yyyy-MM-dd"));
+            task.setEndTime(DateUtil.format(DateUtils.addDays(nowTime, approvalDTO.getRestrictDay()), "yyyy-MM-dd"));
+            task.setProcessDefinitionId(SnowFlakeUtil.getId().toString());
+            task.setProcessInstanceId(processInstanceId.toString()); //实例id
+            task.setReportUser(AuthUtil.getUserId().toString());
+            task.setReportUserName(AuthUtil.getNickName());
+            task.setCreateUser(AuthUtil.getUserId());
+            task.setCreateTime(nowTime);
+            task.setUpdateTime(nowTime);
+            task.setUpdateUser(AuthUtil.getUserId());
+            task.setCreateDept(null);
+            task.setTaskContent(ObjectUtil.isNotEmpty(approvalDTO.getTaskDesc()) ? approvalDTO.getTaskDesc() : null);
+            task.setTaskUser(null);
+            task.setFormDataId(formDataIds[i]); //数据指向,指向期数id(变更令为id英文逗号拼接)
+            task.setTaskName(approvalDTO.getTaskName());
+            task.setContractId(approvalDTO.getContractId().toString());
+            task.setProjectId(approvalDTO.getProjectId().toString());
+            task.setBatch(approvalDTO.getBatch());
+            task.setMeterTaskType(meterTaskType); //计量任务类型 1=中间计量申请,2=材料计量单,3=开工预付款计量单、4=变更令
+            task.setIsBuildAudit(approvalDTO.getIsBuildAudit());
+
+            task.setType(1);
+
+            task.setApprovalType(meterTaskType+4); //计量
+            task.setFixedFlowId(ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId()) ? Long.parseLong(approvalDTO.getFixedFlowId()) : 0L);
+            task.setStatus(1); //待审批
+            task.setIsDeleted(0);
 
-            /*2.预设流程*/
-            Set<Integer> sortList = new HashSet<>();
-            for (Map.Entry<String, List<FixedFlowLink>> stringListEntry : sortedMap.entrySet()) {
-                int maxSort;
-                if (sortList.isEmpty()) {
-                    maxSort = 1;
-                } else {
-                    maxSort = Collections.max(sortList) + 1;
+            try {
+                boolean taskBool = taskClient.saveTask(task);
+                if (!taskBool) {
+                    throw new ServiceException("任务创建失败");
                 }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException("任务创建失败:" + e.getMessage());
+            }
+
+            /*副任务*/
+            /*1.非预设流程*/
+            if (sortedMap == null) {
+                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));
+
+                /*(approvalDTO.getTaskUserIds()是按顺序构造,所以创建的任务也是按照顺序构造)*/
+                String[] userIds = approvalDTO.getTaskUserIds().split(",");
+                int sort = 1;
+                for (String userId : userIds) {
+                    TaskParallel taskParallel = new TaskParallel();
+                    taskParallel.setId(SnowFlakeUtil.getId());
+                    taskParallel.setProcessInstanceId(processInstanceId.toString());
+                    taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
+                    taskParallel.setTaskUser(userId);
+                    if (nameMap.get(Long.parseLong(userId)) != null) {
+                        taskParallel.setTaskUserName(nameMap.get(Long.parseLong(userId)));
+                    }
+                    taskParallel.setInitiative(1);
+                    taskParallel.setCreateUser(AuthUtil.getUserId());
+                    taskParallel.setCreateTime(nowTime);
+                    taskParallel.setUpdateTime(nowTime);
+                    taskParallel.setUpdateUser(AuthUtil.getUserId());
+                    taskParallel.setCreateDept(null);
+                    taskParallel.setStatus(1); //待审批
+                    taskParallel.setIsDeleted(0);
+                    taskParallel.setSort(sort++);
+                    taskClient.saveTaskParallel(taskParallel);
 
-                String sortStr = stringListEntry.getKey();
-                String branchType = sortStr.split("@@@")[1];
+                    String param = userId + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
+                    aopParamsSet.add(param);
+                }
 
-                List<FixedFlowLink> value = stringListEntry.getValue();
+            } else {
 
-                if (branchType.equals("1")) {
-                    //垂直,sort排序
-                    value.sort(Comparator.comparingInt(FixedFlowLink::getFixedFlowLinkSort));
+                /*2.预设流程*/
+                Set<Integer> sortList = new HashSet<>();
+                for (Map.Entry<String, List<FixedFlowLink>> stringListEntry : sortedMap.entrySet()) {
+                    int maxSort;
+                    if (sortList.isEmpty()) {
+                        maxSort = 1;
+                    } else {
+                        maxSort = Collections.max(sortList) + 1;
+                    }
 
-                    for (FixedFlowLink fixedFlowLink : value) {
-                        TaskParallel taskParallel = new TaskParallel();
-                        taskParallel.setId(SnowFlakeUtil.getId());
-                        taskParallel.setProcessInstanceId(processInstanceId.toString());
-                        taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
-                        taskParallel.setTaskUser(fixedFlowLink.getFixedFlowLinkUser().toString());
-                        taskParallel.setTaskUserName(fixedFlowLink.getFixedFlowLinkUserName());
-                        taskParallel.setInitiative(1);
-                        taskParallel.setCreateUser(AuthUtil.getUserId());
-                        taskParallel.setCreateTime(nowTime);
-                        taskParallel.setUpdateTime(nowTime);
-                        taskParallel.setUpdateUser(AuthUtil.getUserId());
-                        taskParallel.setCreateDept(null);
-                        taskParallel.setStatus(1);
-                        taskParallel.setIsDeleted(0);
+                    String sortStr = stringListEntry.getKey();
+                    String branchType = sortStr.split("@@@")[1];
 
-                        sortList.add(maxSort);
-                        taskParallel.setSort(maxSort++);
+                    List<FixedFlowLink> value = stringListEntry.getValue();
 
-                        taskClient.saveTaskParallel(taskParallel);
+                    if (branchType.equals("1")) {
+                        //垂直,sort排序
+                        value.sort(Comparator.comparingInt(FixedFlowLink::getFixedFlowLinkSort));
 
-                        String param = fixedFlowLink.getFixedFlowLinkUser() + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
-                        aopParamsSet.add(param);
-                    }
+                        for (FixedFlowLink fixedFlowLink : value) {
+                            TaskParallel taskParallel = new TaskParallel();
+                            taskParallel.setId(SnowFlakeUtil.getId());
+                            taskParallel.setProcessInstanceId(processInstanceId.toString());
+                            taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
+                            taskParallel.setTaskUser(fixedFlowLink.getFixedFlowLinkUser().toString());
+                            taskParallel.setTaskUserName(fixedFlowLink.getFixedFlowLinkUserName());
+                            taskParallel.setInitiative(1);
+                            taskParallel.setCreateUser(AuthUtil.getUserId());
+                            taskParallel.setCreateTime(nowTime);
+                            taskParallel.setUpdateTime(nowTime);
+                            taskParallel.setUpdateUser(AuthUtil.getUserId());
+                            taskParallel.setCreateDept(null);
+                            taskParallel.setStatus(1);
+                            taskParallel.setIsDeleted(0);
+
+                            sortList.add(maxSort);
+                            taskParallel.setSort(maxSort++);
+
+                            taskClient.saveTaskParallel(taskParallel);
+
+                            String param = fixedFlowLink.getFixedFlowLinkUser() + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
+                            aopParamsSet.add(param);
+                        }
 
-                } else if (branchType.equals("2")) {
-
-                    //平行,固定sort
-                    for (FixedFlowLink fixedFlowLink : value) {
-                        TaskParallel taskParallel = new TaskParallel();
-                        taskParallel.setId(SnowFlakeUtil.getId());
-                        taskParallel.setProcessInstanceId(processInstanceId.toString());
-                        taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
-                        taskParallel.setTaskUser(fixedFlowLink.getFixedFlowLinkUser().toString());
-                        taskParallel.setTaskUserName(fixedFlowLink.getFixedFlowLinkUserName());
-                        taskParallel.setInitiative(1);
-                        taskParallel.setCreateUser(AuthUtil.getUserId());
-                        taskParallel.setCreateTime(nowTime);
-                        taskParallel.setUpdateTime(nowTime);
-                        taskParallel.setUpdateUser(AuthUtil.getUserId());
-                        taskParallel.setCreateDept(null);
-                        taskParallel.setStatus(1);
-                        taskParallel.setIsDeleted(0);
-
-                        sortList.add(maxSort);
-                        taskParallel.setSort(maxSort);
-
-                        taskClient.saveTaskParallel(taskParallel);
-
-                        String param = fixedFlowLink.getFixedFlowLinkUser() + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
-                        aopParamsSet.add(param);
+                    } else if (branchType.equals("2")) {
+
+                        //平行,固定sort
+                        for (FixedFlowLink fixedFlowLink : value) {
+                            TaskParallel taskParallel = new TaskParallel();
+                            taskParallel.setId(SnowFlakeUtil.getId());
+                            taskParallel.setProcessInstanceId(processInstanceId.toString());
+                            taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
+                            taskParallel.setTaskUser(fixedFlowLink.getFixedFlowLinkUser().toString());
+                            taskParallel.setTaskUserName(fixedFlowLink.getFixedFlowLinkUserName());
+                            taskParallel.setInitiative(1);
+                            taskParallel.setCreateUser(AuthUtil.getUserId());
+                            taskParallel.setCreateTime(nowTime);
+                            taskParallel.setUpdateTime(nowTime);
+                            taskParallel.setUpdateUser(AuthUtil.getUserId());
+                            taskParallel.setCreateDept(null);
+                            taskParallel.setStatus(1);
+                            taskParallel.setIsDeleted(0);
+
+                            sortList.add(maxSort);
+                            taskParallel.setSort(maxSort);
+
+                            taskClient.saveTaskParallel(taskParallel);
+
+                            String param = fixedFlowLink.getFixedFlowLinkUser() + "," + approvalDTO.getProjectId() + "," + approvalDTO.getContractId();
+                            aopParamsSet.add(param);
+                        }
                     }
                 }
             }
         }
+
+
     }
 
     /**
@@ -4413,6 +4431,7 @@ public class TaskController extends BladeController {
                 executionTime.info("生成PDF");
                 /*合并所有表*/
                 fileUrl = report.getReportPdf(file_path, reportResults);
+                //进行分页 400页一份,不超过400页
                 executionTime.info("合并PDF");
                 // 添加电签任务列表
                 if (taskType != 10) {
@@ -4424,6 +4443,10 @@ public class TaskController extends BladeController {
         return R.data(fileUrl);
     }
 
+    private void pagePdfUrl(List<ReportResult> reportResults) {
+
+    }
+
     private boolean isWanShengTemplate(Long projectId) {
         String sql = "select id,reference_wbs_template_id_meter from m_project_info where id = "+projectId;
         ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ProjectInfo.class));
@@ -4764,6 +4787,77 @@ public class TaskController extends BladeController {
             }, (v1, v2) -> v1, LinkedHashMap::new));
             String upSql = "update " + REPORT_TYPE[this.type] + " set raw_url=?,file_url_list=? ,calculate_date=SYSDATE() where id=" + this.id;
             jdbcTemplate.update(upSql, this.pdfUrl, JSON.toJSONString(fileListMap));
+            //如果是中间计量,需要对pdfUrl进行分页
+            if(this.type==0){
+                Map<String,String>pageMap=new HashMap<>();
+                List<String> currentBatch = new ArrayList<>();
+                int currentPageCount = 0;
+
+                for (Map.Entry<String, String> entry : fileListMap.entrySet()) {
+
+                    String pdfUrl = entry.getValue();
+                    String result = commonFileClient.getPdfNum(pdfUrl);
+                    Integer pageNum=0;
+                    if(StringUtils.isNotEmpty(result)){
+                        pageNum= Integer.parseInt(result);
+                    }
+                    //单份超过400直接加入
+                    if(pageNum>400){
+                        int sort=pageMap.size()+1;
+                        pageMap.put("第"+sort+"份"+pageNum+"页",pdfUrl);
+                        continue;
+                    }
+                    //加起来超过400了就把已经存在了的合并了
+                    if(currentPageCount+pageNum>400){
+                        if (!currentBatch.isEmpty()) {
+                            Long id = SnowFlakeUtil.getId();
+                            String localPdf = FileUtils.getSysLocalFileUrl() + "/pdf/" + id + ".pdf";
+                            FileUtils.mergePdfPublicMethods(currentBatch,localPdf);
+                            BladeFile bladeFile1 = newIOSSClient.uploadFile( SnowFlakeUtil.get() + ".pdf", localPdf);
+                            int sort=pageMap.size()+1;
+                            pageMap.put("第"+sort+"份"+currentPageCount+"页",bladeFile1.getLink());
+                            currentBatch = new ArrayList<>();
+                            currentPageCount = 0;
+                        }
+
+                    }
+                    // 添加当前PDF到批次
+                    currentBatch.add(pdfUrl);
+                    currentPageCount += pageNum;
+                }
+                // 合并最后一批
+                if (!currentBatch.isEmpty()) {
+                    String pdfUrl=this.pdfUrl;
+                    //如果等于0说明总共没有超过400页,就直接用上面已经合并好了的
+                    if(pageMap.size()!=0){
+                        Long id = SnowFlakeUtil.getId();
+                        String localPdf = FileUtils.getSysLocalFileUrl() + "/pdf/" + id + ".pdf";
+                        FileUtils.mergePdfPublicMethods(currentBatch,localPdf);
+                        BladeFile bladeFile1 = newIOSSClient.uploadFile( SnowFlakeUtil.get() + ".pdf", localPdf);
+                        pdfUrl=bladeFile1.getLink();
+                    }
+                    int sort=pageMap.size()+1;
+                    pageMap.put("第"+sort+"份"+currentPageCount+"页",pdfUrl);
+                }
+                Map<String, String> sortedMap = pageMap.entrySet().stream()
+                    // 提取 "第i份" 中的 i 并转为整数排序
+                    .sorted(Comparator.comparingInt(
+                        entry -> {
+                            String key = entry.getKey();
+                            // 匹配 "第i份" 中的 i
+                            String numStr = key.split("份")[0].replaceAll("[^0-9]", "");
+                            return Integer.parseInt(numStr);
+                        }
+                    ))
+                    // 存入 LinkedHashMap 保持顺序
+                    .collect(Collectors.toMap(
+                        Map.Entry::getKey,
+                        Map.Entry::getValue,
+                        (oldVal, newVal) -> oldVal,
+                        LinkedHashMap::new
+                    ));
+                jdbcTemplate.update("update s_interim_pay_certificate set page_pdf_url=? where id=?", JSON.toJSONString(sortedMap), this.id);
+            }
             return this.pdfUrl;
         }
 

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InterimPayCertificateServiceImpl.java

@@ -237,7 +237,7 @@ public class InterimPayCertificateServiceImpl extends BaseServiceImpl<InterimPay
             if (task == null) {
                 System.out.println("未找到任务相关信息");
             }
-            if (task.getStatus() == 3) {
+            if (task != null && task.getStatus() == 3) {
                 System.out.println("已废除无法查看报表");
             }
 

+ 46 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/FileUtils.java

@@ -1,6 +1,8 @@
 package org.springblade.meter.utils;
 
 import com.aspose.cells.SaveFormat;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
 import org.apache.poi.ss.usermodel.PrintSetup;
@@ -23,6 +25,7 @@ import org.springblade.system.cache.ParamCache;
 
 import java.io.*;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -184,6 +187,49 @@ public class FileUtils {
         }
         return file_path;
     }
+    /**
+     * 合并方法
+     */
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl) {
+        PdfReader reader = null;
+
+        com.itextpdf.text.Document doc = new com.itextpdf.text.Document();
+        PdfCopy pdfCopy = null;
+        try {
+            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
+            int pageCount;
+            doc.open();
+
+            for (String urlStr : urlList) {
+                try {
+                    //获取OSS文件输入流
+                    reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
+
+                    pageCount = reader.getNumberOfPages();
+
+                    for (int i = 0; i < pageCount; ++i) {
+                        int is = i + 1;
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, is));
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    if (reader != null) {
+                        reader.close();
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (pdfCopy != null) {
+                pdfCopy.flush();
+                pdfCopy.close();
+            }
+            doc.close();
+        }
+    }
 
 
 }