huangjn %!s(int64=3) %!d(string=hai) anos
pai
achega
8125ea9fce
Modificáronse 24 ficheiros con 372 adicións e 164 borrados
  1. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/RecycleBin.java
  2. 28 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/RecycleBinClient.java
  3. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/RecycleBinVO.java
  4. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  5. 7 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  6. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java
  7. 36 12
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java
  8. 19 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  9. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  10. 66 94
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  11. 60 18
      blade-service/blade-business/src/main/java/org/springblade/business/controller/RecycleBinController.java
  12. 29 37
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TreeContractFirstController.java
  13. 19 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/RecycleBinClientImpl.java
  14. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  15. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  16. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  17. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  18. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java
  19. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  20. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  21. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  22. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  23. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  24. 4 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/RecycleBin.java

@@ -22,6 +22,10 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.DateUtil;
+
+import java.util.Date;
 
 /**
  * 实体类
@@ -75,5 +79,21 @@ public class RecycleBin extends BaseEntity {
 	@ApiModelProperty("操作人姓名")
     private String createUserName;
 
+    public RecycleBin(String businessIds, String title, Integer deletedType, String position, String projectId, String contractId){
+        this.businessId = businessIds;
+        this.fileName = title;
+        this.delType = deletedType;
+        this.position = position;
+        this.projectId = Long.parseLong(projectId);
+        this.contractId = Long.parseLong(contractId);
+
+        this.setCreateUser(AuthUtil.getUserId());
+        this.setCreateUserName(AuthUtil.getNickName());
+        Date now = new Date();
+        this.setCreateTime(now);
+        this.operationTime = DateUtil.format(now, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public RecycleBin(){}
 
 }

+ 28 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/RecycleBinClient.java

@@ -0,0 +1,28 @@
+package org.springblade.business.feign;
+
+import org.springblade.common.constant.BusinessConstant;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(value = BusinessConstant.APPLICATION_WEATHER_NAME)
+public interface RecycleBinClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/business/recycle";
+
+    /**
+     * 保存回收站数据
+     * @param businessIds 业务数据ID串
+     * @param title 文件名称或节点名称
+     * @param deletedType 删除的类型,文件资料1,工程划分2
+     * @param position 所在位置,即节点路径
+     * @param projectId 项目ID
+     * @param contractId 合同段ID
+     */
+    @PostMapping(API_PREFIX + "/saveDelBusinessData")
+    void saveDelBusinessData(@RequestParam String businessIds, @RequestParam String title, @RequestParam Integer deletedType, @RequestParam String position, @RequestParam String projectId, @RequestParam String contractId);
+
+}

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/RecycleBinVO.java

@@ -4,6 +4,8 @@ import org.springblade.business.entity.RecycleBin;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 视图实体类
  *
@@ -15,4 +17,6 @@ import lombok.EqualsAndHashCode;
 public class RecycleBinVO extends RecycleBin {
 	private static final long serialVersionUID = 1L;
 
+	private List<String> regainIds;
+
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -21,6 +21,9 @@ public interface WbsTreeContractClient {
      */
     String API_PREFIX = "/api/manager/WbsTreeContract";
 
+    @PostMapping(API_PREFIX + "/regainRemoveTreeByPrimaryKeyIds")
+    Boolean regainRemoveTreeByPrimaryKeyIds(@RequestBody List<String> primaryKeyIds);
+
     /**
      * 根据节点主键和分类查询对应的pdf信息
      */

+ 7 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -57,6 +57,13 @@ public interface IUserClient {
     String USER_ROLE_ID = API_PREFIX + "/user-roleId-update";
     String UPDATE_USER_ROLE_ID = API_PREFIX + "/user-roleId-update-two";
     String UPDATE_USERS_ROLE_ID = API_PREFIX + "/user-roleId-update-three";
+    String USER_INFO_LIST = API_PREFIX + "/find-user-info-list";
+
+    /**
+     * 获取所有有效用户
+     */
+    @GetMapping(USER_INFO_LIST)
+    List<User> findUserInfoList();
 
     /**
      * 获取用户信息

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java

@@ -14,6 +14,7 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.OperationLogClient;
+import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.StartTaskVO;
@@ -38,6 +39,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *  控制器
@@ -65,6 +67,8 @@ public class ArchiveFileController extends BladeController {
 
 	private final ISysClient sysClient;
 
+	private final RecycleBinClient recycleBinClient;
+
 	/**
 	 * 批量认证(特殊签章 签个透明空白图片,主要目的是在验签的时候有验签信息 )
 	 */
@@ -280,6 +284,16 @@ public class ArchiveFileController extends BladeController {
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "逻辑删除", notes = "传入ids")
 	public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		//保存操作日志
+		this.operationLogClient.saveUserOperationLog(27, "其他文件", "工程文件", ids);
+		//保存回收站记录
+		try{
+			List<ArchiveFile> fileList =  this.archiveFileService.list(Wrappers.<ArchiveFile>lambdaQuery().in(ArchiveFile::getId, Arrays.asList(ids.split(","))));
+			this.recycleBinClient.saveDelBusinessData(ids, fileList.stream().map(ArchiveFile::getFileName).collect(Collectors.joining(",")), 1, null, fileList.get(0).getProjectId(), fileList.get(0).getContractId());
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		//删除数据
 		return R.status(archiveFileService.deleteLogic(Func.toLongList(ids)));
 	}
 

+ 36 - 12
blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java

@@ -7,14 +7,17 @@ import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
-
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.service.IInformationQueryService;
+import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springframework.beans.BeanUtils;
@@ -27,8 +30,10 @@ import org.springblade.business.wrapper.ConstructionLedgerWrapper;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  *  施工台账控制器
@@ -46,6 +51,10 @@ public class ConstructionLedgerController extends BladeController {
 
 	private final WbsTreeContractClient wbsTreeContractClient;
 
+	private final ContractClient contractClient;
+
+	private final IInformationQueryService informationQueryService;
+
 	/**
 	 * 获取当前合同段的划分树
 	 * @param wbsType 查询类型,1为质检类型划分
@@ -60,10 +69,14 @@ public class ConstructionLedgerController extends BladeController {
 			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
 	})
 	public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam Integer wbsType, @RequestParam String parentId, @RequestParam String contractId){
-		return StringUtils.isEmpty(parentId) ?
-				R.data(this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, "0"))
-				:
-				R.data(this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, parentId));
+		List<WbsTreeContractTreeVOS> rootTreeNode;
+		if(StringUtils.isEmpty(parentId)){
+			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, "0");
+			rootTreeNode.get(0).setTitle(this.contractClient.getContractById(Long.parseLong(contractId)).getContractName());
+		} else {
+			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, parentId);
+		}
+		return R.data(rootTreeNode);
 	}
 
 	/**
@@ -91,19 +104,30 @@ public class ConstructionLedgerController extends BladeController {
 		query.setCurrent(vo.getCurrent());
 		query.setSize(vo.getSize());
 		IPage<ConstructionLedger> pages;
+
+		//检查wbsIds是唯一键还是其它泛用键
+		WbsTreeContract node = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getWbsIds().get(0));
+		if(node == null){
+			//这一步主要是为了兼容监理合同段
+			node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(Long.parseLong(vo.getWbsIds().get(0)), vo.getContractId());
+		}
+
+		List<QueryProcessDataVO> queryDataResult;
+		if(!new Integer("6").equals(node.getDeptCategory()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())){
+			//非填报节点
+			queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), 1, vo.getContractId().toString());
+		} else {
+			//填报节点
+			queryDataResult = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), 1);
+		}
+		vo.setWbsIds(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
+
 		if(vo.getSiteStartTime() != null && vo.getSiteEndTime() != null){
 			pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(ledger).lambda().in(ConstructionLedger::getWbsId, vo.getWbsIds()).between(ConstructionLedger::getSiteStartTime, ledger.getSiteStartTime(), ledger.getSiteEndTime()));
 		} else {
 			pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(ledger).lambda().in(ConstructionLedger::getWbsId, vo.getWbsIds()));
 		}
 
-		//类型转换
-//		List<ConstructionLedgerVO> ledgerVOS = JSONArray.parseArray(JSONObject.toJSONString(pages.getRecords()), ConstructionLedgerVO.class);
-//		ledgerVOS.forEach(vos -> {
-//			vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
-//			vos.setDetectionTimeStr(DateUtil.format(vos.getSiteEndTime(), "yyyy-MM-dd"));
-//		});
-
 		IPage<ConstructionLedgerVO> voiPage = ConstructionLedgerWrapper.build().pageVO(pages);
 		voiPage.getRecords().forEach(vos -> {
 			vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));

+ 19 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -15,6 +15,8 @@ import javax.validation.Valid;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
 import org.springblade.business.entity.ImageClassificationShow;
+import org.springblade.business.feign.OperationLogClient;
+import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.service.ImageClassificationShowService;
 import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.ImageClassificationShowVO;
@@ -56,6 +58,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *  影音资料控制器(客户端)
@@ -88,6 +91,10 @@ public class ImageClassificationFileController extends BladeController {
 
 	private final NewIOSSClient newIOSSClient;
 
+	private final OperationLogClient operationLogClient;
+
+	private final RecycleBinClient recycleBinClient;
+
 	/**
 	 * 批量下载
 	 */
@@ -175,7 +182,7 @@ public class ImageClassificationFileController extends BladeController {
 									//参见号
 									sheet.getRow(32).getCell(4).setCellValue(file.getShootingUser());
 
-									String locationFile = "doc/print/" + SnowFlakeUtil.getId() + ".xlsx";
+									String locationFile = "/Users/doc/print/" + SnowFlakeUtil.getId() + ".xlsx";
 									outputStream = new FileOutputStream(locationFile);
 									//记录文件删除
 									removeList.add(locationFile);
@@ -215,7 +222,7 @@ public class ImageClassificationFileController extends BladeController {
 								String[] urls = file.getMargePdfUrl().split("/");
 								mergeName = urls[urls.length - 1];
 							}
-							String mergeUrl = "doc/print/" + mergeName;
+							String mergeUrl = "/Users/doc/print/" + mergeName;
 							FileUtils.mergePdfPublicMethods(pdfFileList, mergeUrl);
 							//记录文件删除
 							removeList.add(mergeUrl);
@@ -552,6 +559,16 @@ public class ImageClassificationFileController extends BladeController {
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "影音资料信息逻辑删除", notes = "传入ids")
 	public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		//保存操作日志
+		this.operationLogClient.saveUserOperationLog(31, "其它文件", "影像资料", ids);
+		//保存回收站记录
+		try{
+			List<ImageClassificationFile> fileList = this.imageClassificationFileService.list(Wrappers.<ImageClassificationFile>lambdaQuery().in(ImageClassificationFile::getId, Arrays.asList(ids.split(","))));
+			this.recycleBinClient.saveDelBusinessData(ids, fileList.stream().map(ImageClassificationFile::getFileName).distinct().collect(Collectors.joining(",")), 1, null, fileList.get(0).getProjectId().toString(), fileList.get(0).getContractId().toString());
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		//逻辑删除数据
 		return R.status(imageClassificationFileService.deleteLogic(Func.toLongList(ids)));
 	}
 

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -32,6 +32,7 @@ import org.apache.commons.lang.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springblade.business.entity.*;
 import org.springblade.business.feign.OperationLogClient;
+import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.feignClient.ClientTreePublicCodeClientImpl;
 import org.springblade.business.service.IConstructionLedgerService;
@@ -105,6 +106,8 @@ public class InformationWriteQueryController extends BladeController {
 
 	private final JdbcTemplate jdbcTemplate;
 
+	private final RecycleBinClient recycleBinClient;
+
 	/**
 	 * 复制节点填报数据
 	 */
@@ -850,6 +853,8 @@ public class InformationWriteQueryController extends BladeController {
 
 		//保存操作记录
 		this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", ids);
+		//保存进回收站
+		this.recycleBinClient.saveDelBusinessData(ids, removeNode.getDeptName(), 2, "", removeNode.getProjectId(), removeNode.getContractId());
 
 		return R.data(this.wbsTreeContractClient.removeContractTreeNode(ids));
 	}

+ 66 - 94
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -1,17 +1,13 @@
 package org.springblade.business.controller;
 
 import cn.hutool.core.date.DateUtil;
-import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.business.entity.ConstructionLedger;
-import org.springblade.business.feignClient.ClientTreePublicCodeClientImpl;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.vo.NeiYeLedgerVO;
@@ -40,8 +36,6 @@ public class NeiYeController {
 
     private final IConstructionLedgerService constructionLedgerService;
 
-    private final ClientTreePublicCodeClientImpl clientTreePublicCodeClient;
-
     private final IInformationQueryService informationQueryService;
 
     private final ContractClient contractClient;
@@ -66,69 +60,78 @@ public class NeiYeController {
 
             //根据点击的节点获取这个节点下所有填报节点
             WbsTreeContract node = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(queryVO.getWbsIds().get(0));
-
+            if(node == null){
+                //这一步主要是为了兼容监理合同段
+                node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(Long.parseLong(queryVO.getWbsIds().get(0)), Long.parseLong(queryVO.getContractId()));
+            }
+            //不是工序,则查询当前节点下的所有填报节点
+            List<QueryProcessDataVO> queryDataResult;
             if(!new Integer("6").equals(node.getDeptCategory()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())){
-                //不是工序,则查询当前节点下的所有填报节点
-                List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), 1, queryVO.getContractId());
-                if(queryDataResult != null && queryDataResult.size() > 0){
-                    //删除非工序节点
-                    queryDataResult.removeIf(vo -> !new Integer("4").equals(vo.getMajorDataType()));
-
-                    //分组
-                    List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
-                    List<QueryProcessDataVO> groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
-
-                    //获取所有施工日志记录
-                    List<String> primaryKeyIds = groupQueryList.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
-                    List<ConstructionLedger> ledgers = this.constructionLedgerService.list(Wrappers.<ConstructionLedger>lambdaQuery().in(ConstructionLedger::getWbsId, primaryKeyIds));
-
-                    for(QueryProcessDataVO vo : groupQueryList){
-                        //处理父节点信息
-                        Map<String, String> map = new HashMap<>();
-                        this.foreachGetParent(map, idToNodeMap, vo.getParentId(), queryVO.getContractId());
-
-                        //获取当前工序的施工台账信息
-                        if(ledgers != null && ledgers.size() > 0){
-                            Iterator<ConstructionLedger> iterator = ledgers.iterator();
-                            while (iterator.hasNext()){
-                                ConstructionLedger ledger = iterator.next();
-                                if(vo.getPrimaryKeyId().equals(ledger.getWbsId().toString())){
-                                    if(ledger.getSiteStartTime() != null && ledger.getSiteEndTime() != null){
-                                        //获取施工起止时间
-                                        map.put("siteStartToEndTime", DateUtil.format(ledger.getSiteStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getSiteEndTime(), "yyyy-MM-dd"));
-                                    }
-                                    if(ledger.getDetectionStartTime() != null && ledger.getDetectionEndTime() != null){
-                                        //获取检测起止时间
-                                        map.put("detectionStartToEndTime", DateUtil.format(ledger.getDetectionStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getDetectionEndTime(), "yyyy-MM-dd"));
-                                    }
-                                    iterator.remove();
-                                    break;
+                //非填报节点
+                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), 1, queryVO.getContractId());
+            } else {
+                //填报节点
+                queryDataResult = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), 1);
+            }
+
+            if (queryDataResult != null && queryDataResult.size() > 0) {
+                //删除非工序节点
+                queryDataResult.removeIf(vo -> !new Integer("4").equals(vo.getMajorDataType()));
+
+                //分组
+                List<List<QueryProcessDataVO>> groupList = CommonUtil.getBatchSize(queryDataResult, queryVO.getSize());
+                List<QueryProcessDataVO> groupQueryList = groupList.get(queryVO.getCurrent() == 0 ? 0 : queryVO.getCurrent() - 1);
+
+                //获取所有施工日志记录
+                List<String> primaryKeyIds = groupQueryList.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
+                List<ConstructionLedger> ledgers = this.constructionLedgerService.list(Wrappers.<ConstructionLedger>lambdaQuery().in(ConstructionLedger::getWbsId, primaryKeyIds));
+
+                for (QueryProcessDataVO vo : groupQueryList) {
+                    //处理父节点信息
+                    Map<String, String> map = new HashMap<>();
+                    this.foreachGetParent(map, idToNodeMap, vo.getParentId(), queryVO.getContractId());
+
+                    //获取当前工序的施工台账信息
+                    if (ledgers != null && ledgers.size() > 0) {
+                        Iterator<ConstructionLedger> iterator = ledgers.iterator();
+                        while (iterator.hasNext()) {
+                            ConstructionLedger ledger = iterator.next();
+                            if (vo.getPrimaryKeyId().equals(ledger.getWbsId().toString())) {
+                                if (ledger.getSiteStartTime() != null && ledger.getSiteEndTime() != null) {
+                                    //获取施工起止时间
+                                    map.put("siteStartToEndTime", DateUtil.format(ledger.getSiteStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getSiteEndTime(), "yyyy-MM-dd"));
+                                }
+                                if (ledger.getDetectionStartTime() != null && ledger.getDetectionEndTime() != null) {
+                                    //获取检测起止时间
+                                    map.put("detectionStartToEndTime", DateUtil.format(ledger.getDetectionStartTime(), "yyyy-MM-dd") + " ~ " + DateUtil.format(ledger.getDetectionEndTime(), "yyyy-MM-dd"));
                                 }
+                                iterator.remove();
+                                break;
                             }
                         }
-                        //todo 当前缺少流程状态、是否关联评定、是否关联试验 =================================
-                        //新增列表数据
-                        neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
-                                map.get("partProject"),
-                                map.get("partChildProject"),
-                                map.get("subentryProject"),
-                                map.get("subentryChildProject"),
-                                vo.getTitle(),
-                                map.get("siteStartToEndTime"),
-                                map.get("detectionStartToEndTime"),
-                                new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
-                                "false",
-                                "false"));
                     }
-                    //转换为page信息
-                    Query query = new Query();
-                    query.setCurrent(queryVO.getCurrent());
-                    query.setSize(queryVO.getSize());
-                    IPage<NeiYeLedgerVO> page = Condition.getPage(query);
-                    page.setTotal(queryDataResult.size());
-                    page.setRecords(neiYeLedgerVOList);
-                    return R.data(page);
+                    //todo 当前缺少是否关联评定、是否关联试验 =================================
+                    //新增列表数据
+                    neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
+                            map.get("partProject"),
+                            map.get("partChildProject"),
+                            map.get("subentryProject"),
+                            map.get("subentryChildProject"),
+                            vo.getTitle(),
+                            map.get("siteStartToEndTime"),
+                            map.get("detectionStartToEndTime"),
+                            new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
+                            "false",
+                            "false"));
                 }
+                //转换为page信息
+                Query query = new Query();
+                query.setCurrent(queryVO.getCurrent());
+                query.setSize(queryVO.getSize());
+                IPage<NeiYeLedgerVO> page = Condition.getPage(query);
+                page.setTotal(queryDataResult.size());
+                page.setRecords(neiYeLedgerVOList);
+                return R.data(page);
             }
         }
 
@@ -170,35 +173,4 @@ public class NeiYeController {
         }
     }
 
-    /**
-     * 获取当前合同段的划分树
-     * @param wbsType 查询类型,1为质检类型划分
-     * @return 结果
-     */
-    @GetMapping("/queryContractWbsTreeByContractIdAndType")
-    @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "获取当前合同段的划分树")
-    @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "wbsType", value = "数据类型,目前质检为1"),
-            @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
-            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    })
-    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam Integer wbsType, @RequestParam String parentId, @RequestParam String contractId){
-        List<WbsTreeContractTreeVOS> rootTreeNode;
-        if(StringUtils.isEmpty(parentId)){
-            //为空,说明初始化
-            //获取根节点
-            rootTreeNode = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
-            //设置名称
-            rootTreeNode.get(0).setTitle(this.contractClient.getContractById(Long.parseLong(contractId)).getContractName());
-        } else {
-            //不为空,获取其下子节点
-            rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
-        }
-
-        rootTreeNode.removeIf(vos -> Arrays.asList("1,2,3".split(",")).contains(vos.getMajorDataType().toString()));
-
-        return R.data(rootTreeNode);
-    }
-
 }

+ 60 - 18
blade-service/blade-business/src/main/java/org/springblade/business/controller/RecycleBinController.java

@@ -8,13 +8,18 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.ImageClassificationFile;
+import org.springblade.business.service.IArchiveFileService;
+import org.springblade.business.service.IImageClassificationFileService;
+import org.springblade.business.vo.RecycleBinVO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.entity.RecycleBin;
 import org.springblade.business.service.IRecycleBinService;
@@ -42,43 +47,79 @@ public class RecycleBinController extends BladeController {
 
 	private final WbsTreeContractClient wbsTreeContractClient;
 
+	private final IArchiveFileService archiveFileService;
+
+	private final IImageClassificationFileService imageClassificationFileService;
+
 	/**
 	 * 恢复
 	 */
 	@PostMapping("/regain")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "恢复")
-	public R<Boolean> regain(@RequestParam String ids){
-		if(StringUtils.isNotEmpty(ids)){
+	public R<Boolean> regain(@RequestBody RecycleBinVO vo){
+		if(vo.getRegainIds() != null && vo.getRegainIds().size() > 0){
 			//获取数据
-			List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().in(RecycleBin::getId, Arrays.asList(ids.split(","))));
+			List<RecycleBin> recycleBinList = this.recycleBinService.list(Wrappers.<RecycleBin>lambdaQuery().in(RecycleBin::getId, vo.getRegainIds()));
+			//恢复数据成功后删除回收站对应记录
+			List<String> recycleBinIds = new ArrayList<>();
 			//划分数据类型
 			//工程划分
-			List<RecycleBin> nodeTypeList = recycleBinList.stream().filter(recycleBin -> new Integer("1").equals(recycleBin.getDelType())).distinct().collect(Collectors.toList());
+			List<RecycleBin> nodeTypeList = recycleBinList.stream().filter(recycleBin -> new Integer("2").equals(recycleBin.getDelType())).distinct().collect(Collectors.toList());
+			boolean regainNode = false, regainFile = false;
 			if(nodeTypeList.size() > 0){
 				//恢复集合
 				List<String> processNodeList = new ArrayList<>();
-				List<String> recycleBinIds = new ArrayList<>();
-				for(RecycleBin recycleBin : nodeTypeList){
-					if(StringUtils.isNotEmpty(recycleBin.getBusinessId())){
-						if(recycleBin.getBusinessId().contains(",")){
-							processNodeList.addAll(new ArrayList<>(Arrays.asList(recycleBin.getBusinessId().split(","))));
-						} else {
-							processNodeList.add(recycleBin.getBusinessId());
-						}
-						recycleBinIds.add(recycleBin.getId().toString());
+				this.foreachQueryData(nodeTypeList, recycleBinIds, processNodeList);
+				try{
+					//恢复数据
+					if(processNodeList.size() > 0){
+						regainNode = this.wbsTreeContractClient.regainRemoveTreeByPrimaryKeyIds(processNodeList);
 					}
+				}catch (Exception e){
+					e.printStackTrace();
 				}
+			}
+			//文件类型
+			List<RecycleBin> filetypeList = recycleBinList.stream().filter(recycleBin -> new Integer("1").equals(recycleBin.getDelType())).distinct().collect(Collectors.toList());
+			if(filetypeList.size() > 0){
+				//恢复集合
+				List<String> fileList = new ArrayList<>();
+				this.foreachQueryData(filetypeList, recycleBinIds, fileList);
 				try{
-//					this.wbsTreeContractClient
+					if(fileList.size() > 0){
+						//文件数据包括工程文件及影像资料,这里采用最简单粗暴的方法进行恢复
+						//恢复工程文件数据
+						regainFile = this.archiveFileService.update(Wrappers.<ArchiveFile>lambdaUpdate().set(ArchiveFile::getIsDeleted, 0).in(ArchiveFile::getId, fileList));
+						//恢复影像资料数据
+						regainFile = this.imageClassificationFileService.update(Wrappers.<ImageClassificationFile>lambdaUpdate().set(ImageClassificationFile::getIsDeleted, 0).in(ImageClassificationFile::getId, fileList));
+					}
 				}catch (Exception e){
 					e.printStackTrace();
 				}
 			}
-			//文件类型
-			List<RecycleBin> filetypeList = recycleBinList.stream().filter(recycleBin -> new Integer("2").equals(recycleBin.getDelType())).distinct().collect(Collectors.toList());
+			//删除回收站记录
+			if(recycleBinIds.size() > 0 && (regainNode || regainFile)){
+				this.recycleBinService.update(Wrappers.<RecycleBin>lambdaUpdate().set(RecycleBin::getIsDeleted, 1).set(RecycleBin::getUpdateTime, new Date()).set(RecycleBin::getUpdateUser, AuthUtil.getUserId()).in(RecycleBin::getId, recycleBinIds));
+				return R.data(true);
+			} else {
+				return R.data(300, false, "数据恢复失败,请联系维护人员处理");
+			}
+		}
+		return R.data(300, false, "未找到需要需要恢复的数据");
+	}
+
+	private void foreachQueryData(List<RecycleBin> recycleList, List<String> recycleBinIds, List<String> result){
+		for(RecycleBin recycleBin : recycleList){
+			if(StringUtils.isNotEmpty(recycleBin.getBusinessId())){
+				if(recycleBin.getBusinessId().contains(",")){
+					result.addAll(new ArrayList<>(Arrays.asList(recycleBin.getBusinessId().split(","))));
+				} else {
+					result.add(recycleBin.getBusinessId());
+				}
+				recycleBinIds.add(recycleBin.getId().toString());
+			}
 		}
-		return null;
 	}
 
 	/**
@@ -96,6 +137,7 @@ public class RecycleBinController extends BladeController {
 		Date oldDate = DateUtil.minusDays(nowDate, 30);
 
 		wrapper.lambda().between(RecycleBin::getCreateTime, oldDate, nowDate);
+		wrapper.lambda().eq(RecycleBin::getCreateUser, AuthUtil.getUserId());
 
 		return R.data(this.recycleBinService.page(Condition.getPage(query), wrapper));
 	}

+ 29 - 37
blade-service/blade-business/src/main/java/org/springblade/business/controller/TreeContractFirstController.java

@@ -1,19 +1,3 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONArray;
@@ -30,6 +14,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springframework.web.bind.annotation.*;
@@ -59,6 +44,8 @@ public class TreeContractFirstController extends BladeController {
 
 	private final ClientTreePublicCodeClientImpl clientTreePublicCodeClient;
 
+	private final ContractClient contractClient;
+
 	/**
 	 * 获取合同段划分树中被标记为首件的节点
 	 * @param parentId 父节点,为空则查询第一级节点
@@ -79,6 +66,7 @@ public class TreeContractFirstController extends BladeController {
 			//为空,说明初始化
 			//获取根节点
 			rootTreeNode = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
+			rootTreeNode.get(0).setTitle(this.contractClient.getContractById(Long.parseLong(contractId)).getContractName());
 		} else {
 			//不为空,获取其下子节点
 			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
@@ -250,29 +238,33 @@ public class TreeContractFirstController extends BladeController {
 		//获取所有子节点
 		List<WbsTreeContract> childList = this.wbsTreeContractClient.queryCurrentNodeAllChild(Long.parseLong(currentNode.getContractId()), currentNode.getId());
 		if(childList != null && childList.size() != 0){
-			//首先找到当前节点下的第一级子节点
-			Map<String,StringBuilder> idMap = new HashMap<>();
-			Map<String, WbsTreeContract> treeMap = new HashMap<>();
-			//一级子节点的primaryKeyId
-			StringBuilder oneChild = new StringBuilder();
-			childList.forEach(node -> {
-				treeMap.put(node.getPKeyId().toString(), node);
-				if(currentNode.getId().equals(node.getParentId())){
-					oneChild.append(",").append(node.getPKeyId());
-				}
-			});
-			idMap.put(currentNode.getPKeyId().toString(), oneChild);
+			//删除属于表格的节点
+			childList.removeIf(node -> new Integer("2").equals(node.getType()));
+			if(childList.size() > 0){
+				//首先找到当前节点下的第一级子节点
+				Map<String,StringBuilder> idMap = new HashMap<>();
+				Map<String, WbsTreeContract> treeMap = new HashMap<>();
+				//一级子节点的primaryKeyId
+				StringBuilder oneChild = new StringBuilder();
+				childList.forEach(node -> {
+					treeMap.put(node.getPKeyId().toString(), node);
+					if(currentNode.getId().equals(node.getParentId())){
+						oneChild.append(",").append(node.getPKeyId());
+					}
+				});
+				idMap.put(currentNode.getPKeyId().toString(), oneChild);
 
-			String[] childArray =  oneChild.toString().split(",");
-			for(String childPKeyId : childArray){
-				//继续向下查询正确的子节点
-				this.foreachQueryChild(childPKeyId, idMap, treeMap, childList);
-			}
+				String[] childArray =  oneChild.toString().split(",");
+				for(String childPKeyId : childArray){
+					//继续向下查询正确的子节点
+					this.foreachQueryChild(childPKeyId, idMap, treeMap, childList);
+				}
 
-			//执行 foreachQueryChild 后idMap中就是所有正确子节点的排布,将其全部拼接进 childIds 中
-			Set<String> primaryKeys = idMap.keySet();
-			for(String key : primaryKeys){
-				childIds.append(",").append(idMap.get(key));
+				//执行 foreachQueryChild 后idMap中就是所有正确子节点的排布,将其全部拼接进 childIds 中
+				Set<String> primaryKeys = idMap.keySet();
+				for(String key : primaryKeys){
+					childIds.append(",").append(idMap.get(key));
+				}
 			}
 		}
 	}

+ 19 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/RecycleBinClientImpl.java

@@ -0,0 +1,19 @@
+package org.springblade.business.feignClient;
+
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.RecycleBin;
+import org.springblade.business.feign.RecycleBinClient;
+import org.springblade.business.service.IRecycleBinService;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+public class RecycleBinClientImpl implements RecycleBinClient {
+
+    private final IRecycleBinService recycleBinService;
+
+    @Override
+    public void saveDelBusinessData(String businessIds, String title, Integer deletedType, String position, String projectId, String contractId) {
+        this.recycleBinService.save(new RecycleBin(businessIds, title, deletedType, position, projectId, contractId));
+    }
+}

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -32,6 +32,8 @@ import org.springblade.business.vo.QueryProcessDataVO;
  */
 public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 
+	List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(@Param("primaryKeyId") String primaryKeyId, @Param("classify") Integer classify);
+
 	/**
 	 * 查询工序节点的填报记录
 	 */

+ 18 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -45,6 +45,24 @@
 
     <resultMap id="intResultMap" type="java.lang.Integer"/>
 
+    <select id="queryProcessDataByPrimaryKeyIdAndClassify" resultMap="queryProcessDataMap">
+        SELECT
+            wtc.id AS treeId,
+            wtc.p_key_id,
+            wtc.ancestors,
+            wtc.major_data_type,
+            wtc.dept_name AS title,
+            wtc.parent_id AS parentId,
+            uiq.id AS informationQueryId,
+            uiq.status
+        FROM
+            m_wbs_tree_contract AS wtc
+        LEFT JOIN u_information_query AS uiq ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = #{classify} and uiq.is_deleted = 0
+        WHERE
+            wtc.p_key_id = #{primaryKeyId}
+        AND wtc.is_deleted = 0
+    </select>
+
     <select id="queryProcessDataByParentIdAndContractId" resultMap="queryProcessDataMap">
         SELECT
             wtc.id AS treeId,

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java

@@ -33,6 +33,11 @@ import java.util.List;
  */
 public interface IInformationQueryService extends BaseService<InformationQuery> {
 
+	/**
+	 * 查询工序节点的填报记录
+	 */
+	List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(String primaryKeyId, Integer classify);
+
 	/**
 	 * 查询工序节点的填报记录
 	 */

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

@@ -34,6 +34,11 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
 	private final WbsTreeContractClient wbsTreeContractClient;
 
+	@Override
+	public List<QueryProcessDataVO> queryProcessDataByPrimaryKeyIdAndClassify(String primaryKeyId, Integer classify) {
+		return this.baseMapper.queryProcessDataByPrimaryKeyIdAndClassify(primaryKeyId, classify);
+	}
+
 	@Override
 	public List<QueryProcessDataVO> queryProcessDataByParentIdAndContractId(String parentId, Integer classify, String contractId) {
 		List<QueryProcessDataVO> result = this.baseMapper.queryProcessDataByParentIdAndContractId(parentId, classify, contractId);

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

@@ -42,6 +42,7 @@ import org.springblade.system.entity.Role;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.vo.RoleVO;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -81,6 +82,8 @@ public class SignPfxFileController extends BladeController {
 
 	private final IDictBizClient dictBizClient;
 
+	private final IUserClient userClient;
+
 	/**
 	 * 根据合同段ID获取项目下的所有合同段
 	 * @return 结果
@@ -112,7 +115,7 @@ public class SignPfxFileController extends BladeController {
 	@ApiOperationSupport(order = 11)
 	@ApiOperation(value = "获取当前系统下所有用户")
 	public R<List<User>> findUserByName(){
-		return R.data(this.contractInfoService.findUserList());
+		return R.data(this.userClient.findUserInfoList());
 	}
 
 

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

@@ -32,6 +32,11 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     private final IDictBizClient dictBizClient;
 
+    @Override
+    public Boolean regainRemoveTreeByPrimaryKeyIds(List<String> primaryKeyIds) {
+        return this.wbsTreeContractService.regainRemoveTreeByPrimaryKeyIds(primaryKeyIds);
+    }
+
     @Override
     public List<WbsTreeContract> queryProcessSubmitBusinessDataByPrimaKeyIdAndClassify(String primaKeyId, String classify) {
         WbsTreeContract keyNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, primaKeyId));

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -12,6 +12,8 @@ import java.util.List;
 
 public interface WbsTreeContractMapper extends BaseMapper<WbsTreeContract> {
 
+    Boolean regainRemoveTreeByPrimaryKeyIds(@Param("primaryKeyIds") List<String> primaryKeyIds);
+
     List<WbsTreeContract> queryContractSubmitWbsTreeByContractId(@Param("contractId")String contractId);
 
     List<WbsTreeContract> queryCurrentContractLogList(@Param("projectId") String projectId);

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -574,4 +574,14 @@
         AND contract_type = 1
     </select>
 
+    <update id="regainRemoveTreeByPrimaryKeyIds">
+        update m_wbs_tree_contract set is_deleted = 0
+        <where>
+            p_key_id in
+            <foreach collection="primaryKeyIds" item="primaryKeyId" open="(" separator="," close=")">
+                #{primaryKeyId}
+            </foreach>
+        </where>
+    </update>
+
 </mapper>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -12,6 +12,8 @@ import java.util.List;
 
 public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
+    Boolean regainRemoveTreeByPrimaryKeyIds(List<String> primaryKeyIds);
+
     List<WbsTreeContract> queryContractSubmitWbsTreeByContractId(String contractId);
 
     @Deprecated

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -40,6 +40,11 @@ public class WbsTreeContractServiceImpl
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
 
+    @Override
+    public Boolean regainRemoveTreeByPrimaryKeyIds(List<String> primaryKeyIds) {
+        return this.baseMapper.regainRemoveTreeByPrimaryKeyIds(primaryKeyIds);
+    }
+
     @Override
     public List<WbsTreeContract> queryContractSubmitWbsTreeByContractId(String contractId) {
         return this.baseMapper.queryContractSubmitWbsTreeByContractId(contractId);

+ 4 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -46,6 +46,10 @@ public class UserClient implements IUserClient {
 
     private final IUserService service;
 
+    @Override
+    public List<User> findUserInfoList() {
+        return this.service.list();
+    }
 
     @Override
     @GetMapping(USER_INFO_BY_ID)