浏览代码

Merge remote-tracking branch 'origin/master' into master

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
yangyj 1 年之前
父节点
当前提交
16bc199f44
共有 20 个文件被更改,包括 348 次插入113 次删除
  1. 5 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java
  2. 10 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java
  3. 40 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveConclusion.java
  4. 2 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java
  5. 2 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ProjectInspectStatVO.java
  6. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelEditCallback.java
  7. 30 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveConclusionMapper.java
  9. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  10. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  11. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  12. 10 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  13. 82 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  14. 12 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  15. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  16. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  17. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  18. 104 97
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  19. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
  20. 13 2
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

+ 5 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java

@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.InputStream;
 import java.util.List;
 
 @FeignClient(value = AppConstant.APPLICATION_RESOURCE_NAME)
@@ -18,6 +19,7 @@ public interface NewIOSSClient {
     String UPLOAD_FILE_INFO = API_PREFIX + "/uploadFileInfo";
     String UPLOAD_FILE_INFO_BYTE = API_PREFIX + "/uploadFileInfoByte";
     String UPLOAD_FILE_INFO_INPUT_STREAM = API_PREFIX + "/uploadFileInfoInputStream";
+    String UPLOAD_FILE_INFO_INPUT_STREAM2 = API_PREFIX + "/uploadFileInfoInputStream2";
     String REMOVE_PDF_FILE = API_PREFIX + "/remove-file";
     String REMOVE_PDF_FILES = API_PREFIX + "/remove-files";
     String UPLOAD_FILE_INFO_WITH_PATH = API_PREFIX + "/uploadFileInfoWithPath";
@@ -25,6 +27,9 @@ public interface NewIOSSClient {
     @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     BladeFile uploadFileByInputStream(MultipartFile file);
 
+    @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM2)
+    BladeFile uploadFileByInputStream2(@RequestParam String OriginalFilename,@RequestParam InputStream inputStream);
+
     @PostMapping(UPLOAD_FILE_INFO)
     BladeFile uploadFile(@RequestParam String fileName, @RequestParam String localFileUrl);
 

+ 10 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java

@@ -38,6 +38,16 @@ public class NewIOSSClientImpl implements NewIOSSClient {
         return null;
     }
 
+    @Override
+    public BladeFile uploadFileByInputStream2(String OriginalFilename, InputStream inputStream) {
+        try {
+            return this.ossBuilder.template().putFile(OriginalFilename, inputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     @Override
     public BladeFile updateFile(byte[] fileByte, String fileName) {
         try {

+ 40 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveConclusion.java

@@ -0,0 +1,40 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Param   档案结论表
+ * @Author wangwl
+ * @Date 2023/11/22 11:15
+ **/
+@Data
+@TableName("u_archive_conclusion")
+public class ArchiveConclusion implements Serializable {
+
+    @ApiModelProperty("主键id")
+    @TableId(
+            value = "id",
+            type = IdType.ASSIGN_ID
+    )
+    private Long id;
+
+    @ApiModelProperty("项目id")
+    private Long projectId;
+
+    @ApiModelProperty("专家id")
+    private Long expertId;
+
+    @ApiModelProperty("文档地址")
+    private String worldUrl;
+
+    @ApiModelProperty("文档PDF地址")
+    private String worldPdfUrl;
+
+
+}

+ 2 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.archive.entity.ArchivesAuto;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -12,7 +13,7 @@ import java.util.List;
  * @Date 2023/8/23 14:52
  **/
 @Data
-public class CheckoutVO {
+public class CheckoutVO implements Serializable {
 
     @ApiModelProperty("节点名称")
     private String nodeName;

+ 2 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ProjectInspectStatVO.java

@@ -3,6 +3,7 @@ package org.springblade.archive.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -11,7 +12,7 @@ import java.util.List;
  * @Date 2023/11/17 14:31
  **/
 @Data
-public class ProjectInspectStatVO {
+public class ProjectInspectStatVO implements Serializable {
     @ApiModelProperty("预警提示")
     private String tips;
 

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelEditCallback.java

@@ -20,4 +20,6 @@ public class ExcelEditCallback {
     // 返回码
     private Integer error;
 
+    private Long projectId;
+
 }

+ 30 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -25,6 +25,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
 import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
@@ -33,6 +34,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.message.BasicNameValuePair;
 import org.springblade.archive.dto.SaveApplyDTO;
+import org.springblade.archive.entity.ArchiveConclusion;
 import org.springblade.archive.entity.ExpertInspection;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
@@ -49,6 +51,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ContractClient;
@@ -878,6 +881,33 @@ public class ArchivesAutoController extends BladeController {
 		return R.data(vo);
 	}
 
+	/**
+	 * 在线验收-编写报告
+	 */
+	@GetMapping("/getArchiveConclusion")
+	@ApiOperationSupport(order = 36)
+	@ApiOperation(value = "在线验收-编写报告", notes = "当前专家存在草稿则返回草稿,不存在则返回模板")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<ArchiveConclusion> getArchiveConclusion(@RequestParam Long projectId) {
+		ArchiveConclusion vo = archivesAutoService.getArchiveConclusion(projectId);
+		return R.data(vo);
+	}
+
+	/**
+	 * 在线excel 档案修改回调
+	 */
+	@PostMapping(value = "/callbackSave")
+	@ApiOperation(value = "onlyOffice保存回调", notes = "onlyOffice保存回调")
+	@ApiOperationSupport(order = 37)
+	@ResponseBody
+	public ExcelEditCallback callbackSave(@RequestBody ExcelEditCallback callback, HttpServletRequest request) {
+		String projectId = request.getParameter("projectId");
+		callback.setProjectId(Long.parseLong(projectId));
+		return archivesAutoService.callbackSave(callback);
+	}
+
 
 
 }

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveConclusionMapper.java

@@ -0,0 +1,16 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.archive.entity.ArchiveConclusion;
+import org.springblade.archive.entity.ArchiveProjectConfig;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @since 2023-04-09
+ */
+public interface ArchiveConclusionMapper extends BaseMapper<ArchiveConclusion> {
+
+}

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -20,6 +20,7 @@ import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.ArchivesAutoDTO;
+import org.springblade.archive.entity.ArchiveConclusion;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -183,4 +184,7 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	IPage<ExpertInspectionVO> getUserInspectInfo(IPage<ExpertInspectionVO> page,@Param("projectId") Long projectId,@Param("userId") Long userId);
 
     List<ArchivesAutoVO3> getAllInspectArchive(@Param("projectId")Long projectId);
+
+    ArchiveConclusion getArchiveConclusion(@Param("projectId") Long projectId,@Param("userId") Long userId);
+
 }

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -1051,6 +1051,10 @@
                uaa.*
         from u_archives_auto uaa WHERE project_id = #{projectId} and is_deleted = 0 and is_apply = 1
     </select>
+    <select id="getArchiveConclusion" resultType="org.springblade.archive.entity.ArchiveConclusion">
+        select * from u_archive_conclusion where project_id = #{projectId} and expert_id = #{userId}
+    </select>
+
 
 
     <update id="splitFiles">

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -17,6 +17,7 @@
 package org.springblade.archive.service;
 
 import org.springblade.archive.dto.SaveApplyDTO;
+import org.springblade.archive.entity.ArchiveConclusion;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.entity.ExpertInspection;
 import org.springblade.archive.vo.*;
@@ -26,6 +27,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 import org.springframework.web.multipart.MultipartFile;
@@ -137,4 +139,7 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId);
 
 
+    ArchiveConclusion getArchiveConclusion(Long projectId);
+
+	ExcelEditCallback callbackSave(ExcelEditCallback callback);
 }

+ 10 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -513,6 +513,14 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             if ("null~null".equals(object)) {
                 object = "";
             }
+            if (object!= null ) {
+                String strObject = object.toString();
+                if (strObject.contains("null")) {
+                    strObject = strObject.replace("null", "");
+                    object =  strObject;
+                }
+            }
+
         }
         dataInfo.put(key, object);
     }
@@ -702,7 +710,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         for (ArchiveFile file : datas) {
             String fileTime = file.getFileTime();
-            if (StringUtils.isNotEmpty(fileTime)) {
+            if (StringUtils.isNotEmpty(fileTime) && !fileTime.equals("null")) {
                 if (minDate.isEmpty() || fileTime.compareTo(minDate) <= 0) {
                     minDate = fileTime;
                 }
@@ -723,7 +731,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         if (!maxDate.isEmpty() && !maxDate.equals("null") ) {
             LocalDateTime localDateTime = FormulaUtil.parseStringToLocalDateTime(maxDate, "yyyyMMdd");
             if (localDateTime != null) {
-                archive.setStartDate(localDateTime);
+                archive.setEndDate(localDateTime);
             }
         }
 

+ 82 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -32,9 +32,11 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.dto.SaveApplyDTO;
+import org.springblade.archive.entity.ArchiveConclusion;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.mapper.ArchiveConclusionMapper;
 import org.springblade.archive.service.*;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileTransJavaDemo;
@@ -63,9 +65,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
@@ -93,6 +93,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
+import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -137,6 +138,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final IExpertInspectionService inspectionService;
 
+	private final ArchiveConclusionMapper conclusionMapper;
+
 
 
 
@@ -3009,6 +3012,82 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return vo;
 	}
 
+	/**
+	 * 在线验收-编写报告
+	 */
+	@Override
+	public ArchiveConclusion getArchiveConclusion(Long projectId) {
+		Long userId = AuthUtil.getUserId();
+		ArchiveConclusion conclusion = baseMapper.getArchiveConclusion(projectId, userId);
+		//如果为空返回模板
+		if (conclusion == null){
+			//当保存的时候发现key为5代表是模板
+			ArchiveConclusion archiveConclusion = new ArchiveConclusion();
+			Long id = SnowFlakeUtil.getId();
+			archiveConclusion.setId(id);
+			archiveConclusion.setWorldUrl("https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20231122/377ab5022240b55f9b63e2f4e3aae437.docx");
+			return archiveConclusion;
+		}
+		//否则返回草稿
+		return conclusion;
+	}
+
+	/**
+	 * 在线excel 档案修改回调
+	 */
+	@Override
+	public ExcelEditCallback callbackSave(ExcelEditCallback callback) {
+		ExcelEditCallback editCallback = new ExcelEditCallback();
+		editCallback.setError(0); //初始化返回值
+		int status = callback.getStatus();
+		//status=6,表示点击保存按钮
+		if (status == 3 || status == 6)
+		{
+			//获取url
+			String downloadUri = callback.getUrl();
+			downloadUri = downloadUri.replaceAll("amp;", "");
+			try {
+				//获取onlyOffice缓存中的文件流
+				URL url = new URL(downloadUri);
+				java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
+				connection.setRequestMethod("GET");
+				connection.setConnectTimeout(5 * 1000);
+				InputStream inputStream = connection.getInputStream();
+				if (inputStream == null) {
+					throw new Exception("文件为空");
+				}
+				//判断当前key是否存在,不存在则新增,存在则修改
+				String id = callback.getKey();
+				if (StringUtils.isBlank(id)){
+					throw new Exception("key不能为null");
+				}
+//				id = id.substring(0, id.lastIndexOf("_"));
+//				ArchiveConclusion conclusion = conclusionMapper.selectById(id);
+				ArchiveConclusion conclusion = conclusionMapper.selectOne(new LambdaQueryWrapper<ArchiveConclusion>().eq(ArchiveConclusion::getExpertId,AuthUtil.getUserId()));
+				//上传新文件到文件服务器
+				BladeFile bladeFile = iossClient.uploadFileByInputStream2("结论.docx",inputStream);
+				if (bladeFile == null || StringUtils.isBlank(bladeFile.getLink())){
+					throw new Exception("文件上传失败");
+				}
+				if (conclusion == null){
+					ArchiveConclusion archiveConclusion = new ArchiveConclusion();
+					archiveConclusion.setWorldUrl(bladeFile.getLink());
+					archiveConclusion.setId(SnowFlakeUtil.getId());
+					archiveConclusion.setExpertId(AuthUtil.getUserId());
+					archiveConclusion.setProjectId(callback.getProjectId());
+					conclusionMapper.insert(archiveConclusion);
+				}else {
+					conclusion.setWorldUrl(bladeFile.getLink());
+					conclusionMapper.updateById(conclusion);
+				}
+				inputStream.close();
+			} catch (Exception e) {
+				editCallback.setError(1);
+				e.printStackTrace();
+			}
+		}
+		return editCallback;
+	}
 
 
 	public void deleteFile(String defaultDir,Long id){

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

@@ -942,6 +942,12 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                         RedisTemplate.delete(keysByInformationQuery);
                     }
 
+                    //模糊匹配所有以contractId开头的所有节点计算统计key值
+                    Set<String> keysParentCount = RedisTemplate.keys("blade-manager::contract:wbstree:byParentCountNodes:" + sgId + "*");
+                    if (keysParentCount != null) {
+                        RedisTemplate.delete(keysParentCount);
+                    }
+
                     //删除合同段本地缓存
                     wbsTreeContractClient.deleteContractLocalCache(String.valueOf(sgId));
                 }
@@ -961,6 +967,12 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 RedisTemplate.delete(keysByInformationQuery);
             }
 
+            //模糊匹配所有以contractId开头的所有节点计算统计key值
+            Set<String> keysParentCount = RedisTemplate.keys("blade-manager::contract:wbstree:byParentCountNodes:" + contractId + "*");
+            if (keysParentCount != null) {
+                RedisTemplate.delete(keysParentCount);
+            }
+
             //删除合同段本地缓存
             wbsTreeContractClient.deleteContractLocalCache(contractId);
         }

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

@@ -3856,7 +3856,7 @@ public class ExcelTabController extends BladeController {
      * @return
      * @throws Exception
      */
-    @PostMapping("/save_buss_data2")
+    @PostMapping("/save_buss_data2222")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
     public R saveBussData(@Valid @RequestBody JSONObject dataInfo) throws Exception {

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

@@ -667,12 +667,12 @@ public class ArchiveTreeContractSyncImpl {
         //文件大小
         archiveFile.setFileSize(query.getEVisaPdfSize());
 
-        if (query.getEVisaPdfSize() < 0L ) {
+        if (query.getEVisaPdfSize()!= null && query.getEVisaPdfSize() < 0L ) {
             archiveFile.setFileSize(0L);
         }else {
             archiveFile.setFileSize(query.getEVisaPdfSize());
         }
-        if (query.getEVisaPdfPage() < 0 ) {
+        if (query.getEVisaPdfPage()!= null && query.getEVisaPdfPage() < 0 ) {
             archiveFile.setFilePage(0);
         }else {
             archiveFile.setFilePage(query.getEVisaPdfPage());

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

@@ -1274,7 +1274,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         String querySql = "select * from " + wbsTreeContract.getInitTableName() + " where p_key_id=" + pkeyId;
 
 
-        /*String querySql = "select * from table_data_info where p_key_id=" + pkeyId;*/
+        //String querySql = "select * from table_data_info where p_key_id=" + pkeyId;
         List<Map<String, Object>> dataIn = jdbcTemplate.queryForList(querySql);
 
         // 匹配关联
@@ -1406,11 +1406,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             e.printStackTrace();
         }
 
-        if (dataIn != null && dataIn.size() >= 1) {
+       /* if (dataIn != null && dataIn.size() >= 1) {
             for (Map<String, Object>  data : dataIn) {
                 reData.put(data.get("tab_key")+"",data.get("key_val"));
             }
-        }
+        }*/
 
         if (dataIn != null && dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);

+ 104 - 97
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -83,6 +83,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     private final Map<String, List<WbsTreeContractLazyVO>> localCacheNodes = new ConcurrentHashMap<>();
     //存储当前合同段contractId_tableOwner对应的资料查询信息
     private final Map<String, List<WbsTreeContractLazyQueryInfoVO>> localCacheQueryInfos = new ConcurrentHashMap<>();
+    //存储当前合同段contractId_tableOwner对应的节点数量统计缓存信息
+    private final Map<String, List<WbsTreeContractLazyVO>> localCacheParentCountNodes = new ConcurrentHashMap<>();
 
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
@@ -760,15 +762,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         //填报过的所有最底层节点
                         List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.parallelStream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
                         List<Long> lowestNodeParentIdsTB = lowestNodesTB.parallelStream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toList());
-                        List<WbsTreeContractLazyVO> resultParentNodesTB = new ArrayList<>();
-
-                        long startTime2 = System.currentTimeMillis();
-
-                        this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
-
-                        long endTime2 = System.currentTimeMillis();
-                        long executionTime2 = endTime2 - startTime2;
-                        logger.info("recursiveGetParentNodes 处理数量 执行时间:" + executionTime2 + " ms");
+                        //获取本地缓存节点数量统计
+                        List<WbsTreeContractLazyVO> resultParentNodesTB = this.getCachedParentCountNodes(contractId, lowestNodeParentIdsTB, nodesAll, tableOwner);
 
                         //最底层节点颜色构造后Map
                         Map<Long, WbsTreeContractLazyVO> lowestNodesMap = lowestNodesTB.stream()
@@ -784,9 +779,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     }
                                 }).collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, Function.identity()));
 
-                        long startTime3 = System.currentTimeMillis();
-
                         /*处理颜色*/
+                        long startTime = System.currentTimeMillis();
                         //先将WbsTreeContractLazyVO转为NodeVO
                         List<NodeVO> nodeVOList = distinctNodesAll.stream().map(this::convertToNodeVO).collect(Collectors.toList());
                         //转为Map<Long, NodeVO>
@@ -799,10 +793,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         List<NodeVO> nodeVOS = this.flattenTree(treeNodeVOList);
                         //获取所有节点颜色Map
                         Map<Long, Integer> nodeColorStatusMap = nodeVOS.stream().collect(Collectors.toMap(NodeVO::getPKeyId, NodeVO::getStatus, (existing, replacement) -> existing));
-
-                        long endTime3 = System.currentTimeMillis();
-                        long executionTime3 = endTime3 - startTime3;
-                        logger.info("处理颜色执行时间:" + executionTime3 + " ms");
+                        long endTime = System.currentTimeMillis();
+                        long executionTime = endTime - startTime;
+                        logger.info("处理颜色执行时间:" + executionTime + " ms");
 
                         /*处理最终结果集*/
                         if (lazyNodes.size() > 0) {
@@ -890,8 +883,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
                                 List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.parallelStream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
                                 List<Long> lowestNodeParentIdsTB = lowestNodesTB.parallelStream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toList());
-                                List<WbsTreeContractLazyVO> resultParentNodesTB = new ArrayList<>();
-                                this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
+
+                                List<WbsTreeContractLazyVO> resultParentNodesTB = this.getCachedParentCountNodes(sgContractId, lowestNodeParentIdsTB, nodesAll, tableOwner);
 
                                 Map<Long, WbsTreeContractLazyVO> lowestNodesMap = lowestNodesTB.stream()
                                         .peek(vo -> {
@@ -960,30 +953,32 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
-    //获取当前合同段所有节点缓存
+
+    /**
+     * 获取当前合同段所有节点缓存
+     *
+     * @param contractId
+     * @return
+     */
     public List<WbsTreeContractLazyVO> getNodeAll(String contractId) {
-        /*获取本地缓存*/
+        //获取本地缓存
         List<WbsTreeContractLazyVO> nodesAll = localCacheNodes.get(contractId);
 
         if (nodesAll == null || nodesAll.size() == 0) {
-
-            //获取当前合同段所有缓存节点信息
+            //从Redis获取数据
             Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + contractId);
             if (data != null) {
-                //从Redis获取数据
                 nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
-                /*更新本地缓存*/
+                //更新本地缓存
                 localCacheNodes.put(contractId, nodesAll);
 
             } else {
-
-                long startTime1 = System.currentTimeMillis();
-
+                //返回数据库数据
+                long startTime = System.currentTimeMillis();
                 nodesAll = jdbcTemplate.query("select a.p_key_id,a.id,a.parent_id from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
-
-                long endTime1 = System.currentTimeMillis();
-                long executionTime1 = endTime1 - startTime1;
-                logger.info("查询合同段" + contractId + "所有树执行时间:" + executionTime1 + " ms");
+                long endTime = System.currentTimeMillis();
+                long executionTime = endTime - startTime;
+                logger.info("查询合同段 " + contractId + " 所有树执行时间:" + executionTime + " ms");
 
                 if (nodesAll.size() > 0) {
                     //判断是否有子级,赋值
@@ -999,18 +994,72 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             vo.setHasChildren(0);
                         }
                     }
-                    /*更新本地缓存*/
-                    localCacheNodes.put(contractId, nodesAll);
-
+                    //存储到Redis中
                     JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + contractId, JSON.toJSON(array).toString());
+
+                    //更新本地缓存
+                    localCacheNodes.put(contractId, nodesAll);
                 }
             }
         }
         return nodesAll;
     }
 
-    //获取当前合同段所有填报资料缓存信息
+
+    /**
+     * 获取节点数量统计缓存
+     *
+     * @param contractId
+     * @param lowestNodeParentIdsTB
+     * @param nodesAll
+     * @return
+     */
+    public List<WbsTreeContractLazyVO> getCachedParentCountNodes(String contractId, List<Long> lowestNodeParentIdsTB, List<WbsTreeContractLazyVO> nodesAll, String tableOwner) {
+        //从本地缓存获取数据
+        String cacheKey = contractId + "_" + tableOwner;
+        List<WbsTreeContractLazyVO> resultParentNodesTB = localCacheParentCountNodes.get(cacheKey);
+
+        if (resultParentNodesTB == null || resultParentNodesTB.isEmpty()) {
+
+            //从Redis获取数据
+            Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byParentCountNodes:" + cacheKey);
+            if (data != null) {
+                resultParentNodesTB = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
+                //更新本地缓存
+                localCacheParentCountNodes.put(cacheKey, resultParentNodesTB);
+
+            } else {
+                /*重新计算,进行递归获取父节点计数统计*/
+                resultParentNodesTB = new ArrayList<>();
+                long startTime = System.currentTimeMillis();
+                this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
+                long endTime = System.currentTimeMillis();
+                long executionTime = endTime - startTime;
+                logger.info("节点树数量统计计算耗时:" + executionTime + " ms");
+
+                if (resultParentNodesTB.size() > 0) {
+                    //存储到Redis中
+                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(resultParentNodesTB));
+                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byParentCountNodes:" + cacheKey, JSON.toJSON(array).toString());
+
+                    //更新本地缓存
+                    localCacheParentCountNodes.put(cacheKey, resultParentNodesTB);
+                }
+            }
+        }
+
+        return resultParentNodesTB;
+    }
+
+
+    /**
+     * 获取当前合同段所有填报资料缓存信息
+     *
+     * @param contractId
+     * @param tableOwner
+     * @return
+     */
     public List<WbsTreeContractLazyQueryInfoVO> getQueryInfoList(String contractId, String tableOwner) {
         //从本地缓存获取
         String cacheKey = contractId + "_" + tableOwner;
@@ -1020,27 +1069,28 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             return cachedQueryInfoList;
         }
 
-        //获取redis缓存
+        //从Redis获取数据
         Object dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + cacheKey);
 
         List<WbsTreeContractLazyQueryInfoVO> queryInfoList;
         if (dataInformationQuery != null) {
-            //返回redis数据
             queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
-
             //更新本地缓存
             localCacheQueryInfos.put(cacheKey, queryInfoList);
 
         } else {
             //返回数据库数据
+            long startTime = System.currentTimeMillis();
             String querySql = "select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId + " and classify = " + tableOwner;
-
             queryInfoList = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+            long endTime = System.currentTimeMillis();
+            long executionTime = endTime - startTime;
+            logger.info("合同段资料信息查询耗时:" + executionTime + " ms");
 
             if (!queryInfoList.isEmpty()) {
                 JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
 
-                //存储redis
+                //存储到Redis中
                 redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + cacheKey, JSON.toJSON(array).toString());
 
                 //更新本地缓存
@@ -1429,8 +1479,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param lowestNodeParentIds 最底层节点ParentIds
      * @param nodesAll            所有节点
      */
-    public void recursiveGetParentNodes
-    (List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
+    public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
         if (lowestNodeParentIds.isEmpty()) {
             return;
         }
@@ -1467,58 +1516,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
     }
 
-    /*public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
-        if (lowestNodeParentIds.isEmpty()) {
-            return;
-        }
-
-        //父级Id与出现的次数Map
-        Map<Long, Long> parentIdGroup = lowestNodeParentIds.parallelStream()
-                .collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting()));
-
-        Set<Long> keysWithValueOne = new HashSet<>(); //单次
-        Map<Long, Long> keysWithValueSome = new ConcurrentHashMap<>(); //多次
-
-        parentIdGroup.forEach((key, value) -> {
-            if (value == 1L) {
-                keysWithValueOne.add(key);
-            } else {
-                keysWithValueSome.put(key, value);
-            }
-        });
-
-        //批量查询单次节点
-        List<WbsTreeContractLazyVO> parentNodes = new ArrayList<>();
-        if (!keysWithValueOne.isEmpty()) {
-            parentNodes = nodesAll.parallelStream()
-                    .filter(f -> keysWithValueOne.contains(f.getId()))
-                    .collect(Collectors.toList());
-        }
-
-        //批量查询多次节点
-        List<WbsTreeContractLazyVO> multipleParentNodes = new ArrayList<>();
-        keysWithValueSome.forEach((key, count) -> {
-            List<WbsTreeContractLazyVO> nodes = nodesAll.parallelStream()
-                    .filter(f -> key.equals(f.getId()))
-                    .limit(1)  //限制只取一个
-                    .collect(Collectors.toList());
-            if (!nodes.isEmpty()) {
-                multipleParentNodes.addAll(Collections.nCopies(count.intValue(), nodes.get(0)));
-            }
-        });
-
-        //结果集
-        List<Long> collect = Stream.concat(parentNodes.stream(), multipleParentNodes.stream())
-                .map(WbsTreeContractLazyVO::getParentId)
-                .collect(Collectors.toList());
-
-        if (!collect.isEmpty()) {
-            result.addAll(parentNodes);
-            result.addAll(multipleParentNodes);
-            this.recursiveGetParentNodes(result, collect, nodesAll);
-        }
-    }*/
-
     @Override
     public boolean syncTabData(String pKeyId) throws Exception {
         WbsTreeContract node = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
@@ -2662,12 +2659,22 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         localCacheNodes.remove(contractId);
 
         /*删除资料缓存*/
-        Iterator<Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>>> iterator = localCacheQueryInfos.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>> entry = iterator.next();
+        Iterator<Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>>> iterator_1 = localCacheQueryInfos.entrySet().iterator();
+        while (iterator_1.hasNext()) {
+            Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>> entry = iterator_1.next();
+            String cacheKey = entry.getKey();
+            if (cacheKey.startsWith(contractId + "_")) {
+                iterator_1.remove();
+            }
+        }
+
+        /*删除节点计算统计缓存*/
+        Iterator<Map.Entry<String, List<WbsTreeContractLazyVO>>> iterator_2 = localCacheParentCountNodes.entrySet().iterator();
+        while (iterator_2.hasNext()) {
+            Map.Entry<String, List<WbsTreeContractLazyVO>> entry = iterator_2.next();
             String cacheKey = entry.getKey();
             if (cacheKey.startsWith(contractId + "_")) {
-                iterator.remove();
+                iterator_2.remove();
             }
         }
     }

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

@@ -421,7 +421,7 @@ public class FileUtils {
         if (SystemUtils.isMacOs()) {
             file_path = "/Users/hongchuangyanfa/Desktop/";
         } else if (SystemUtils.isWindows()) {
-            file_path = "C://upload";
+            file_path = "C://upload//";
         }
         return file_path;
     }

+ 13 - 2
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -31,6 +31,7 @@ import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.WbsTableOwnerRole;
 import org.springblade.manager.vo.WbsTableOwnerRoleVO;
 import org.springblade.system.dto.RoleDTO;
@@ -328,6 +329,12 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         if (aLong > 0) {
             throw new ServiceException("角色名已存在,请重新输入");
         }
+        if (ObjectUtil.isNotEmpty(role.getId())) {
+            Role roleNow = baseMapper.selectById(role.getId());
+            if (roleNow != null && roleNow.getRoleName().equals("超级管理员") && roleNow.getRoleAlias().equals("administrator")) {
+                throw new ServiceException("没有权限,超级管理员信息无法更改!");
+            }
+        }
         return saveOrUpdate(role);
     }
 
@@ -356,8 +363,12 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         if (cnt > 0L) {
             throw new ServiceException("请先删除子节点!");
         }
-        boolean b = removeByIds(Func.toLongList(ids));
-        return b;
+        List<Role> roles = baseMapper.selectList(Wrappers.<Role>query().lambda().select(Role::getRoleName, Role::getRoleAlias).in(Role::getId, Func.toLongList(ids)));
+        List<Role> collect = roles.stream().filter(f -> f.getRoleName().equals("超级管理员") && f.getRoleAlias().equals("administrator")).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            throw new ServiceException("没有权限,超级管理员无法删除!");
+        }
+        return removeByIds(Func.toLongList(ids));
     }
 
     @Override