소스 검색

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

# Conflicts:
#	blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
lvy 1 일 전
부모
커밋
ec8ccead71
15개의 변경된 파일329개의 추가작업 그리고 45개의 파일을 삭제
  1. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java
  2. 3 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  3. 20 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  4. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  5. 26 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  6. 128 27
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  7. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  8. 4 0
      blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/StaticObjectMethodNode.java
  9. 18 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  10. 40 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  11. 17 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  12. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  13. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  14. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  15. 34 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -66,7 +66,7 @@ public class FormData {
      */
     private Integer sort = 0;
     /**
-     * 内容:同一个groupId下List<每一页内容>
+     * 内容:同一个groupId下List<每一页内容> key 坐标
      * 用于输出
      */
     private List<ElementData> values=new ArrayList<>();

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

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

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

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

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

@@ -57,7 +57,7 @@ public interface ITaskService extends BaseService<Task> {
     /**
      * 批量审批
      */
-    void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) throws FileNotFoundException;
+    Boolean batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) throws FileNotFoundException;
 
     /**
      * 启动流程

+ 26 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -82,6 +82,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
     private final ContractClient contractClient;
 
     private final JdbcTemplate jdbcTemplate;
+    private final IOperationLogService operationLogService;
 
     @Autowired
     StringRedisTemplate RedisTemplate;
@@ -1134,8 +1135,33 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         }else{
             return R.fail("type有误,无法处理该业务");
         }
+        List<InformationQuery> list = this.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, strList));
+        recordResignLog("电签检测", ids, list, new HashMap<String, Object>() {{
+            put("ids", ids);
+            put("classify", classify);
+            put("type", type);
+        }}, list.get(0).getProjectId()+"", list.get(0).getContractId()+"");
         return R.success("操作成功");
     }
+    public void recordResignLog(String module, String businessIds, Object data, Object requestData, String projectId, String contractId){
+        try {
+            OperationLog resignLog = new OperationLog();
+            resignLog.setProjectId(StringUtil.isNumeric(projectId) ? Long.parseLong(projectId) : null);
+            resignLog.setContractId(StringUtil.isNumeric(contractId) ? Long.parseLong(contractId) : null);
+            resignLog.setOperationType(33);
+            resignLog.setOperationModule(module);
+            resignLog.setOperationContent(JSON.toJSONString(requestData));
+            resignLog.setSaveData(JSON.toJSONString(data));
+            resignLog.setOperationTime(DateUtil.formatTime(DateUtil.now()));
+            resignLog.setOperationView("");
+            resignLog.setBusinessId(businessIds);
+            resignLog.setCreateUser(AuthUtil.getUserId());
+            resignLog.setOperationAccount(AuthUtil.getNickName());
+            operationLogService.save(resignLog);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     @Override
     public ChekPdfPaceVo getCheckPdfPaceInfo(String contractId, String classify) {
        /* ChekPdfPaceVo da = new ChekPdfPaceVo();

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

@@ -3,6 +3,7 @@ package org.springblade.business.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -621,7 +622,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      * @throws FileNotFoundException
      */
     @Override
-    public void batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) {
+    public Boolean batchCompleteApprovalTask(List<TaskApprovalVO> taskApprovalVOS) {
         Long userId = AuthUtil.getUserId();
         String nickName = AuthUtil.getNickName();
         // 批量审批接口
@@ -669,7 +670,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         e.printStackTrace();
                     }
                 }
-                this.taskBatchService.saveBatch(taskList);
+               return this.taskBatchService.saveBatch(taskList);
             } else if (taskAppr.getFlag().equals("NO")) { //废除
                 Set<String> taskIds = taskApprovalVOS.stream().map(TaskApprovalVO::getTaskId).collect(Collectors.toSet());
                 List<Task> tasks = this.listByIds(taskIds);
@@ -762,8 +763,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     }
                 }
                 wbsTreeContractStatisticsClient.updateInformationQueryStatusByTaskId(String.join(",", taskIds));
+                return true;
             }
         }
+        return false;
     }
 
 
@@ -1245,7 +1248,9 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             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> 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() + ""));
+            List<InformationQuery> list = informationQueryService.list(new LambdaQueryWrapper<InformationQuery>().in(InformationQuery::getId, dataIdList));
+            Map<String, String> queryMap=list.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 {
@@ -2003,6 +2008,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
             //获取每条任务对应的节点信息
             List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            List<InformationQuery> list = informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, dataIdList));
             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() + ""));
 
@@ -2011,22 +2017,45 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     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)
-//                                .set(InformationQuery::getPdfUrl, null)
-                        );
-                    } else {
-                        if (task.getApprovalType() == 3) {
-                            b = contractLogService.update(new LambdaUpdateWrapper<ContractLog>()
-                                    .eq(ContractLog::getId, task.getFormDataId())
-                                    .set(ContractLog::getEVisaPdfUrl, null));
-                            if (!b) {
-                                jdbcTemplate.update("update u_task set is_deleted=1 where id=" + task.getId());
-                                return;
+
+                    //是否恢复pdf
+                    Boolean isRestorePdf = false;
+                    //当前节点的电签pdf
+                    String eVisaPdfUrl = "";
+                    String pdfUrl = "";
+                    if(type == 1){
+                        //当前节点的电签pdf
+                        InformationQuery byId = informationQueryService.getById(task.getFormDataId());
+                        if(byId != null){
+                            eVisaPdfUrl = byId.getEVisaPdfUrl();
+                            pdfUrl = byId.getPdfUrl();
+                        }
+                         b = informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                .eq(InformationQuery::getId, task.getFormDataId())
+                                .set(InformationQuery::getEVisaPdfUrl, null)
+                                .set(InformationQuery::getPdfUrl, null)
+                         );
+                    }else {
+                        if(task.getApprovalType()==3){
+                            //当前节点的电签pdf
+                            ContractLog byId = contractLogService.getById(task.getFormDataId());
+                            if(byId != null){
+                                eVisaPdfUrl = byId.getEVisaPdfUrl();
+                            }
+
+                            b=contractLogService.update(new LambdaUpdateWrapper<ContractLog>()
+                               .eq(ContractLog::getId,task.getFormDataId())
+                               .set(ContractLog::getEVisaPdfUrl,null));
+                           if(!b){
+                               jdbcTemplate.update("update u_task set is_deleted=1 where id="+task.getId());
+                               return;
+                           }
+                        }else {
+                            //当前节点的电签pdf
+                            InformationQuery byId = informationQueryService.getById(task.getFormDataId());
+                            if(byId != null){
+                                eVisaPdfUrl = byId.getEVisaPdfUrl();
                             }
-                        } else {
                             b = informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
                                     .eq(InformationQuery::getId, task.getFormDataId())
                                     .set(InformationQuery::getEVisaPdfUrl, null));
@@ -2047,7 +2076,15 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                             String sql = "select type from u_information_query where id=" + task.getFormDataId();
                             Integer InformationType = jdbcTemplate.queryForObject(sql, new SingleColumnRowMapper<>(Integer.class));
                             if (InformationType == 1) {
-                                result = this.saveNodePdf(typeMap.get(task.getFormDataId()), queryMap.get(task.getFormDataId()), contractId, projectId, header);
+                                try {
+                                    result = this.saveNodePdf(typeMap.get(task.getFormDataId()), queryMap.get(task.getFormDataId()), contractId, projectId, header);
+                                    //恢复pdf
+                                    if(result.getCode()!=200){
+                                        isRestorePdf = true;
+                                    }
+                                } catch (Exception e) {
+                                    isRestorePdf = true;
+                                }
                             } else {
                                 TrialResignDto dto = new TrialResignDto();
                                 dto.setType(1);
@@ -2067,14 +2104,23 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                             String sql = "SELECT * from u_entrust_info where id=(select wbs_id from u_information_query where id=" + task.getFormDataId() + ")";
                             EntrustInfo info = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(EntrustInfo.class));
                             ReSigningEntrustDto dto = new ReSigningEntrustDto(info.getId().toString(), task.getId().toString(), contractId, info.getNodeId(), 2, 1);
-                            result = excelTabClient.saveReEntrustTabData(dto, header);
-                            if (result.getCode() == 200) {
-                                if (result.getData() != null) {
-                                    informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
-                                            .eq(InformationQuery::getId, task.getFormDataId())
-                                            .set(InformationQuery::getPdfUrl, result.getData()));
+                            try {
+                                result=excelTabClient.saveReEntrustTabData(dto,header);
+                                if(result.getCode()==200){
+                                    if(result.getData()!=null){
+                                        informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                                .eq(InformationQuery::getId, task.getFormDataId())
+                                                .set(InformationQuery::getPdfUrl,result.getData()));
+                                    }
+                                }else{
+                                    //恢复pdf
+                                    isRestorePdf = true;
                                 }
+                            } catch (Exception e) {
+                                //恢复pdf
+                                isRestorePdf = true;
                             }
+
                         }
                         long endTime_1 = System.currentTimeMillis();
                         long executionTime_1 = endTime_1 - startTime_1;
@@ -2085,6 +2131,16 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         }
                         result.setData("成功");
                     }
+                    //恢复pdf 并且 恢复电签pdf
+                    if(isRestorePdf){
+                        informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                .eq(InformationQuery::getId, task.getFormDataId())
+                                .set(InformationQuery::getPdfUrl, pdfUrl)
+                                .set(InformationQuery::getEVisaPdfUrl, eVisaPdfUrl));
+                        continue;
+                    }
+
+
                     //重新电签
                     if (result != null && ("成功".equals(result.getData()) || 200 == result.getCode())) {
                         List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
@@ -2106,12 +2162,57 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         }
                         long startTime_2 = System.currentTimeMillis();
                         if (taskApprovalVOS != null && taskApprovalVOS.size() >= 1) {
-                            this.batchCompleteApprovalTask(taskApprovalVOS);
+                            boolean b1 = this.batchCompleteApprovalTask(taskApprovalVOS);
+                            //如果失败 恢复电签
+                            if (!b1) {
+                                if (type == 1) {
+                                    //当前节点的电签pdf
+                                    informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                            .eq(InformationQuery::getId, task.getFormDataId())
+                                            .set(InformationQuery::getEVisaPdfUrl, eVisaPdfUrl)
+                                    );
+                                } else {
+                                    if (task.getApprovalType() == 3) {
+                                        contractLogService.update(new LambdaUpdateWrapper<ContractLog>()
+                                                .eq(ContractLog::getId, task.getFormDataId())
+                                                .set(ContractLog::getEVisaPdfUrl, eVisaPdfUrl));
+                                        if (!b) {
+                                            jdbcTemplate.update("update u_task set is_deleted=1 where id=" + task.getId());
+                                            return;
+                                        }
+                                    } else {
+                                        informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                                .eq(InformationQuery::getId, task.getFormDataId())
+                                                .set(InformationQuery::getEVisaPdfUrl, eVisaPdfUrl));
+                                    }
+                                }
+                            }
                         }
                         long endTime_2 = System.currentTimeMillis();
                         long executionTime_2 = endTime_2 - startTime_2;
                         log.info("batchCompleteApprovalTask执行时间:" + executionTime_2 + " 毫秒");
                     } else {
+                        if (type == 1) {
+                            //当前节点的电签pdf
+                            informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                    .eq(InformationQuery::getId, task.getFormDataId())
+                                    .set(InformationQuery::getEVisaPdfUrl, eVisaPdfUrl)
+                            );
+                        } else {
+                            if (task.getApprovalType() == 3) {
+                                contractLogService.update(new LambdaUpdateWrapper<ContractLog>()
+                                        .eq(ContractLog::getId, task.getFormDataId())
+                                        .set(ContractLog::getEVisaPdfUrl, eVisaPdfUrl));
+                                if (!b) {
+                                    jdbcTemplate.update("update u_task set is_deleted=1 where id=" + task.getId());
+                                    return;
+                                }
+                            } else {
+                                informationQueryService.update(new LambdaUpdateWrapper<InformationQuery>()
+                                        .eq(InformationQuery::getId, task.getFormDataId())
+                                        .set(InformationQuery::getEVisaPdfUrl, eVisaPdfUrl));
+                            }
+                        }
                         //修改重签状态为保存PDF失败
                         this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
                                 .set(TaskParallel::getEVisaContent, "重新保存PDF失败")
@@ -2246,7 +2347,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
         String taskBtech = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)  " +
                 " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,SYSDATE(),1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b where b.`status` in(1,2) and a.`status` in(2)  and   a.process_instance_id=b.process_instance_id " +
-                " and b.form_data_id in( " + ids2 + ") and not exists (SELECT 1 from u_task_batch c where c.json_data like CONCAT('%',a.parallel_process_instance_id ,'%'))";
+                " and b.form_data_id in( " + ids2 + ") and a.parallel_process_instance_id not in(SELECT JSON_EXTRACT(c.json_data, '$.parallelProcessInstanceId') from u_task_batch c)";
 
         if(userIds!=null && userIds.length()>=1){
             taskBtech += " and b.task_user in("+userIds+")";

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

@@ -2293,6 +2293,12 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (!b) {
                 throw new ServiceException("报告编号已存在");
             }
+            WbsTreePrivate nodeByPrimaryKeyId = wbsTreePrivateClient.getNodeByPrimaryKeyId(String.valueOf(dto.getNodeId()));
+            //初始化 table_ids
+            List<Long> tableIds = wbsTreePrivateClient.testFormInit(dto.getProjectId(),dto.getContractId(),nodeByPrimaryKeyId.getWbsId(),nodeByPrimaryKeyId.getId());
+            if(CollectionUtil.isNotEmpty(tableIds)){
+                record.setTableIds(StringUtil.join(tableIds, ","));
+            }
             this.save(record);
         } else {
             this.updateById(record);

+ 4 - 0
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/StaticObjectMethodNode.java

@@ -54,6 +54,10 @@ public class StaticObjectMethodNode implements MethodNode {
                 if (method == null) {
                     nextmethod:
                     for (Method each : beanType.getMethods()) {
+                        System.out.println("---"+each.getName()+"===="+Modifier.isStatic(each.getModifiers())+"--"+(each.getParameterTypes().length == args.length) );
+                       if(each.getName().equals("maxtembydate")){
+                           System.out.println();
+                       }
                         if (Modifier.isStatic(each.getModifiers()) && each.getName().equals(methodName)
                                 && each.getParameterTypes().length == args.length) {
                             Class<?>[] parameterTypes = each.getParameterTypes();

+ 18 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -469,7 +469,7 @@ public class CustomFunction {
             return result;
     }
 
-
+    // 获取天气
     public static Object weather( Object dateObj,Map<String,Object> map){
            if(dateObj!=null&&map!=null){
                List<Object> date=obj2ListObj(dateObj);
@@ -478,6 +478,23 @@ public class CustomFunction {
            return "";
     }
 
+    // 获取最大温度
+    public static Object maxtembydate( Object dateObj,Map<String,Object> map){
+        if(dateObj!=null&&map!=null){
+            List<Object> date=obj2ListObj(dateObj);
+            return  date.stream().map(StringUtils::handleNull).filter(StringUtils::isNotEmpty).map(e->map.get(new DateTime(FormulaUtils.range2end(e)).toString(DatePattern.NORM_DATE_PATTERN))).collect(Collectors.toList());
+        }
+        return "";
+    }
+
+    // 获取最小温度
+    public static Object mintembydate( Object dateObj,Map<String,Object> map){
+        if(dateObj!=null&&map!=null){
+            List<Object> date=obj2ListObj(dateObj);
+            return  date.stream().map(StringUtils::handleNull).filter(StringUtils::isNotEmpty).map(e->map.get(new DateTime(FormulaUtils.range2end(e)).toString(DatePattern.NORM_DATE_PATTERN))).collect(Collectors.toList());
+        }
+        return "";
+    }
 
 
 

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

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

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

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

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

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

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

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

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

@@ -643,6 +643,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
     }
 
+    //计算key和坐标之间的关系数据
     private List<NodeTable> createNodeTables(Long nodeId, String contractId, String projectId, ExecuteType type ,String tableOwner, String recordId) {
         List<NodeTable> tableAll = new ArrayList<>();
         if (type.equals(ExecuteType.INSPECTION)) {
@@ -674,7 +675,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         List<Long> pkeyIds = keyMappers.stream().map(KeyMapper::getPkId).distinct().collect(Collectors.toList());
         Map<String, Map<String, String>> coordinateMap = new HashMap<>(pkeyIds.size() * 2);
         if (pkeyIds.size() > 0) {
-            if (ExecuteType.TESTING.equals(type)) {
+            if (ExecuteType.TESTING.equals(type) || ExecuteType.LOGINFO.equals(type)) {
                 List<WbsTreePrivate> list = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda().in(WbsTreePrivate::getPKeyId, pkeyIds));
                 if (list.size() > 0) {
                     list.forEach(e -> coordinateMap.computeIfAbsent(e.getInitTableName(), k -> FormulaUtils.getElementCell(e.getHtmlUrl())));

+ 34 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1218,7 +1218,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         tec.formDataMap.putAll(baseMap);*/
         /*通用计算*/
         generalCalc(tec);
-        if (ExecuteType.INSPECTION.equals(tec.getExecuteType())|| ExecuteType.LOGINFO.equals(tec.getExecuteType()) ) {
+        if (ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
             if (tec.isNew) {
                 //TODO
             } else {
@@ -1237,8 +1237,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         try {
             List<String> dateList = new ArrayList<>();
             tec.formDataList.forEach(e -> {
-                if (e.executable() && e.getFormula().getFormula().contains(".weather(")) {
-                    String code = RegexUtil.findResult("(?<=weather\\(E\\[')[^']+(?='\\],WEATHER\\))", e.getFormula().getFormula());
+                if (e.executable() && (e.getFormula().getFormula().contains(".weather(") || e.getFormula().getFormula().contains(".maxtembydate("))) {
+                    String code = RegexUtil.findResult("(?<=\\(E\\[')[^']+(?='\\],WEATHER\\))", e.getFormula().getFormula());
                     if (code != null) {
                         FormData formData = tec.getFormDataMap().get(code);
                         if (formData != null && !formData.empty()) {
@@ -1249,12 +1249,38 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
             });
             if (dateList.size() > 0) {
-                List<Map<String, Object>> listMap = this.jdbcTemplate.queryForList(" select DATE(b.record_time) ds,b.weather from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id=" + tec.getContractId() + " and DATE(b.record_time) in('" + dateList.stream().distinct().collect(Collectors.joining("','")) + "')");
+                List<Map<String, Object>> listMap = this.jdbcTemplate.queryForList(" select DATE(b.record_time) ds,b.weather,temp_high as maxtembydate,temp_low as mintembydate from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id=" + tec.getContractId() + " and DATE(b.record_time) in('" + dateList.stream().distinct().collect(Collectors.joining("','")) + "')");
+                // 天气
                 Map<String, String> map = new HashMap<>();
+                //星期几
+                Map<String, String> map4 = new HashMap<>();
                 listMap.forEach(m -> {
-                    map.put(Func.toStr(m.get("ds")), Func.toStr(m.get("weather")));
+                    String ds = Func.toStr(m.get("ds"));
+                    map.put(ds, Func.toStr(m.get("weather")));
+                    //将时间转化星期几
+
+
+
                 });
                 tec.constantMap.put("WEATHER", map);
+
+                // 最高气温
+                Map<String, String> map2 = new HashMap<>();
+                listMap.forEach(m -> {
+                    map2.put(Func.toStr(m.get("ds")), Func.toStr(m.get("maxtembydate")));
+                });
+                tec.constantMap.put("MAXTEMBYDATE", map2);
+
+                // 最低气温
+                Map<String, String> map3 = new HashMap<>();
+                listMap.forEach(m -> {
+                    map3.put(Func.toStr(m.get("ds")), Func.toStr(m.get("mintembydate")));
+                });
+                tec.constantMap.put("MINTEMBYDATE", map3);
+
+                //星期几
+                tec.constantMap.put("MINTEMBYDATE", map4 );
+
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -1271,7 +1297,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             checkTable = op.get().getInitTableName();
         }
         for (FormData fd : tec.formDataList) {
-            if(fd.getCode().equals("m_20230423154304_1650042591250481152:key_42")){
+            if(fd.getCode().equals("_20240528110420_1795289980302524416:key_8")){
                 System.out.println("111");
             }
             if (fd.verify()) {
@@ -1315,6 +1341,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                 }
                             } else {
                                 putEle(f, ele, currentMap, fd);
+                               //公式获取值
                                 Object data = Expression.parse(formula.getFormula()).calculate(currentMap);
                                 //如果有空串,也要加进data不然表格数据顺序会混乱
                                 try {
@@ -1389,7 +1416,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                         }
                                     }
                                 }
-
+                                // 公式获取的数据 准备写入 准装 字段和值的关系
                                 write(tec, fd, data);
                             }
                             /*错位计算偏移量重置*/