Ver Fonte

Merge branch 'master' of http://121.41.40.202:3000/zhuwei/bladex

huangtf há 1 ano atrás
pai
commit
1eba72c537
15 ficheiros alterados com 366 adições e 37 exclusões
  1. 14 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/SendsWebSocketArchiveDTO.java
  2. 6 0
      blade-service-api/blade-business-api/pom.xml
  3. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  4. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java
  5. 31 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  6. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveInspectionInfoController.java
  7. 1 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveInspectionServiceImpl.java
  8. 32 12
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  9. 49 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  10. 43 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  11. 31 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  12. 123 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  13. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  14. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  15. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

+ 14 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/SendsWebSocketArchiveDTO.java

@@ -0,0 +1,14 @@
+package org.springblade.archive.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+public class SendsWebSocketArchiveDTO implements Serializable {
+    private Integer pageTotal;
+    private Integer type;
+    private ArchiveTaskDTO dto;
+}

+ 6 - 0
blade-service-api/blade-business-api/pom.xml

@@ -17,6 +17,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-archive-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <packaging>jar</packaging>
 

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -5,6 +5,7 @@ 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.metadata.IPage;
+import org.springblade.archive.dto.SendsWebSocketArchiveDTO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.common.constant.BusinessConstant;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -137,4 +139,8 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/updateById2")
     void updateById2(@RequestBody ArchiveFile archiveFile);
+
+    @PostMapping(API_PREFIX + "/sendWebSocketArchiveMsg")
+    void sendWebSocketArchiveMsg(@RequestBody SendsWebSocketArchiveDTO webSocketArchiveDTO) throws IOException;
+
 }

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

@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
@@ -39,6 +40,10 @@ public interface WbsTreePrivateClient {
     @PostMapping(API_PREFIX + "/queryPeersNodeByProjectIdAndId")
     WbsTreePrivate queryPeersNodeByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
 
+    //根据合同下所有表单id获取项目级节点
+    @PostMapping(API_PREFIX + "/getAllPrivateTableByIds")
+    Set<Long> getAllPrivateTableByIds(@RequestParam Long projectId,@RequestBody List<Long> ids);
+
     @PostMapping(API_PREFIX + "/queryWbsTreePrivateByProjectIdAndId")
     List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam Long id);
 

+ 31 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -12,6 +12,7 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springblade.archive.dto.ArchiveTaskDTO;
+import org.springblade.archive.dto.SendsWebSocketArchiveDTO;
 import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.Task;
@@ -32,6 +33,7 @@ import org.springblade.manager.feign.SignPfxClient;
 import org.springblade.system.user.entity.User;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.*;
@@ -48,6 +50,7 @@ public class ArchiveFileTaskController extends BladeController {
     private final JdbcTemplate jdbcTemplate;
     private final SignPfxClient signPfxClient;
     private final EVisaClient eVisaClient;
+    private final ArchiveFileClient archiveFileClient;
 
     /**
      * 批量认证(水印图片签章默认认证电签)
@@ -151,7 +154,10 @@ public class ArchiveFileTaskController extends BladeController {
     @PostMapping("/page")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "档案-任务管理-任务查看分页查询", notes = "传入ArchiveTaskDTO")
-    public R<IPage<ArchiveTaskPageVO>> page(@RequestBody ArchiveTaskDTO dto) {
+    public R<IPage<ArchiveTaskPageVO>> page(@RequestBody ArchiveTaskDTO dto) throws IOException {
+        if (ObjectUtil.isEmpty(dto.getCurrentContractId())) {
+            throw new ServiceException("未获取到当前用户所在的合同段信息,请联系管理员");
+        }
         int current = dto.getCurrent();
         int size = dto.getSize();
         //封装入参SQL
@@ -178,7 +184,7 @@ public class ArchiveFileTaskController extends BladeController {
                     sqlString.append(" AND project_id = ?");
                     params.add(dto.getProjectIdValue());
                 } else {
-                    throw new ServiceException("未获取到项目信息,请联系管理员");
+                    throw new ServiceException("未获取到当前用户所在的项目信息,请联系管理员");
                 }
             }
         } else if (contractInfo != null && (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3))) {
@@ -304,7 +310,29 @@ public class ArchiveFileTaskController extends BladeController {
                 .collect(Collectors.toList());
         page.setRecords(pageList);
         page.setTotal(totalCount);
-        return R.data(page);
+
+        R<IPage<ArchiveTaskPageVO>> iPageR = R.data(page);
+
+        //待办推送 TODO 档案暂时不推送,推送时放开
+        /*if (dto.getSelectedType().equals(1)) {
+            if (ObjectUtil.isNotEmpty(iPageR.getData()) && ObjectUtil.isNotEmpty(iPageR.getData().getRecords()) && ObjectUtil.isNotEmpty(dto.getContractIdValue()) && ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                this.sendWebSocketArchiveMsg(new SendsWebSocketArchiveDTO(totalCount, 1, dto));
+            } else if (ObjectUtil.isNotEmpty(dto.getContractIdValue()) && ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                this.sendWebSocketArchiveMsg(new SendsWebSocketArchiveDTO(0, 2, dto));
+            }
+        }*/
+
+        return iPageR;
+    }
+
+    /**
+     * 推送消息
+     *
+     * @throws IOException
+     */
+    @Async
+    public void sendWebSocketArchiveMsg(SendsWebSocketArchiveDTO webSocketArchiveDTO) throws IOException {
+        archiveFileClient.sendWebSocketArchiveMsg(webSocketArchiveDTO);
     }
 
 }

+ 6 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveInspectionInfoController.java

@@ -5,6 +5,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.dto.ArchiveInspectionDTO;
 import org.springblade.archive.entity.ArchiveInspection;
 import org.springblade.archive.entity.ArchivesAuto;
@@ -14,6 +15,7 @@ import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.api.ResultCode;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
@@ -69,6 +71,10 @@ public class ArchiveInspectionInfoController {
     @ApiOperation(value = "修改档案检查", notes = "传入archiveInspection")
     public R submit(@RequestBody ArchiveInspection archiveInspection) {
 
+        if (StringUtils.isBlank(archiveInspection.getOpinion())){
+            return R.success(ResultCode.SUCCESS);
+        }
+
         if (archiveInspection.getId() == null) {
             return this.addArchiveInspection(archiveInspection);
         }

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

@@ -85,6 +85,7 @@ public class ArchiveInspectionServiceImpl extends BaseServiceImpl<ArchiveInspect
             map1.put("allOpinion",allOpinion);
             map1.put("ArchiveName",inspections.get(0).getArchiveName());
             map.put(key,map1);
+            allOpinion = "";
         }
         return map;
     }

+ 32 - 12
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -165,14 +165,24 @@ public class EVisaTaskCheckController {
                 WbsTreeContract contract = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(nodeId));
                 //获取节点下每个填报表
                 List<WbsTreeContract> node = wbsTreeContractClient.queryChildByParentId(contract, "", "");
-                List<Long> ids = new ArrayList<>();
+                Set<Long> ids = new HashSet<>();
                 //获取每个填报表对应的wbs_tree_private的id
-                for (WbsTreeContract treeContract : node) {
-                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
-                    ids.add(wbsTreePrivate.getPKeyId());
-//                    if (StringUtils.isNotBlank(treeContract.getIsTypePrivatePid()+"")){
-//                        ids.add(treeContract.getIsTypePrivatePid());
-//                    }
+//                for (WbsTreeContract treeContract : node) {
+//                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
+//                    ids.add(wbsTreePrivate.getPKeyId());
+////                    if (StringUtils.isNotBlank(treeContract.getIsTypePrivatePid()+"")){
+////                        ids.add(treeContract.getIsTypePrivatePid());
+////                    }
+//                }
+                if (node != null && node.size() > 0){
+                    List<Long> setIds = node.stream().map(l -> l.getId()).collect(Collectors.toList());
+                    Set<Long> setPIds = node.stream().map(l -> l.getIsTypePrivatePid()).collect(Collectors.toSet());
+                    ids.addAll(setPIds);
+                    Set<Long> tableIds = wbsTreePrivateClient.getAllPrivateTableByIds(Long.parseLong(contract.getProjectId()), setIds);
+                    if (tableIds != null && tableIds.size() > 0) {
+                        ids.addAll(tableIds);
+                    }
+                    ids.addAll(tableIds);
                 }
                 JSONObject object = new JSONObject();
                 object.put("privatePKeyId", ids);
@@ -328,11 +338,20 @@ public class EVisaTaskCheckController {
             WbsTreeContract contract = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(nodeId));
             //获取节点下每个填报表
             List<WbsTreeContract> node = wbsTreeContractClient.queryChildByParentId(contract, "", "");
-            List<Long> ids = new ArrayList<>();
+            Set<Long> ids = new HashSet<>();
             //获取每个填报表对应的wbs_tree_private的id
-            for (WbsTreeContract treeContract : node) {
-                WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
-                ids.add(wbsTreePrivate.getPKeyId());
+//            for (WbsTreeContract treeContract : node) {
+//                WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
+//                ids.add(wbsTreePrivate.getPKeyId());
+//            }
+            if (node != null && node.size() > 0){
+                List<Long> setIds = node.stream().map(l -> l.getId()).collect(Collectors.toList());
+                Set<Long> setPIds = node.stream().map(l -> l.getIsTypePrivatePid()).collect(Collectors.toSet());
+                ids.addAll(setPIds);
+                Set<Long> tableIds = wbsTreePrivateClient.getAllPrivateTableByIds(Long.parseLong(contract.getProjectId()), setIds);
+                if (tableIds != null && tableIds.size() > 0) {
+                    ids.addAll(tableIds);
+                }
             }
             JSONObject object = new JSONObject();
             object.put("privatePKeyId", ids);
@@ -567,7 +586,8 @@ public class EVisaTaskCheckController {
             List<String> ids = json.getJSONArray("privatePKeyId").toJavaList(String.class);
             //指向项目级的ID有可能为null
             ids = ids.stream().filter(Objects::nonNull).collect(Collectors.toList());
-            String sql = "select * from m_textdict_info where tab_id in(" + StringUtils.join(ids, ",") + ")";
+
+            String sql = "select * from m_textdict_info where tab_id in(" + StringUtils.join(ids, ",") + ") or excel_id in (SELECT excel_id from m_wbs_tree_private where p_key_id in(" + StringUtils.join(ids, ",") + "))";
             List<TextdictInfo> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
             jsonList = JSONArray.parseArray(JSONObject.toJSONString(query), JSONObject.class);
         }

+ 49 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1073,7 +1073,10 @@ public class TaskController extends BladeController {
     @PostMapping("/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "资料填报-任务管理-任务查看分页查询", notes = "传入BusinessTaskDTO")
-    public R<IPage<BusinessTaskPageVO>> page(@RequestBody BusinessTaskDTO dto) {
+    public R<IPage<BusinessTaskPageVO>> page(@RequestBody BusinessTaskDTO dto) throws IOException {
+        if (ObjectUtil.isEmpty(dto.getCurrentContractId())) {
+            throw new ServiceException("未获取到当前用户所在的合同段信息,请联系管理员");
+        }
         int current = dto.getCurrent();
         int size = dto.getSize();
         //封装入参SQL
@@ -1100,7 +1103,7 @@ public class TaskController extends BladeController {
                     sqlString.append(" AND project_id = ?");
                     params.add(dto.getProjectIdValue());
                 } else {
-                    throw new ServiceException("未获取到项目信息,请联系管理员");
+                    throw new ServiceException("未获取到当前用户所在的项目信息,请联系管理员");
                 }
             }
         } else if (contractInfo != null && (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3))) {
@@ -1229,7 +1232,50 @@ public class TaskController extends BladeController {
                 .collect(Collectors.toList());
         page.setRecords(pageList);
         page.setTotal(totalCount);
-        return R.data(page);
+
+        R<IPage<BusinessTaskPageVO>> iPageR = R.data(page);
+
+        //待办推送
+        if (dto.getSelectedType().equals(1)) {
+            if (ObjectUtil.isNotEmpty(iPageR.getData()) && ObjectUtil.isNotEmpty(iPageR.getData().getRecords()) && ObjectUtil.isNotEmpty(dto.getContractIdValue()) && ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                this.sendsWebSocketCount(iPageR, 1, dto);
+            } else if (ObjectUtil.isNotEmpty(dto.getContractIdValue()) && ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                this.sendsWebSocketCount(null, 2, dto);
+            }
+        }
+
+        return iPageR;
+    }
+
+    /**
+     * 推送消息
+     *
+     * @param iPageR
+     * @param type
+     * @param dto
+     * @throws IOException
+     */
+    @Async
+    public void sendsWebSocketCount(R<IPage<BusinessTaskPageVO>> iPageR, int type, BusinessTaskDTO dto) throws IOException {
+        if (ObjectUtil.isEmpty(dto.getCurrentContractId())) {
+            //如果getCurrentContractId=null,那么表示是APP的待办查询(web端不为null)
+            dto.setCurrentContractId(dto.getContractIdValue());
+        }
+        if (type == 1) {
+            Map<String, String> stringMap = iTaskService.getTaskCount(dto.getProjectIdValue().toString(), dto.getCurrentContractId().toString(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", String.valueOf(iPageR.getData().getTotal()));
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        } else if (type == 2) {
+            Map<String, String> stringMap = iTaskService.getTaskCount(dto.getProjectIdValue().toString(), dto.getCurrentContractId().toString(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", "0");
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        }
     }
 
 

+ 43 - 1
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -1,29 +1,43 @@
 package org.springblade.business.feignClient;
 
+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.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.dto.ArchiveTaskDTO;
+import org.springblade.archive.dto.SendsWebSocketArchiveDTO;
 import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.mapper.ArchiveFileMapper;
 import org.springblade.business.service.IArchiveFileService;
 import org.springblade.business.service.ITaskService;
+import org.springblade.business.socket.WebSocket;
 import org.springblade.business.vo.ArchiveFileVO;
+import org.springblade.business.vo.TaskQueryVO;
+import org.springblade.business.vo.TaskVO;
 import org.springblade.common.utils.FileUtils;
 import org.springblade.common.vo.FileSize;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.feign.ContractClient;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.IOException;
 import java.util.*;
 
 
@@ -35,10 +49,12 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
 
     private final ArchiveFileMapper fileMapper;
 
-    private ContractClient contractClient;
+    private final ContractClient contractClient;
 
     private final ITaskService iTaskService;
 
+    private final WebSocket webSocket;
+
 
     @Override
     public void saveArchiveFile(ArchiveFileVO vo) {
@@ -320,4 +336,30 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         iArchiveFileService.updateById(archiveFile);
     }
 
+    @Override
+    public void sendWebSocketArchiveMsg(SendsWebSocketArchiveDTO webSocketArchiveDTO) throws IOException {
+        Integer pageTotal = webSocketArchiveDTO.getPageTotal();
+        Integer type = webSocketArchiveDTO.getType();
+        ArchiveTaskDTO dto = webSocketArchiveDTO.getDto();
+        if (ObjectUtil.isEmpty(dto.getCurrentContractId())) {
+            //如果getCurrentContractId=null,那么表示是APP的待办查询(web端不为null)
+            dto.setCurrentContractId(dto.getContractIdValue());
+        }
+        if (type == 1) {
+            Map<String, String> stringMap = iTaskService.getTaskCountArchive(dto.getProjectIdValue().toString(), dto.getCurrentContractId().toString(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", String.valueOf(pageTotal));
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        } else if (type == 2) {
+            Map<String, String> stringMap = iTaskService.getTaskCountArchive(dto.getProjectIdValue().toString(), dto.getCurrentContractId().toString(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", "0");
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        }
+    }
+
 }

+ 31 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -2102,6 +2102,9 @@ public class ExcelTabController extends BladeController {
     }
 
 
+
+
+
     @PostMapping("/save_buss_data")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
@@ -3764,4 +3767,32 @@ public class ExcelTabController extends BladeController {
         return R.fail("操作失败");
     }
 
+
+    @PostMapping("/save_sigInfo12313213")
+    @ApiOperationSupport(order = 72)
+    @ApiOperation(value = "pdf", notes = "pdf")
+    public void synPDFInfo() throws Exception {
+        String sqlInfo = "SELECT DISTINCT wbs_id,classify,contract_id,project_id,type from u_information_query where contract_id='1681864110494851073' and is_deleted=0 and type=1 ";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlInfo);
+        System.out.println(maps.size());
+        int i=0;
+        if(maps!=null && maps.size()>=2){
+            for(Map<String, Object> dataMap:maps){
+                String nodeId = dataMap.get("wbs_id")+"";
+                String classify = dataMap.get("classify")+"";
+                String contractId = dataMap.get("contract_id")+"";
+                String projectId = dataMap.get("project_id")+"";
+                List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId, "1", contractId, projectId);
+                if(tableAll!=null && tableAll.size()>=1){
+                    for(AppWbsTreeContractVO tab:tableAll){
+                        excelTabService.getBussPdfInfo(Long.parseLong(tab.getPKeyId()+""));
+                    }
+                }
+                i=i+1;
+                System.out.println("完成1---="+i);
+                excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
+            }
+        }
+    }
+
 }

+ 123 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -55,6 +55,7 @@ import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -418,7 +419,7 @@ public class TextdictInfoController extends BladeController {
                     int rowspan = element.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(element.attr("ROWSPAN"));
                     element.empty().append("<el-input  :rows=" + rowspan * 2 + "  id=" + keyname + "  @mouseup.left=" + leftCli + "  @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  type='textarea' placeholder=" + placeholder + " v-model=" + vmode + "    keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'  > </el-input>");
                 } else if (textdictInfo.getTextId().equals("select")) { // 下拉框
-                    String selectText = " <el-select id=" + keyname + " v-model=" + vmode + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm +")'  keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
+                    String selectText = " <el-select id=" + keyname + " v-model=" + vmode + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm + ")'  keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
                     List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
                     if (optionList != null && optionList.size() >= 1) {
                         for (int i = 0; i < optionList.size(); i++)
@@ -454,28 +455,28 @@ public class TextdictInfoController extends BladeController {
                     List<DateFormat> dateFormat = textdictInfo.getDateFormat();
                     String dataf = "YYYY年MM月DD日";
                     String dateType = "date";
-                    if(dateFormat!=null && dateFormat.size()>=1){
+                    if (dateFormat != null && dateFormat.size() >= 1) {
                         Map<String, String> dateForm = ExcelInfoUtils.getDateFormat(dateFormat);
                         dataf = dateForm.get("format");
                         dateType = dateForm.get("type");
                     }
-                    if(dateType.equals("datetime")){
-                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='"+dateType+"' format='"+dataf+"' value-format='"+dataf+"' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
-                    }else if(dateType.equals("date")){
-                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='"+dateType+"' format='"+dataf+"' value-format='"+dataf+"' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+                    if (dateType.equals("datetime")) {
+                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='" + dateType + "' format='" + dataf + "' value-format='" + dataf + "' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+                    } else if (dateType.equals("date")) {
+                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='" + dateType + "' format='" + dataf + "' value-format='" + dataf + "' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
                     } else if (dateType.equals("time")) {
-                        element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + "  format='"+dataf+"' value-format='"+dataf+"' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+                        element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + "  format='" + dataf + "' value-format='" + dataf + "' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
                     }
-                }else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
+                } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
                     List<DateFormat> dateFormat = textdictInfo.getDateFormat();
                     String dataf = "YYYY年MM月DD日";
                     String sp3 = "至";
-                    if(dateFormat!=null && dateFormat.size()>=1){
+                    if (dateFormat != null && dateFormat.size() >= 1) {
                         Map<String, String> dateForm = ExcelInfoUtils.getDateFormat(dateFormat);
                         dataf = dateForm.get("format");
                         sp3 = dateForm.get("sp3");
                     }
-                    element.empty().append("<el-date-picker @keyDowns='dateKeydown()' range-separator='"+sp3+"' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='"+dataf+"' trIndex=" + trindex + "  @mouseup.right='RightClick(" + parm + ")' keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+                    element.empty().append("<el-date-picker @keyDowns='dateKeydown()' range-separator='" + sp3 + "' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='" + dataf + "' trIndex=" + trindex + "  @mouseup.right='RightClick(" + parm + ")' keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
                     element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
 
                 } else if (textdictInfo.getTextId().equals("img")) { //图片
@@ -557,8 +558,14 @@ public class TextdictInfoController extends BladeController {
             return R.success("操作成功");
         }
 
+        List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
+        List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+        String ids = StringUtils.join(pKeyIds, ",");
+
         //删除历史数据
-        String delSql = "delete from m_textdict_info where tab_id in(SELECT p_key_id from m_wbs_tree_contract where p_key_id!='"+tableId+"' and  project_id="+wbsTreePrivate.getProjectId()+" and excel_id="+wbsTreePrivate.getExcelId()+") and type in(2,6) and excel_id is null";
+        String delSql = "delete from m_textdict_info where tab_id in("+ids+") and type in(2,6) and excel_id is null";
         jdbcTemplate.execute(delSql);
 
         // ------- 查询数据库是否存在 该该电签信息 ---------
@@ -570,9 +577,9 @@ public class TextdictInfoController extends BladeController {
             Element element = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
 
             String id = element.children().get(0).attr("keyname");
-            if(jsonObject.containsKey("id")){
+            if (jsonObject.containsKey("id")) {
                 textdictInfo.setId(jsonObject.getLong("id"));
-            }else{
+            } else {
                 textdictInfo.setId(SnowFlakeUtil.getId());
                 textdictInfo.setIsDeleted(0);
             }
@@ -582,7 +589,7 @@ public class TextdictInfoController extends BladeController {
             textdictInfo.setSigRoleId(jsonObject.getString("sigRoleId"));
 
             textdictInfo.setTabId(tableId.toString());
-            textdictInfo.setExcelId(wbsTreePrivate.getExcelId()+"");
+            textdictInfo.setExcelId(wbsTreePrivate.getExcelId() + "");
 
             textdictInfo.setColName(jsonObject.getString("colName"));
             textdictInfo.setSigRoleName(jsonObject.getString("sigRoleName"));
@@ -607,12 +614,10 @@ public class TextdictInfoController extends BladeController {
         String replace = str1.replace("\\", "\\\\");
 
         //修改同几点的数据
-        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (SELECT p_key_id from m_wbs_tree_contract where project_id="+wbsTreePrivate.getProjectId()+" and excel_id="+wbsTreePrivate.getExcelId()+")";
+        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in ("+ids+")";
         jdbcTemplate.execute(updateSqlP);
 
-        List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
+
 
         //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
         List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
@@ -634,6 +639,7 @@ public class TextdictInfoController extends BladeController {
         return R.success("操作成功");
     }
 
+
     /**
      * 保存默认值
      */
@@ -761,4 +767,103 @@ public class TextdictInfoController extends BladeController {
         return R.success("操作成功");
     }
 
+
+    @PostMapping("/save_sigInfo12313213")
+    @ApiOperationSupport(order = 72)
+    @ApiOperation(value = "保存电签", notes = "保存电签")
+    public void synDqidInfo() {
+        String qerysql = "select * from test_data_info where state =1 ";
+        List<Map<String, Object>> maps1 = jdbcTemplate.queryForList(qerysql);
+        if (maps1 != null && maps1.size() >= 0) {
+            for (Map<String, Object> dataInfo : maps1) {
+
+                String excel_id = dataInfo.get("excel_id") + "";
+                String p_key_id = dataInfo.get("p_key_id") + "";
+                try {
+                    String sql = "select * from m_textdict_info where excel_id=" + excel_id + " and type in(2,6)";
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(Long.parseLong(p_key_id));
+                    InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
+                    String htmlString = IoUtil.readToString(inputStreamByUrl);
+                    // 样式集合
+                    Document doc = Jsoup.parse(htmlString);
+                    //解析
+                    Element table = doc.select("table").first();
+                    Elements trs = table.select("tr");
+                    //解析
+                    Elements onlyInfo = doc.select("[:readonly]");
+                    if (onlyInfo != null && onlyInfo.size() >= 1) {
+                        for (Element element : onlyInfo) {
+                            element.removeAttr(":readonly");
+                        }
+                    }
+                    Elements tryInfo = doc.select("td[dqid]");
+                    if (tryInfo != null && tryInfo.size() >= 1) {
+                        for (Element element : tryInfo) {
+                            element.removeAttr("dqid");
+                        }
+                    }
+
+                    List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+
+                    for (int i = 0; i < maps.size(); i++) {
+                        Map<String, Object> data = maps.get(i);
+                        String cole = data.get("col_key") + "";
+                        String[] trtd = cole.split("__")[1].split("_");
+                        Element element = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
+                        element.removeAttr("dqId");
+                        element.attr("dqId", data.get("id") + "");
+                        if ((data.get("type") + "").equals("2")) { //个人签字 不能用户输入
+                            if (element.html().indexOf("el-tooltip") >= 0) {
+                                element.children().get(0).children().get(0).attr(":readonly", "true");
+                            } else {
+                                element.children().get(0).attr(":readonly", "true");
+                            }
+                        }
+                    }
+                    String dataURL = wbsTreePrivate.getHtmlUrl().replace("/www/wwwroot", "");
+
+                    File writeFile = new File(dataURL);
+                    FileUtil.writeToFile(writeFile, doc.html(), Boolean.parseBoolean("UTF-8"));
+
+                    String str1 = wbsTreePrivate.getHtmlUrl().replace("Desktop//privateUrl", "Desktop/privateUrl");
+                    String replace = str1.replace("\\", "\\\\");
+
+                    List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
+
+                    List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                    String ids = StringUtils.join(pKeyIds, ",");
+                    //修改同几点的数据
+                    String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
+                    jdbcTemplate.execute(updateSqlP);
+
+
+                    //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
+                    List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
+
+                    List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
+                            .in(WbsTreeContract::getId, cIdsList)).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+                    String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
+
+                    if (StringUtils.isNotEmpty(cPkeyIdsStr)) {
+                        String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
+                        jdbcTemplate.execute(updateSqlC);
+                    }
+                    String updatesql = "update test_data_info set  state=2  where p_key_id=" + p_key_id + " and excel_id=" + excel_id + " ";
+                    jdbcTemplate.execute(updatesql);
+                    System.out.println("--------完成-------=" + p_key_id);
+                } catch (Exception e) {
+                    String updatesql = "update test_data_info set  state=3  where p_key_id=" + p_key_id + " and excel_id=" + excel_id + " ";
+                    jdbcTemplate.execute(updatesql);
+                    e.printStackTrace();
+                }finally {
+                    System.out.println("1231231");
+                }
+            }
+        }
+    }
+
 }

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -13,6 +13,7 @@ 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.*;
+import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.impl.ExcelTabServiceImpl;
 import org.springblade.manager.service.impl.TextdictInfoServiceImpl;
@@ -37,6 +38,7 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     private final ExcelTabServiceImpl excelTabServiceImpl;
     private final TextdictInfoServiceImpl textDictInfoService;
     private final WbsTreeContractServiceImpl wbsTreeContractService;
+    private final WbsTreePrivateMapper privateMapper;
 
     @Override
     public List<WbsTreePrivate> queryAllNodeByProjectId(String projectId) {
@@ -262,4 +264,11 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
     public WbsTreePrivate queryPeersNodeByProjectIdAndId(String projectId, Long id) {
         return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getId, id).eq(WbsTreePrivate::getIsDeleted, 0));
     }
+
+    //根据合同表单id获取项目级表单主键
+    @Override
+    public Set<Long> getAllPrivateTableByIds(Long projectId,List<Long> ids) {
+        Set<Long> set = privateMapper.getAllPrivateTableByIds(projectId, ids);
+        return set;
+    }
 }

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

@@ -11,6 +11,7 @@ import org.springblade.manager.injector.EasyBaseMapper;
 import org.springblade.manager.vo.*;
 
 import java.util.List;
+import java.util.Set;
 
 public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<WbsTreePrivate> selectAll(Integer wbsType);
@@ -95,4 +96,6 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<WbsTreePrivateVO5> treeRecordTrial(String wbsId, String projectId, Integer wbsType);
 
     void syncCurrentFormInProject(@Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate);
+
+    Set<Long> getAllPrivateTableByIds(@Param("projectId") Long projectId,@Param("ids") List<Long> ids);
 }

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

@@ -785,6 +785,13 @@
         </if>
         ORDER BY sort
     </select>
+    <select id="getAllPrivateTableByIds" resultType="java.lang.Long">
+        select p_key_id from m_wbs_tree_private
+        where is_deleted = 0 and project_id = #{projectId} and id in
+        <foreach collection="ids" item="id"  open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 
     <delete id="delTabProjectById">
         delete