소스 검색

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 년 전
부모
커밋
9844c69267
69개의 변경된 파일1196개의 추가작업 그리고 430개의 파일을 삭제
  1. 4 0
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 24 0
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java
  4. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DepartmentMonthPlanVO.java
  5. 4 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoVO.java
  6. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetStatsVO.java
  7. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java
  8. 17 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanOverdueStatusVO.java
  9. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProjectCostBudgetVO.java
  10. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  11. 4 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/enums/UserEnum.java
  12. 2 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  13. 4 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  14. 8 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  15. 171 29
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  16. 91 22
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileTransJavaDemo.java
  17. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  18. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  19. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  20. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  21. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java
  22. 22 9
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java
  23. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java
  24. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  25. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java
  26. 23 10
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  27. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml
  28. 6 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  29. 5 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml
  30. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  31. 32 6
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  32. 6 4
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetStatsMapper.xml
  33. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  34. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  35. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  36. 41 12
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  37. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  38. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java
  39. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  40. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  41. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java
  42. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  43. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  44. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  45. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  46. 5 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java
  47. 175 58
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  48. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  49. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java
  50. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  51. 73 33
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  52. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  53. 30 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  54. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  55. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java
  56. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  57. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  58. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  59. 79 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  60. 45 35
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  61. 45 38
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  62. 0 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java
  63. 2 0
      blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java
  64. 0 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java
  65. 1 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java
  66. 10 3
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml
  67. 139 111
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java
  68. 2 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  69. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 4 - 0
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -117,7 +117,11 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
             result = userClient.userInfo(tenantId, username, UserEnum.ARCHIVES.getName()); //档案
         } else if (userType.equals(UserEnum.MANAGER.getName())) {
             result = userClient.userInfo(tenantId, username, UserEnum.MANAGER.getName());  //后管
+        } else if (userType.equals(UserEnum.HAC.getName())) {
+            result = userClient.userInfo(tenantId, username, UserEnum.HAC.getName());  //后管
         }
+
+
         //TODO
 
         // 判断返回信息

+ 24 - 0
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -15,6 +15,8 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author yangyj
@@ -74,6 +76,14 @@ public class BaseUtils {
         return false;
     }
 
+
+    /**
+     * @Description  判断对象是否为数值
+     * @Param [value]
+     * @return boolean
+     * @Author yangyj
+     * @Date 2023.01.17 13:48
+     **/
     public static boolean isNumber(Object value) {
         if ((value == null) || value.toString().trim().length() == 0) {
             return false;
@@ -87,4 +97,18 @@ public class BaseUtils {
         return m.matches();
     }
 
+    /**
+     * @Description  根据指定大小对LIST进行切分
+     * @Param [list, chunkSize:每一段长度]
+     * @return java.util.List<java.util.List<T>>
+     * @Author yangyj
+     * @Date 2023.07.03 13:46
+     **/
+    public static <T> List<List<T>> splitList(List<T> list, int chunkSize) {
+        return IntStream.range(0, (list.size() + chunkSize - 1) / chunkSize)
+                .mapToObj(i -> list.subList(i * chunkSize, Math.min((i + 1) * chunkSize, list.size())))
+                .collect(Collectors.toList());
+    }
+
+
 }

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java

@@ -127,7 +127,7 @@ public class InformationQuery extends BaseEntity {
 
 
     @ApiModelProperty("业务时间")
-    private String BusinessTime;
+    private String businessTime;
 
     @ApiModelProperty("电签文件大小,单位K")
     private Long eVisaPdfSize;

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DepartmentMonthPlanVO.java

@@ -30,4 +30,7 @@ public class DepartmentMonthPlanVO extends DepartmentMonthPlan {
     @ApiModelProperty(value = "未完成计划")
     private Integer beginPlanTotal;
 
+    @ApiModelProperty(value = "计划制定人名称")
+    private String planDesignerName;
+
 }

+ 4 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoVO.java

@@ -18,7 +18,10 @@ public class LogHistoryInfoVO extends LogHistoryInfo {
     @ApiModelProperty(value = "已读状态 0=未读 1=已读")
     private Integer isRead;
 
-   @ApiModelProperty(value = "当前日志关联的任务信息List")
+    @ApiModelProperty(value = "已读状态 0=否 1=是")
+    private Integer isEdit;
+
+    @ApiModelProperty(value = "当前日志关联的任务信息List")
     private List<TaskPlanInfoVO> taskList;
 
     @ApiModelProperty(value = "当前日志所有已读人")

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetStatsVO.java

@@ -37,4 +37,7 @@ public class ProjectCostBudgetStatsVO extends ProjectCostBudgetStats {
 
     @ApiModelProperty(value = "建设单位预算集合")
     private List<ProjectCostBudget> constructUnit;
+
+    @ApiModelProperty(value = "1显示提交审批,0不显示")
+    private String approveStatus;
 }

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java

@@ -25,6 +25,9 @@ public class TaskPlanInfoVO implements Serializable {
     @ApiModelProperty(value = "计划状态")
     private Integer status;
 
+    @ApiModelProperty(value = "是否逾期 1=是")
+    private Integer isOverdue;
+
     @ApiModelProperty(value = "计划任务描述(任务内容)")
     private String taskDesc;
 

+ 17 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanOverdueStatusVO.java

@@ -0,0 +1,17 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName(value = "c_task_plan_overdue_status")
+public class TaskPlanOverdueStatusVO implements Serializable {
+
+    private Long id;
+    private Long userId;
+    private Long planTaskId;
+    private Integer isOverdue;
+
+}

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProjectCostBudgetVO.java

@@ -1,17 +0,0 @@
-package org.springblade.control.vo;
-
-import lombok.Data;
-import org.springblade.control.entity.ProjectCostBudget;
-import org.springblade.control.entity.ProjectCostBudgetStats;
-
-import java.io.Serializable;
-import java.util.List;
-
-@Data
-public class TaskProjectCostBudgetVO implements Serializable {
-
-    private ProjectCostBudgetStats projectCostBudgetStats;
-
-    private List<ProjectCostBudget> projectCostBudgetList;
-
-}

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

@@ -175,6 +175,6 @@ public interface WbsTreeContractClient {
     void updateTabFileTypeByPkeyIds(@RequestParam List<Long> updatePKeyIds);
 
     @GetMapping(API_PREFIX + "/getNextPkeyIdByNodeType")
-    Long getNextPkeyIdByNodeType(@RequestParam Long pkeyId, @RequestParam Long nodeType);
+    Long getNextPkeyIdByNodeType(@RequestParam Long pkeyId, @RequestParam Integer nodeType);
 
 }

+ 4 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/enums/UserEnum.java

@@ -49,6 +49,10 @@ public enum UserEnum {
      */
     MANAGER("saber", 4),
 
+    /**
+     * 内控系统
+     */
+    HAC("hac", 5),
     ;
 
     final String name;

+ 2 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java

@@ -45,7 +45,8 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @RequestMapping("/archiveFileAuto")
 @Api(value = "案卷收集接口", tags = "案卷收集接口")
-public class ArchiveFileAutoController extends BladeController {
+public class
+ArchiveFileAutoController extends BladeController {
 
     private final ArchiveFileClient archiveFileClient;
     private final IOSSClient iossClient;

+ 4 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -366,7 +366,10 @@ public class ArchiveFileController extends BladeController {
     @ApiOperation(value = "文件收集-上传文件责任者")
     public R getDutyUser(Long contractId, Long projectId) {
         ContractInfo contractById = null;
-        if (contractId == -1) {
+        if (contractId == null || contractId == -1) {
+            if(projectId == null || projectId == -1){
+                return R.data(null);
+            }
             List<Long> longs = new ArrayList<>();
             longs.add(projectId);
             List<ContractInfo> contractInfos = contractClient.queryContractListByIds(longs);
@@ -378,7 +381,6 @@ public class ArchiveFileController extends BladeController {
             }
         } else {
             contractById = contractClient.getContractById(contractId);
-
         }
         return R.data(contractById);
     }

+ 8 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -474,7 +474,10 @@
     <select id="pageByArchivesAuto11" resultMap="archivesAutoResultMap">
         select uaa.*
         from m_archive_tree_contract matc left join u_archives_auto uaa on matc.id = uaa.node_id
-        where uaa.is_deleted = 0 and uaa.is_archive = 1 and uaa.name like concat('%',#{vo.queryValue},'%')
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%') or uaa.file_number like concat('%',#{vo.queryValue},'%')
+        </if>
         <if test="vo.projectId != null and vo.projectId != ''">
             and matc.project_id = #{vo.projectId}
         </if>
@@ -576,7 +579,10 @@
             or ancestors like concat('%',#{nodeId},'%') or id = #{nodeId}
         </foreach>
         ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
-        where uaa.is_deleted = 0 and uaa.is_archive = 1 and uaa.name like concat('%',#{vo.queryValue},'%')
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%') or uaa.file_number like concat('%',#{vo.queryValue},'%')
+        </if>
         <if test="vo.contractId != null and vo.contractId != ''">
             and uaa.contract_id = #{vo.contractId}
         </if>

+ 171 - 29
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -41,7 +41,10 @@ import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.business.feign.MetadataClassificationClient;
+import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.IDUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -51,6 +54,7 @@ import org.springblade.core.oss.model.BladeFile;
 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.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -111,6 +115,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final IArchiveProjectConfigService archiveProjectConfigService;
 
+	private final MetadataClassificationClient metadataClassificationClient;
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -1023,7 +1029,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		String projectName = projectInfo.getProjectName();
 		String contractName="";
 		Long contractId = node.getContractId();
-		if(contractId!=null){
+		if(contractId!=null && contractId != -1){
 			ContractInfo contract = contractClient.getContractById(contractId);
 			contractName=contract.getContractName();
 		}
@@ -1101,6 +1107,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 		}
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+		try {
+			for (ArchiveFile saveVo : waitArchiveFiles) {
+				metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -1148,6 +1161,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			file.setIsArchive(1);
 		}
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+		try {
+			for (ArchiveFile saveVo : waitArchiveFiles) {
+				metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	/**
@@ -1189,6 +1209,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			file.setIsArchive(1);
 		}
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+		try {
+			for (ArchiveFile saveVo : waitArchiveFiles) {
+				metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	private void createArchiveBox(String boxName,List<ArchiveFile> waitArchiveFiles){
@@ -1237,6 +1264,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			file.setIsArchive(1);
 		}
 		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
+		try {
+			for (ArchiveFile saveVo : waitArchiveFiles) {
+				metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 
@@ -2056,37 +2090,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 */
 	@Override
 	public R searchInfo(MultipartFile file) throws IOException {
-		JSONObject json = new JSONObject();
-		String fileUrl = FileUtils.getSysLocalFileUrl();
-
-		File fileInfo = org.springblade.common.utils.FileUtils.convert(file);
-		BladeFile data = iossClient.updateFile(file.getBytes(), "testInfo.wav");
-		String token = "cc96fcdce38f49f1af2298a949d39800";
-		String appkey = "7T7TkowOxND01n1y";
-		//	SpeechRecognizerRESTfulDemo demo = new SpeechRecognizerRESTfulDemo(appkey, token);
-
-/*		String fileName = "/Users/hongchuangyanfa/Downloads/nls-sample-16k.wav" ;//SpeechRecognizerRESTfulDemo.class.getClassLoader().getResource("/Users/hongchuangyanfa/Downloads/nls-sample-16k.wav").getPath();
-		String format = "pcm";
-		int sampleRate = 16000;
-		boolean enablePunctuationPrediction = true;
-		boolean enableInverseTextNormalization = true;
-		boolean enableVoiceDetection = false;
-		String dataInfo = demo.process(fileInfo, format, sampleRate, enablePunctuationPrediction, enableInverseTextNormalization, enableVoiceDetection);
-	*/
-
-		//System.out.println("123");
-		//System.out.println(dataInfo);
-		//JSONObject json = new JSONObject();
-		//json.put("year","2023");
+		JSONObject jsonObject = new JSONObject();
 
 		final String accessKeyId = "LTAI5tMwtPCL85iXbUtjLTxD";
 		final String accessKeySecret = "WiUW5ag7HhQZPNoMAoQSC5LuxD2kLw";
 		final String appKey = "IxV21DxuzHuc8Oe4";
-		//  String fileUrl = FileUtils.getSysLocalFileUrl()+"/voiceInfo/123456.wav";
 
+		String fileName = "voiceInfo/" + UUID.randomUUID() + ".wav";
+		String localfileUrl = FileUtils.getSysLocalFileUrl() + fileName;
+		File localFile = new File(localfileUrl);
+		FileUtil.toFile(file, localFile);
+
+		String fileLink = "http://fileinfo.hczcxx.cn/" + fileName;
 
-		///String fileLink = "http://fileinfo.hczcxx.cn/voiceInfo/c574b9f3-f4fe-43db-abeb-5c5f24a15eb4.wav";
-		String fileLink = data.getLink();
 		FileTransJavaDemo demo = new FileTransJavaDemo(accessKeyId, accessKeySecret);
 		// 第一步:提交录音文件识别请求,获取任务ID用于后续的识别结果轮询。
 		String taskId = demo.submitFileTransRequest(appKey, fileLink);
@@ -2095,6 +2111,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		} else {
 			System.out.println("录音文件识别请求失败!");
 		}
+
 		// 第二步:根据任务ID轮询识别结果。
 		String result = demo.getFileTransResult(taskId);
 		if (result != null) {
@@ -2103,12 +2120,137 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			JSONArray word = dataInfo.getJSONArray("Words");
 			JSONArray sentences = dataInfo.getJSONArray("Sentences");
 
+			String sayInfo = sentences.getJSONObject(0).getString("Text");
+			if (sayInfo.indexOf("查询") >= 0 || sayInfo.indexOf("搜索") >= 0 || sayInfo.indexOf("检索") >= 0) {
+				int num1 = sayInfo.lastIndexOf("查询") + 2;
+				int num2 = sayInfo.lastIndexOf("搜索") + 2;
+				int num3 = sayInfo.lastIndexOf("检索") + 2;
+				int max = num1 > num2 ? num1 : num2;         //先求出前两个数中的最大值
+				max = max > num3 ? max : num3;          //将前一轮比较出的最大值与num3比较
+
+				int min = sayInfo.length();
+				if (sayInfo.indexOf("的档案") >= 0) {
+
+					min = sayInfo.indexOf("的档案");
+				} else if (sayInfo.indexOf("的数据") >= 0) {
+
+					min = sayInfo.indexOf("的数据");
+
+				} else if (sayInfo.indexOf("的文件") >= 0) {
+
+					min = sayInfo.indexOf("的文件");
+				}
+
+				if (max <= min) {
+					sayInfo = sayInfo.substring(max, min);
+				}
+
+				jsonObject.put("queryValue", sayInfo);
+				jsonObject.put("searchWord", sayInfo);
+			} else {
+				// 将中文 数字 转化为 阿拉伯 数字
+				if (sayInfo.indexOf("年") >= 0 || sayInfo.indexOf("月") >= 0) {
+					sayInfo = sayInfo.replaceAll("零", "0");
+					sayInfo = sayInfo.replaceAll("一", "1");
+					sayInfo = sayInfo.replaceAll("二", "2");
+					sayInfo = sayInfo.replaceAll("三", "3");
+					sayInfo = sayInfo.replaceAll("四", "4");
+					sayInfo = sayInfo.replaceAll("五", "5");
+					sayInfo = sayInfo.replaceAll("六", "6");
+					sayInfo = sayInfo.replaceAll("七", "7");
+					sayInfo = sayInfo.replaceAll("八", "8");
+					sayInfo = sayInfo.replaceAll("九", "9");
+				}
+				jsonObject.put("searchWord", sayInfo);
+				Map<String, String> keyInfo = new HashMap<>();
+				//类别
+				keyInfo.put("普通", "carrierType-1");
+				keyInfo.put("竣工图", "carrierType-2");
+				keyInfo.put("计量", "carrierType-3");
+				keyInfo.put("质检", "carrierType-4");
+				keyInfo.put("声像", "carrierType-5");
+				keyInfo.put("隐蔽", "carrierType-6");
+				keyInfo.put("原材试验", "carrierType-7");
+				keyInfo.put("管理文件", "carrierType-8");
+				keyInfo.put("变更令", "carrierType-9");
+
+				//年度
+				for (int i = 2016; i <= 2036; i++) {
+					keyInfo.put(i + "年", "year-" + i);
+				}
+
+				//月
+				for (int i = 1; i <= 12; i++) {
+					keyInfo.put(i + "月", "month-" + i);
+				}
+
+				//期限 永久 30年 10年
+				keyInfo.put("永久", "storageTime-3");
+				keyInfo.put("30年", "storageTime-2");
+				keyInfo.put("10年", "storageTime-1");
+
+				//密级有
+				keyInfo.put("机密", "secretLevel-1");
+				keyInfo.put("绝密", "secretLevel-2");
+				keyInfo.put("秘密", "secretLevel-3");
+				keyInfo.put("公开", "secretLevel-4");
+
+				for (String keyd : keyInfo.keySet()) {
+					if (sayInfo.contains(keyd)) {
+						String keyWord = keyInfo.get(keyd);
+						String keys[] = keyWord.split("-");
+						if (jsonObject.containsKey(keys[0])) {
+							String newVal = jsonObject.getString(keys[0]) + "," + keys[1];
+							jsonObject.put(keys[0], newVal);
+						} else {
+							jsonObject.put(keys[0], keys[1]);
+						}
+					}
+				}
+			}
 		} else {
-			System.out.println("录音文件识别结果查询失败!");
+			jsonObject.put("searchWord", "录音文件识别结果查询失败");
 		}
 
-		return R.data(json);
-	}
+		if (localFile.exists()) {
+			localFile.delete();
+		}
 
+		// 最后处理方案
+		//永久
+		if (!jsonObject.containsKey("carrierType")) {
+			jsonObject.put("carrierType", "");
+		}
+		//年度
+		if (!jsonObject.containsKey("year")) {
+			jsonObject.put("year", "");
+		}
+		//月
+		if (!jsonObject.containsKey("month")) {
+			jsonObject.put("month", "");
+		}
+		//期限 永久
+		if (!jsonObject.containsKey("storageTime")) {
+			jsonObject.put("storageTime", "");
+		}
+		//密级有
+		if (!jsonObject.containsKey("secretLevel")) {
+			jsonObject.put("secretLevel", "");
+		}
+		// 文本框
+		//密级有
+		if (!jsonObject.containsKey("queryValue")) {
+			jsonObject.put("queryValue", "");
+		}
+		//节点
+		if (!jsonObject.containsKey("nodeIds")) {
+			jsonObject.put("nodeIds", "");
+		}
 
+		//语音文字
+		if (!jsonObject.containsKey("searchWord")) {
+			jsonObject.put("searchWord", "");
+		}
+		return R.data(jsonObject);
+	}
 }

+ 91 - 22
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileTransJavaDemo.java

@@ -8,7 +8,11 @@ import com.aliyuncs.IAcsClient;
 import com.aliyuncs.exceptions.ClientException;
 import com.aliyuncs.http.MethodType;
 import com.aliyuncs.profile.DefaultProfile;
-import org.springblade.common.utils.CommonUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class FileTransJavaDemo {
     // 地域ID,常量,固定值。
@@ -155,30 +159,95 @@ public class FileTransJavaDemo {
         return result;
     }
 
-    /*public static void main(String args[]) throws Exception {
+    public static void main11(String args[]) {
 
-        final String accessKeyId = "LTAI5tMwtPCL85iXbUtjLTxD";
-        final String accessKeySecret = "WiUW5ag7HhQZPNoMAoQSC5LuxD2kLw";
-        final String appKey = "IxV21DxuzHuc8Oe4";
-        //  String fileUrl = FileUtils.getSysLocalFileUrl()+"/voiceInfo/123456.wav";
+        String sayInfo = "搜索重庆渝北的档案。";
+        JSONObject jsonObject = new JSONObject();
+        //查询、搜索、检索、查看
+        if (sayInfo.indexOf("查询") >= 0 || sayInfo.indexOf("搜索") >= 0 || sayInfo.indexOf("检索") >= 0) {
+            System.out.println("123");
+            int num1 = sayInfo.lastIndexOf("查询") + 2;
+            int num2 = sayInfo.lastIndexOf("搜索") + 2;
+            int num3 = sayInfo.lastIndexOf("检索") + 2;
+            int max = num1 > num2 ? num1 : num2;         //先求出前两个数中的最大值
+            max = max > num3 ? max : num3;          //将前一轮比较出的最大值与num3比较
 
+            int min = sayInfo.length();
+            if (sayInfo.indexOf("的档案") >= 0) {
+                min = sayInfo.indexOf("的档案");
+            } else if (sayInfo.indexOf("的数据") >= 0) {
+                min = sayInfo.indexOf("的数据");
+            } else if (sayInfo.indexOf("的文件") >= 0) {
+                min = sayInfo.indexOf("的文件");
+            }
+
+            if (max <= min) {
+                sayInfo = sayInfo.substring(max, min);
+            }
+            System.out.println(sayInfo);
 
-        String fileLink = "http://fileinfo.hczcxx.cn/voiceInfo/录音 (1).wav";
-        FileTransJavaDemo demo = new FileTransJavaDemo(accessKeyId, accessKeySecret);
-        // 第一步:提交录音文件识别请求,获取任务ID用于后续的识别结果轮询。
-        String taskId = demo.submitFileTransRequest(appKey, fileLink);
-        if (taskId != null) {
-            System.out.println("录音文件识别请求成功,task_id: " + taskId);
-        } else {
-            System.out.println("录音文件识别请求失败!");
-            return;
-        }
-        // 第二步:根据任务ID轮询识别结果。
-        String result = demo.getFileTransResult(taskId);
-        if (result != null) {
-            System.out.println("录音文件识别结果查询成功:" + result);
         } else {
-            System.out.println("录音文件识别结果查询失败!");
+            if (sayInfo.indexOf("年") >= 0 || sayInfo.indexOf("月") >= 0) {
+                sayInfo = sayInfo.replaceAll("零", "0");
+                sayInfo = sayInfo.replaceAll("一", "1");
+                sayInfo = sayInfo.replaceAll("二", "2");
+                sayInfo = sayInfo.replaceAll("三", "3");
+                sayInfo = sayInfo.replaceAll("四", "4");
+                sayInfo = sayInfo.replaceAll("五", "5");
+                sayInfo = sayInfo.replaceAll("六", "6");
+                sayInfo = sayInfo.replaceAll("七", "7");
+                sayInfo = sayInfo.replaceAll("八", "8");
+                sayInfo = sayInfo.replaceAll("九", "9");
+                sayInfo = sayInfo.replaceAll("十年", "10年");
+                sayInfo = sayInfo.replaceAll("三十年", "30年");
+            }
+
+            Map<String, String> keyInfo = new HashMap<>();
+            //类别
+            keyInfo.put("普通", "carrierType-1");
+            keyInfo.put("竣工图", "carrierType-2");
+            keyInfo.put("计量", "carrierType-3");
+            keyInfo.put("质检", "carrierType-4");
+            keyInfo.put("声像", "carrierType-5");
+            keyInfo.put("隐蔽", "carrierType-6");
+            keyInfo.put("原材试验", "carrierType-7");
+            keyInfo.put("管理文件", "carrierType-8");
+            keyInfo.put("变更令", "carrierType-9");
+
+            //年度
+            for (int i = 2016; i <= 2036; i++) {
+                keyInfo.put(i + "年", "year-" + i);
+            }
+
+            //月
+            for (int i = 1; i <= 12; i++) {
+                keyInfo.put(i + "月", "month-" + i);
+            }
+
+            //期限 永久
+            keyInfo.put("永久", "storageTime-3");
+            keyInfo.put("30年", "storageTime-2");
+            keyInfo.put("10年", "storageTime-1");
+
+            //密级有
+            keyInfo.put("机密", "secretLevel-1");
+            keyInfo.put("绝密", "carrierType-2");
+            keyInfo.put("秘密", "carrierType-3");
+            keyInfo.put("公开", "carrierType-4");
+
+            for (String keyd : keyInfo.keySet()) {
+                if (sayInfo.contains(keyd)) {
+                    String keyWord = keyInfo.get(keyd);
+                    String keys[] = keyWord.split("-");
+                    if (jsonObject.containsKey(keys[0])) {
+                        String newVal = jsonObject.getString(keys[0]) + "," + keys[1];
+                        jsonObject.put(keys[0], newVal);
+                    } else {
+                        jsonObject.put(keys[0], keys[1]);
+                    }
+                }
+            }
         }
-    }*/
+        System.out.println(jsonObject);
+    }
 }

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

@@ -715,7 +715,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;
     }

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

@@ -3224,7 +3224,7 @@ public class InformationWriteQueryController extends BladeController {
             node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(vo.getWbsId(), Long.parseLong(vo.getContractIdRelation()));
         }
         List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
-        if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())) {
+        if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType() + "")) {
             //不是工序,则查询当前节点下的所有填报节点
             if (node.getParentId() == 0) {
                 queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());

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

@@ -36,7 +36,7 @@
         <result column="sort" property="sort"/>
         <result column="pdf_trial_url" property="pdfTrialUrl"/>
         <result column="pdf_trial_url_position" property="pdfTrialUrlPosition"/>
-        <result column="business_time" property="BusinessTime"/>
+       <result column="business_time" property="businessTime"/>
         <result column="e_visa_pdf_page" property="eVisaPdfPage"/>
         <result column="e_visa_pdf_size" property="eVisaPdfSize"/>
     </resultMap>

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -1017,6 +1017,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         //TODO 文件题名规则,待补充
         fillFileNameAndTime(archiveFile,query);
 
+        archiveFile.setProjectId(query.getProjectId() == null?"":query.getProjectId().toString());
         archiveFile.setSourceType(1);
 
         //责任人怎么取

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java

@@ -41,7 +41,7 @@ public class AttendanceManagerController extends BladeController {
 
     @GetMapping("/trip/draft/detail")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "财务报销草稿箱编辑详情", notes = "传入当前草稿的eMDraftIds")
+    @ApiOperation(value = "出差信息草稿箱编辑详情", notes = "传入当前草稿的eMDraftIds")
     public R<List<AttendanceTripInfoVO>> financialDraftDetail(@RequestParam String eMDraftIds) {
         return R.data(attendanceTripService.financialDraftDetail(eMDraftIds));
     }

+ 22 - 9
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java

@@ -10,10 +10,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.business.vo.TrialContainerClassificationVO;
 import org.springblade.control.entity.*;
-import org.springblade.control.service.impl.ContractReturnedInfoServiceImpl;
-import org.springblade.control.service.impl.EMLoanServiceImpl;
-import org.springblade.control.service.impl.ProjectCostBudgetServiceImpl;
-import org.springblade.control.service.impl.ProjectInfoServiceImpl;
+import org.springblade.control.service.impl.*;
 import org.springblade.control.utils.NumberToChinese;
 import org.springblade.control.vo.*;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -48,6 +45,7 @@ public class ExMaTwoController extends BladeController {
     private final ProjectCostBudgetServiceImpl projectCostBudgetService;
     private final EMLoanServiceImpl emLoanService;
     private final ContractReturnedInfoServiceImpl contractReturnedInfoService;
+    private final EMPurchaseServiceImpl emPurchaseService;
 
     @GetMapping("/project/list")
     @ApiOperationSupport(order = 1)
@@ -93,9 +91,9 @@ public class ExMaTwoController extends BladeController {
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "获取我的借款列表")
     public R<List<ExMaByLoanVO>> getLoanList() {
-        /*if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("未获取到当前用户信息,请联系管理员");
-        }*/
+        }
         LambdaQueryWrapper<EMLoanInfo> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(EMLoanInfo::getIsTemp, 1); //已提交
         queryWrapper.eq(EMLoanInfo::getStatus, 2); //已审批
@@ -150,9 +148,12 @@ public class ExMaTwoController extends BladeController {
 
     @GetMapping("/getUserList")
     @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "获取管控系统用户列表", notes = "(财务报销-归属人、发票管理-开票人、支付-申请人)")
+    @ApiOperation(value = "获取管控系统用户列表", notes = "(财务报销-归属人、发票管理-开票人、支付-申请人、日志-选择人员)")
     public R<List<UserControlVO>> getUserList() {
-        List<User> query = jdbcTemplate.query("select id,name,real_name from blade_user where tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        List<User> query = jdbcTemplate.query("select id,name,real_name from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
         List<UserControlVO> result = new ArrayList<>();
         for (User user : query) {
             UserControlVO vo = new UserControlVO();
@@ -189,7 +190,10 @@ public class ExMaTwoController extends BladeController {
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "获取用车部门列表")
     public R<List<UseCarDeptVO>> getUseCarDeptList() {
-        List<Dept> query = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = 003077 and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        List<Dept> query = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
         List<UseCarDeptVO> result = new ArrayList<>();
         if (query.size() > 0) {
             for (Dept dept : query) {
@@ -263,4 +267,13 @@ public class ExMaTwoController extends BladeController {
         return R.data(result);
     }
 
+    @GetMapping("/getUseOrgNameList")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "获取采购使用单位列表")
+    public R<List<String>> getUseOrgNameList() {
+        List<EMPurchaseInfo> emPurchaseInfos = emPurchaseService.getBaseMapper().selectList(Wrappers.<EMPurchaseInfo>lambdaQuery().select(EMPurchaseInfo::getUseOrgName).eq(EMPurchaseInfo::getIsTemp, 1));
+        List<String> collect = emPurchaseInfos.stream().map(EMPurchaseInfo::getUseOrgName).collect(Collectors.toList());
+        return R.data(collect);
+    }
+
 }

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java

@@ -54,7 +54,7 @@ public class LogHistoryController extends BladeController {
 
     @PostMapping("/task/complete")
     @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "日志任务完成", notes = "传入日志logId、任务taskId")
+    @ApiOperation(value = "日志任务完成", notes = "传入日志logId(编辑时完成要传日志logId)、任务taskId")
     public R<Object> logTaskComplete(Long logId, @RequestParam Long taskId) {
         return R.status(logHistoryService.logTaskComplete(logId, taskId));
     }

+ 20 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
+import org.springblade.control.entity.DictInfo;
 import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.vo.*;
@@ -168,5 +169,24 @@ public class ProjectCostBudgetController {
         return R.data(budgetService.planFinishedRatio(deptId,userId,start,end));
     }
 
+    /**
+     * 查询预览-费用分类列表
+     */
+    @GetMapping("/getCostType")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "查询预览-费用分类列表")
+    public R<List<DictInfo>> getCostType(){
+        return R.data(budgetService.getCostType());
+    }
+
+    /**
+     * 查询预览-单位列表
+     */
+    @GetMapping("/getUnitType")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "查询预览-单位列表")
+    public R<List<DictInfo>> getUnitType(){
+        return R.data(budgetService.getUnitType());
+    }
 
 }

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -96,7 +96,7 @@ public class TaskProcessController extends BladeController {
     }
 
     @GetMapping("/cost/budget/submit")
-    @ApiOperationSupport(order = 9)
+    @ApiOperationSupport(order = 10)
     @ApiOperation(value = "项目成本测算审批提交", notes = "传入成本测算id")
     public R<Object> approveCostBudgetSubmit(@RequestParam String id) {
         return R.status(taskProcessService.approveCostBudgetSubmit(id));

+ 23 - 10
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml

@@ -21,18 +21,31 @@
                (select dict_name  from c_dict_info WHERE code = 'contract_type' AND dict_value= cci.contract_type) as contractTypeValue
         from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id
     </select>
+<!--    <select id="getReturnedByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetIncomeVO">-->
+<!--        SELECT-->
+<!--                (select name from c_control_project_info WHERE id = abi.project_id ) as projectName,-->
+<!--                (select dict_name  from c_dict_info WHERE code = 'project_income_type' AND dict_value = abi.income_type) as incomeTypeValue,-->
+<!--                abi.project_type_value ,-->
+<!--               abi.contract_type_value,-->
+<!--               cri.practical_returned_time as returnTime,-->
+<!--               cri.practical_returned_money as returnMoney-->
+<!--        FROM c_annual_budget_income abi left join c_contract_returned_info cri on abi.project_id = cri.project_id-->
+<!--        WHERE cri.practical_returned_time is not null and cri.practical_returned_money is not NULL-->
+<!--          AND abi.annual_budget_id = #{id}-->
+<!--    </select>-->
+
     <select id="getReturnedByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetIncomeVO">
-        SELECT
+        SELECT  abi.predict_contract_money,
                 (select name from c_control_project_info WHERE id = abi.project_id ) as projectName,
                 (select dict_name  from c_dict_info WHERE code = 'project_income_type' AND dict_value = abi.income_type) as incomeTypeValue,
                 abi.project_type_value ,
-               abi.contract_type_value,
-               cri.practical_returned_time as returnTime,
-               cri.practical_returned_money as returnMoney
-        FROM c_annual_budget_income abi left join c_contract_returned_info cri on abi.project_id = cri.project_id
-        WHERE cri.practical_returned_time is not null and cri.practical_returned_money is not NULL
-          AND abi.annual_budget_id = #{id}
+                abi.contract_type_value,
+                abi.predict_sign_date as returnTime,
+                abi.predict_annual_returned as returnMoney
+        FROM c_annual_budget_income abi
+        WHERE abi.annual_budget_id = #{id}
     </select>
+
     <select id="getDisburseByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetDisburseVO">
         select abd.*,
                (select dict_name  from c_dict_info WHERE `type` = 1 AND dict_value = abd.budget_subject AND parent_id = 0) as budgetSubjectValue,
@@ -43,11 +56,11 @@
     </select>
     <select id="getAllBudgetSubject" resultType="org.springblade.control.vo.DictInfoVO">
         select *
-        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id = 0 ORDER BY sort
+        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id = 0 and di.is_deleted = 0 ORDER BY sort
     </select>
     <select id="getAllSecondSubject" resultType="org.springblade.control.vo.DictInfoVO">
         select *
-        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id > 0
+        from c_dict_info di WHERE di.`type` = 1 AND di.is_deleted = 0 and di.parent_id > 0
     </select>
     <select id="getThisYearBudget" resultType="org.springblade.control.entity.AnnualBudget">
         select   <include refid="budget_column" />
@@ -61,7 +74,7 @@
     <select id="yearList" resultType="java.lang.Integer">
         select DATE_FORMAT(start_time,'%Y')
         from c_control_project_info cpi
-        WHERE is_deleted = 0 order by start_time
+        WHERE is_deleted = 0 and start_time is not null order by start_time
             limit 1
     </select>
 

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml

@@ -24,6 +24,9 @@
         (IFNULL(( select sum(cri.should_returned_money) from c_contract_returned_info cri where cri.should_returned_time &lt; NOW()  and cri.contract_id = ci.id and cri.is_deleted=0), 0) -
         IFNULL(( select sum(cri.practical_returned_money) from c_contract_returned_info cri where cri.contract_id = ci.id and cri.is_deleted=0), 0)) as unreturnedMoney
         from c_control_contract_info ci where ci.is_deleted = 0
+        <if test="dto.queryValue != null and dto.queryValue != ''">
+            and ci.name like concat('%', #{dto.queryValue}, '%')
+        </if>
     </select>
     <select id="getNoConnectionProject2" resultType="org.springblade.control.entity.ControlProjectInfo">
         select pi.id,pi.name from c_control_project_info pi WHERE pi.is_deleted = 0

+ 6 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -12,7 +12,11 @@
             ri.*,
         (IF(ri.practical_returned_time is null,IF (ri.should_returned_time &lt; NOW(),2,1),1)) as 'isTimeOut',
             (select name from blade_user WHERE id = ri.reminder_user) as reminderUserName
-        from c_contract_returned_info ri where ri.contract_id = #{contractId}
+        from c_contract_returned_info ri where ri.is_deleted = 0
+        <if test="contractId != null and contractId != ''">
+            and ri.contract_id = #{contractId}
+        </if>
+
     </select>
 
     <select id="getListByProjectId" resultType="org.springblade.control.vo.ContractReturnedInfoVO">
@@ -34,7 +38,7 @@
         select * from c_contract_returned_info
         WHERE is_deleted = 0
         <if test="date != null and date != ''">
-            and DATE_FORMAT(practical_returned_time ,'%Y-%m') = #{date}
+            and DATE_FORMAT(practical_returned_time ,'%Y') = #{date}
         </if>
         and practical_returned_money is not null
     </select>

+ 5 - 3
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml

@@ -18,14 +18,16 @@
                     and (pcb.plan_start_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date
                     or pcb.plan_end_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date)) as 'planTotal',
                 (select COUNT(1)  from c_project_cost_budget pcb WHERE pcb.cost_type = dmp.department_type
-                                                                   and pcb.status = 4
+                                                                   and pcb.task_approve = 1
                     and (pcb.plan_start_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date
                     or pcb.plan_end_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date)) as 'finishPlanTotal',
                 (select COUNT(1)  from c_project_cost_budget pcb WHERE pcb.cost_type = dmp.department_type
-                                                                   and pcb.status != 4
+                                                                   and pcb.task_approve = 0
                     and (pcb.plan_start_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date
-                    or pcb.plan_end_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date)) as 'beginPlanTotal'
+                    or pcb.plan_end_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date)) as 'beginPlanTotal',
+                (select bu.name from blade_user bu WHERE bu.id = dmp.plan_designer) as 'planDesignerName'
         FROM c_department_month_plan dmp
+        order by dmp.plan_start_date desc
     </select>
     <select id="getDepartmentUserDict" resultType="org.springblade.core.secure.BladeUser">
 

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java

@@ -75,4 +75,8 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<User> getAllEmployees(@Param("tenantId") String tenantId,@Param("deptId") Long deptId,@Param("userId") Long userId);
 
     List<ProjectCostBudget> getPlanByDeptOrUserOrTime2(@Param("ids") Set<Long> ids, @Param("start") LocalDate start,@Param("end") LocalDate end);
+
+    List<DictInfo> getCostType();
+
+    List<DictInfo> getUnitType();
 }

+ 32 - 6
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -94,28 +94,48 @@
     <select id="getUserALLPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO3">
         SELECT
             (select COUNT(1) FROM c_project_cost_budget pcb WHERE pcb.task_user = #{user}) as 'totalPlan',
-            (select COUNT(1) FROM c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.status = 4 ) as 'finishedPlan'
+            (select COUNT(1) FROM c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.status = 4 ) as 'finishedPlan',
+            (SELECT COUNT(1) from c_project_cost_budget pcb
+             WHERE pcb.task_user = #{user} and  date_add(NOW() , interval '3' DAY) > plan_end_time and  pcb.status in (2,3)) as 'riskPlan',
+            ( SELECT SUM(a) from (
+                SELECT COUNT(1) as a from c_project_cost_budget pcb
+                    WHERE pcb.task_user = #{user} and  NOW() > plan_end_time and  pcb.status in (2,3)
+                UNION ALL
+                SELECT COUNT(1) as a from c_project_cost_budget pcb
+                    WHERE pcb.task_user = #{user} and  practical_finish_time > plan_end_time and  pcb.task_approve = 1) xc) as 'postponePlan'
+
     </select>
     <select id="MonthPlanOverview" resultType="org.springblade.control.vo.ProjectCostBudgetVO3">
         select
             (select count(1) from c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.is_deleted = 0
                 and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate}
                 or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})) as 'totalPlan',
-            (select count(1) from c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.is_deleted = 0 and pcb.status in (1,2,3)
+            (select count(1) from c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.is_deleted = 0 and pcb.status in (2,3)
+                and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate}
+                or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})) as 'unfinishedPlan',
+            (select count(1) from c_project_cost_budget pcb WHERE pcb.task_user = #{user} and pcb.is_deleted = 0 and pcb.status in (3)
                 and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate}
-                or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})) as 'unfinishedPlan'
+                or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})) as 'cancelPlan',
+            ( SELECT SUM(a) from (
+                     SELECT COUNT(1) as a from c_project_cost_budget pcb
+                     WHERE pcb.task_user = #{user} and  NOW() > plan_end_time and  pcb.status in (2,3)
+                     and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate} or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})
+                     UNION ALL
+                     SELECT COUNT(1) as a from c_project_cost_budget pcb
+                     WHERE pcb.task_user = #{user} and  practical_finish_time > plan_end_time and  pcb.task_approve = 1
+                     and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate} or pcb.plan_end_time BETWEEN #{startDate} AND #{endDate})) xc) as 'postponePlan'
 
     </select>
     <select id="postponePlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO3">
         select pcb.id,pcb.plan_task_desc,pcb.plan_end_time,
                (select cpi.name from c_control_project_info cpi WHERE cpi.id = pcb.project_id) as "projectName"
-        from c_project_cost_budget pcb where pcb.task_user = #{user} and pcb.is_deleted = 0 and pcb.plan_end_time &lt;= NOW() and pcb.status in (1,2,3)
+        from c_project_cost_budget pcb where pcb.task_user = #{user} and pcb.is_deleted = 0 and date_add(NOW() , interval '3' DAY) > pcb.plan_end_time and pcb.status in (2,3)
     </select>
     <select id="MonthOfYearPlanOverview" resultType="org.springblade.control.entity.ProjectCostBudget">
         select pcb.*
         from c_project_cost_budget pcb
         where pcb.task_user = #{user} and pcb.is_deleted = 0
-            and DATE_FORMAT(pcb.plan_start_time,'%Y') = #{year} or DATE_FORMAT(pcb.plan_end_time,'%Y') = #{year}
+            and (DATE_FORMAT(pcb.plan_start_time,'%Y') = #{year} or DATE_FORMAT(pcb.plan_end_time,'%Y') = #{year})
     </select>
     <select id="getPostMoney" resultType="java.lang.Integer">
         select dict_value
@@ -188,7 +208,7 @@
         from c_project_cost_budget pcb
         WHERE pcb.is_deleted = 0 and pcb.task_approve = 1
         <if test="date != null and date != ''">
-            and DATE_FORMAT(pcb.plan_start_time ,'%Y-%m') = #{date}
+            and DATE_FORMAT(pcb.plan_start_time ,'%Y') = #{date}
         </if>
     </select>
     <select id="getPlanByDeptOrUserOrTime" resultType="org.springblade.control.entity.ProjectCostBudget">
@@ -220,6 +240,12 @@
             #{id}
         </foreach>
     </select>
+    <select id="getCostType" resultType="org.springblade.control.entity.DictInfo">
+        select * from c_dict_info WHERE code = 'cost_type' order by sort
+    </select>
+    <select id="getUnitType" resultType="org.springblade.control.entity.DictInfo">
+        select * from c_dict_info WHERE code = 'unit_type' order by sort
+    </select>
 
 
 </mapper>

+ 6 - 4
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetStatsMapper.xml

@@ -14,7 +14,9 @@
     </select>
 
     <select id="page" resultType="org.springblade.control.vo.ProjectCostBudgetStatsVO">
-        SELECT cbs.*,cpi.name as projectName,CASE cbs.status WHEN '0' THEN '未上报' WHEN '1' THEN '已上报' WHEN '2' THEN '已审批' ELSE '已驳回' END as statusValue
+        SELECT cbs.*,cpi.name as projectName,
+--                CASE cbs.status WHEN '0' THEN '未上报' WHEN '1' THEN '已上报' WHEN '2' THEN '已审批' ELSE '已驳回' END as statusValue
+        IF ((select COUNT(1)  from c_project_cost_budget pcb WHERE pcb.project_id = cbs.project_id and pcb.approve = 0)=0,0,1) as 'approveStatus'
         from c_project_cost_budget_stats cbs left join bladex.c_control_project_info cpi on cbs.project_id = cpi.id
         where cbs.is_deleted = 0
         <if test="queryValue != null and queryValue != ''">
@@ -31,16 +33,16 @@
     </select>
 
     <select id="getCostTypeDict" resultType="org.springblade.control.entity.DictInfo">
-        select * from c_dict_info WHERE code = 'cost_type' order by sort
+        select * from c_dict_info WHERE code = 'cost_type' and is_deleted = 0 order by sort
     </select>
 
     <select id="getProcessList" resultType="org.springblade.control.entity.ProjectProcess">
         SELECT * FROM c_project_process
-        WHERE project_id = #{projectId}
+        WHERE project_id = #{projectId} and is_deleted = 0
         order by sort
     </select>
     <select id="getPostDict" resultType="org.springblade.control.entity.DictInfo">
-        select * from c_dict_info WHERE `type` = 3 order by sort
+        select * from c_dict_info WHERE `type` = 3 and is_deleted = 0 order by sort
     </select>
 
 </mapper>

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -23,7 +23,7 @@
             and pi.implement_principal = #{dto.implementPrincipal}
         </if>
         <if test="dto.queryDate != null and dto.queryDate != ''">
-            and #{dto.queryDate} BETWEEN pi.start_time AND pi.end_time
+            and #{dto.queryDate} between DATE_FORMAT(pi.start_time ,'%Y-%m') and DATE_FORMAT(pi.end_time ,'%Y-%m')
         </if>
         <if test="dto.queryValue != null and dto.queryValue != ''">
             and pi.name like concat('%', #{dto.queryValue}, '%')

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -71,4 +71,8 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<ProjectCostBudget> getPlanPracticalCostByMonth(String date);
 
     PlanFinishedRatioVO planFinishedRatio(Long deptId, Long userId, String start, String end);
+
+    List<DictInfo> getCostType();
+
+    List<DictInfo> getUnitType();
 }

+ 1 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java

@@ -42,4 +42,5 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     List<ControlProjectInfo> listByYear(int year);
 
     List<User> getImplementUser();
+
 }

+ 41 - 12
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -299,7 +299,14 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     list.add(v02);
                 }
             }
-            list = list.stream().sorted(Comparator.comparing(DictInfo::getSort)).collect(Collectors.toList());
+            if (list != null && list.size() > 0) {
+                for (DictInfoVO infoVO : list) {
+                    if (infoVO.getSort() == null){
+                        infoVO.setSort(1);
+                    }
+                }
+                list = list.stream().sorted(Comparator.comparing(DictInfo::getSort)).collect(Collectors.toList());
+            }
             vo.setChildren(list);
         }
         return allBudgetSubject;
@@ -339,13 +346,27 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         if (vo3.getAnnualContractTarget() == null || vo3.getAnnualContractTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearReturned().compareTo(BigDecimal.ZERO) == 0){
             vo3.setContractSchedule(0);
         }else {
-            vo3.setContractSchedule(vo3.getYearReturned().divide(vo3.getAnnualContractTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+            int value = vo3.getYearReturned().divide(vo3.getAnnualContractTarget(), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue();
+            if (value < 0){
+                value = 0;
+            }
+            if (value > 100){
+                value = 100;
+            }
+            vo3.setContractSchedule(value);
         }
         //利润进度统计
         if (vo3.getAnnualProfitTarget() == null || vo3.getAnnualProfitTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearProfit().compareTo(BigDecimal.ZERO) == 0){
             vo3.setProfitSchedule(0);
         }else {
-            vo3.setProfitSchedule(vo3.getYearProfit().divide(vo3.getAnnualProfitTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+            int value = vo3.getYearProfit().divide(vo3.getAnnualProfitTarget(), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue();
+            if (value < 0){
+                value = 0;
+            }
+            if (value > 100){
+                value = 100;
+            }
+            vo3.setProfitSchedule(value);
         }
         return vo3;
     }
@@ -458,6 +479,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
         //获取当月所有计划,和计划工资
         List<ProjectCostBudgetVO2> planByMonth = budgetService.getPlanByMonth(date);
+        planByMonth = planByMonth.stream().filter(l->l.getPlanCountMoney() != null).collect(Collectors.toList());
+        planByMonth = planByMonth.stream().filter(l->new BigDecimal(0).compareTo(l.getPlanCountMoney()) != 0).collect(Collectors.toList());
         if (planByMonth != null && planByMonth.size() > 0) {
             List<DeptMonthPlanRatioVO> vos = new ArrayList<>();
             //月计划包含的项目
@@ -500,12 +523,18 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 //设置投入比
                 if (new BigDecimal(0).compareTo(businessCount) != 0){
                     vo.setBusinessRatio(business.divide(businessCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }else {
+                    vo.setBusinessRatio("0%");
                 }
                 if (new BigDecimal(0).compareTo(devCount) != 0) {
                     vo.setDevRatio(dev.divide(devCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }else {
+                    vo.setDevRatio("0%");
                 }
                 if (new BigDecimal(0).compareTo(maintainCount) != 0) {
                     vo.setMaintainRatio(maintain.divide(maintainCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }else {
+                    vo.setMaintainRatio("0%");
                 }
                 //插入结果集
                 vos.add(vo);
@@ -571,17 +600,17 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
      */
     @Override
     public List<ProjectIncomeCostRatioVO> portalProjectCostRatio(String date) {
-        if ("汇总所有".equals(date)){
-            date = "";
-        }
+//        if ("汇总所有".equals(date)){
+//            date = "";
+//        }
         //获取项目列表
-        List<ControlProjectInfo> list = projectInfoService.list();
+        List<ControlProjectInfo> list = projectInfoService.listByYear(Integer.parseInt(date.substring(0,4)));
         if (list == null || list.size() <= 0){
             return null;
         }
         List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
-        //按获取闭环任务,根据项目分组
-        List<ProjectCostBudget> costByMonth = budgetService.getPlanPracticalCostByMonth(date);
+        //按获取闭环任务,根据项目分组
+        List<ProjectCostBudget> costByMonth = budgetService.getPlanPracticalCostByMonth(date.substring(0,4));
         if (costByMonth == null || costByMonth.size() <= 0){
             //没有闭环任务,为每个项目设置为0
             for (ControlProjectInfo info : list) {
@@ -617,13 +646,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             date = "";
         }
         //获取项目列表
-        List<ControlProjectInfo> list = projectInfoService.list();
+        List<ControlProjectInfo> list = projectInfoService.listByYear(Integer.parseInt(date.substring(0,4)));
         if (list == null || list.size() <= 0){
             return null;
         }
         //获取所有回款,根据项目分组
         List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
-        List<ContractReturnedInfo> returnedByMonth = returnedInfoService.getProjectReturnedByMonth(date);
+        List<ContractReturnedInfo> returnedByMonth = returnedInfoService.getProjectReturnedByMonth(date.substring(0,4));
         if (returnedByMonth == null || returnedByMonth.size() <= 0){
             //没有闭环任务,为每个项目设置为0
             for (ControlProjectInfo info : list) {
@@ -647,7 +676,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     big = big.add(returnedInfo.getPracticalReturnedMoney());
                 }
             }
-            vo.setProjectCost(big.intValue());
+            vo.setProjectIncome(big.intValue());
             vos.add(vo);
         }
         return vos;

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -171,7 +171,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                 }
 
                 //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 9 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
 
                 //关联项目id,项目计划预算等,在任务闭环时计算推送
             }

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java

@@ -22,6 +22,8 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
 import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -39,6 +41,8 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     private final IContractReturnedInfoService returnedInfoService;
 
+    private final JdbcTemplate jdbcTemplate;
+
     /**
      * 添加合同信息
      */
@@ -48,6 +52,9 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         Long id = SnowFlakeUtil.getId();
         dto.setId(id);
         BeanUtils.copyProperties(dto,contractInfo);
+        if (dto.getStartTime() != null && dto.getEndTime() != null){
+            jdbcTemplate.execute("update c_control_project_info set start_time = '"+dto.getStartTime() + "', end_time = '"+ dto.getEndTime() +"' where id = "+ dto.getProjectId());
+        }
         baseMapper.insert(contractInfo);
         returnedInfoService.saveOrUpdateBatchReturned(dto);
 
@@ -94,6 +101,9 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public void updateContractInfo(ControlContractInfoDTO dto) {
         ControlContractInfo contractInfo = new ControlContractInfo();
         BeanUtils.copyProperties(dto,contractInfo);
+        if (dto.getStartTime() != null && dto.getEndTime() != null){
+            jdbcTemplate.execute("update c_control_project_info set start_time = '"+dto.getStartTime() + "', end_time = '"+ dto.getEndTime() +"' where id = "+ dto.getProjectId());
+        }
         this.updateById(contractInfo);
         returnedInfoService.saveOrUpdateBatchReturned(dto);
     }

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -19,6 +19,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -67,6 +68,8 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
         //获取部门名称
         String departmentName = baseMapper.getDepartmentName(plan.getDepartmentType());
         //新增部门月计划,并且设置名称和起止日期,制定人
+        Long userId = SecureUtil.getUserId();
+        plan.setPlanDesigner(userId);
         String planDate = plan.getPlanDate();
         String[] date = planDate.split("-");
         plan.setPlanName(date[0]+"年"+date[1]+"月"+departmentName+"预算计划");

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -187,7 +187,7 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                 }
 
                 //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 2 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
 
                 //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
             }

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java

@@ -166,7 +166,7 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
             }
 
             //新增审批任务关联信息
-            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",7)");
+            jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 7 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",7)");
 
             //存储关联项目id,审批闭环后处理项目相关业务
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -169,7 +169,7 @@ public class EMLoanServiceImpl extends BaseServiceImpl<ExMLoanMapper, EMLoanInfo
             }
 
             //新增审批任务关联信息
-            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",4)");
+            jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 4 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",4)");
 
             return true;
         }

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -161,7 +161,7 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
             }
 
             //新增审批任务关联信息
-            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",8)");
+            jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 8 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",8)");
 
             //关联项目id只做存储,任务闭环时在进行业务计算
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java

@@ -142,7 +142,7 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
             }
 
             //新增审批任务关联信息
-            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",3)");
+            jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 3 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",3)");
 
             //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -169,7 +169,7 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
                 }
 
                 //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 5 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
             }
         }
         return true;

+ 5 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -43,11 +43,14 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
 
     @Override
     public IPage<EMUseCarInfoVO> carPage(IPage<EMUseCarInfo> page, EMUseCarInfoDTO dto) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         QueryWrapper<EMUseCarInfo> queryWrapper = Condition.getQueryWrapper(dto);
         queryWrapper.lambda().eq(EMUseCarInfo::getIsTemp, 1);
         IPage<EMUseCarInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMUseCarInfo::getCreateTime));
         Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
-        List<Dept> deptList = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = 003077 and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
+        List<Dept> deptList = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
         return pages.convert(obj -> {
             EMUseCarInfoVO vo = new EMUseCarInfoVO();
             BeanUtils.copyProperties(obj, vo);
@@ -178,7 +181,7 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
                 }
 
                 //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",6)");
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 6 and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",6)");
             }
         }
         return true;

+ 175 - 58
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.control.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
@@ -12,16 +13,14 @@ import org.springblade.control.dto.LogHistoryInfoDTO;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.LogHistoryMapper;
 import org.springblade.control.service.LogHistoryService;
-import org.springblade.control.vo.LogHistoryAndTaskVO;
-import org.springblade.control.vo.LogHistoryInfoReadVO;
-import org.springblade.control.vo.LogHistoryInfoVO;
-import org.springblade.control.vo.TaskPlanInfoVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -33,6 +32,7 @@ import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -85,13 +85,22 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             for (LogHistoryInfoReadVO readVO : infoReadVOS) {
                 readMap.put(readVO.getUserId() + readVO.getLogId() + "", readVO);
             }
+            Map<Long, List<LogHistoryInfoReadVO>> logRecords = infoReadVOS.stream().collect(Collectors.groupingBy(LogHistoryInfoReadVO::getLogId));
 
             for (LogHistoryInfoVO vo : voList) {
+                //用户基础信息
                 User user = userMap.get(vo.getUserId());
                 if (user != null) {
                     vo.setLogTitle(user.getRealName() + "的日志");
                     vo.setHeadPicture(StringUtils.isNotEmpty(user.getAvatar()) ? user.getAvatar() : "");
                 }
+                //是否可编辑
+                if (vo.getUserId().equals(SecureUtil.getUserId())) {
+                    vo.setIsEdit(1);
+                } else {
+                    vo.setIsEdit(0);
+                }
+                //当前用户是否已读
                 String readIndex = SecureUtil.getUserId() + vo.getId() + "";
                 LogHistoryInfoReadVO readVO = readMap.get(readIndex);
                 if (readVO != null) {
@@ -99,9 +108,19 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 } else {
                     vo.setIsRead(0);
                 }
+                //所有已读人集合
+                List<LogHistoryInfoReadVO> readVOList = logRecords.getOrDefault(vo.getId(), null);
+                if (readVOList != null && readVOList.size() > 0) {
+                    List<LogHistoryInfoVO.ReadUser> readUserList = new LinkedList<>();
+                    for (LogHistoryInfoReadVO readUsers : readVOList) {
+                        LogHistoryInfoVO.ReadUser readUser = new LogHistoryInfoVO.ReadUser(userMap.get(readUsers.getUserId()).getAvatar(), userMap.get(readUsers.getUserId()).getName());
+                        readUserList.add(readUser);
+                    }
+                    vo.setReadUsers(readUserList);
+                }
             }
 
-            return voList.stream()
+            LinkedHashMap<String, List<LogHistoryInfoVO>> collect = voList.stream()
                     .collect(Collectors.groupingBy(vo -> {
                         return formatDate(
                                 vo.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().toString(),
@@ -109,6 +128,18 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                                 "昨天",
                                 "前天");
                     }, LinkedHashMap::new, Collectors.toList()));
+            //把当前用户放在今日日志首位
+            for (Map.Entry<String, List<LogHistoryInfoVO>> stringListEntry : collect.entrySet()) {
+                if (stringListEntry.getKey().equals("今天")) {
+                    List<LogHistoryInfoVO> value = stringListEntry.getValue();
+                    List<LogHistoryInfoVO> filteredList = value.stream()
+                            .filter(vo -> vo.getUserId().equals(SecureUtil.getUserId()))
+                            .collect(Collectors.toList());
+                    value.removeAll(filteredList);
+                    value.addAll(0, filteredList);
+                }
+            }
+            return collect;
         }
         return null;
     }
@@ -135,28 +166,36 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-
-        //判断今日是否已填写日志信息
-        LocalDate currentDate = LocalDate.now();
-        String formattedDate = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        LogHistoryInfo logOne = baseMapper.selectOne(Wrappers.<LogHistoryInfo>lambdaQuery()
-                .select(LogHistoryInfo::getId)
-                .eq(LogHistoryInfo::getUserId, SecureUtil.getUserId())
-                .like(LogHistoryInfo::getCreateTime, formattedDate));
-        if (logOne != null) {
-            throw new ServiceException("当前用户今日已填写过日志信息,请勿重复提交");
+        if (ObjectUtil.isEmpty(SecureUtil.getDeptId())) {
+            throw new ServiceException("获取部门信息失败,请联系管理员");
         }
-
-        dto.setUserId(SecureUtil.getUserId());
-
-        //新增
         if (ObjectUtil.isEmpty(dto.getId())) {
+            //判断今日是否已填写日志信息
+            LocalDate currentDate = LocalDate.now();
+            String formattedDate = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            List<LogHistoryInfo> logHistoryInfos = baseMapper.selectList(Wrappers.<LogHistoryInfo>lambdaQuery()
+                    .select(LogHistoryInfo::getId)
+                    .eq(LogHistoryInfo::getUserId, SecureUtil.getUserId())
+                    .like(LogHistoryInfo::getCreateTime, formattedDate));
+            if (logHistoryInfos != null && logHistoryInfos.size() > 0) {
+                throw new ServiceException("当前用户今日已填写过日志信息,请勿重复提交");
+            }
+            dto.setUserId(SecureUtil.getUserId());
+            String deptIds = SecureUtil.getDeptId();
+            List<String> strings = Func.toStrList(deptIds);
+            if (strings.size() > 0) {
+                dto.setOrgDept(Long.parseLong(strings.get(0))); //默认选择第一个部门
+            }
+            //新增
             if (this.save(dto)) {
-                //获取当天,当前用户所有的计划任务信息
+
+                //获取当天,当前用户所有的计划任务信息,新增关联信息
                 List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
-                jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
-                for (TaskPlanInfoVO task : taskPlanInfoVOS) {
-                    jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
+                if (taskPlanInfoVOS.size() > 0) {
+                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
+                    for (TaskPlanInfoVO task : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
+                    }
                 }
 
                 //报销金额不为空,在财务报销里新增一条草稿内容
@@ -177,9 +216,24 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 return true;
             }
 
-            //编辑
         } else {
+            //判断是否是本人操作
+            LogHistoryInfo logHistoryInfo = baseMapper.selectById(dto.getId());
+            if (logHistoryInfo != null && !logHistoryInfo.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("暂无权限,不能编辑别人的日志信息");
+            }
+            //编辑
             if (baseMapper.updateById(dto) > 0) {
+
+                //获取当天,当前用户所有的计划任务信息,新增关联信息
+                List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
+                if (taskPlanInfoVOS.size() > 0) {
+                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
+                    for (TaskPlanInfoVO task : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
+                    }
+                }
+
                 //报销金额不为空,修改财务报销信息
                 if (ObjectUtil.isNotEmpty(dto.getExpenseReimbursementAmount()) && ObjectUtil.isNotEmpty(dto.getTaskId())) {
                     ProjectCostBudget projectCostBudget = projectCostBudgetServiceImpl.getBaseMapper().selectOne(Wrappers.<ProjectCostBudget>lambdaQuery().select(ProjectCostBudget::getProjectId).eq(ProjectCostBudget::getId, dto.getTaskId()));
@@ -244,8 +298,16 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 //获取当前日志关联的任务信息
                 List<LogHistoryAndTaskVO> taskVOList = jdbcTemplate.query("select * from c_log_history_task_record where log_id = " + id, new BeanPropertyRowMapper<>(LogHistoryAndTaskVO.class));
                 List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
-                List<Long> taskIds = taskVOList.stream().map(LogHistoryAndTaskVO::getTaskId).collect(Collectors.toList());
+                List<String> taskIds = taskVOList.stream().map(LogHistoryAndTaskVO::getTaskId).map(String::valueOf).collect(Collectors.toList());
                 if (taskIds.size() > 0) {
+                    //任务逾期关系信息
+                    List<TaskPlanOverdueStatusVO> overdueStatusVOS = jdbcTemplate.query("select * from c_task_plan_overdue_status where user_id = " + obj.getUserId(), new BeanPropertyRowMapper<>(TaskPlanOverdueStatusVO.class));
+
+                    //获取所有审批任务与计划任务关系
+                    List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+                    Map<String, ExpenseTaskRecord> taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
+
+                    //预算任务集合
                     List<ProjectCostBudget> taskObjs = projectCostBudgetServiceImpl.listByIds(taskIds);
                     List<TaskPlanInfoVO> resultList = new ArrayList<>();
                     for (ProjectCostBudget taskObj : taskObjs) {
@@ -257,7 +319,31 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                                 break;
                             }
                         }
-                        vos.setStatusName(taskObj.getStatus().equals(4) ? "已完成" : "未完成");
+
+                        //判断任务状态
+                        ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(taskObj.getId()), null);
+                        if (record != null) {
+                            TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
+                            if (task != null) {
+                                vos.setStatus(task.getStatus());
+                                vos.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未提交审批")));
+                            }
+                        }
+                        if (StringUtils.isEmpty(vos.getStatusName())) {
+                            vos.setStatus(0);
+                            vos.setStatusName("未提交审批");
+                        }
+
+                        //只有在当前任务是未提交、已驳回状态下才判断是否逾期
+                        if (!Arrays.asList(1, 2).contains(vos.getStatus())) {
+                            //是否已逾期
+                            for (TaskPlanOverdueStatusVO overdueVO : overdueStatusVOS) {
+                                if (overdueVO.getPlanTaskId().equals(taskObj.getId())) {
+                                    vos.setIsOverdue(1);
+                                }
+                            }
+                        }
+
                         vos.setTaskDesc(ObjectUtil.isNotEmpty(taskObj.getPlanTaskDesc()) ? taskObj.getPlanTaskDesc() : "");
                         if (ObjectUtil.isNotEmpty(taskObj.getPlanStartTime()) && ObjectUtil.isNotEmpty(taskObj.getPlanEndTime())) {
                             LocalDate planStartTime = taskObj.getPlanStartTime();
@@ -272,7 +358,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
 
                         resultList.add(vos);
                     }
-                    vo.setTaskList(resultList);
+                    List<TaskPlanInfoVO> collect = resultList.stream().sorted(Comparator.comparing(TaskPlanInfoVO::getStatus)).collect(Collectors.toList());
+                    vo.setTaskList(collect);
                 }
                 return vo;
             }
@@ -300,6 +387,10 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
 
     @Override
     public boolean logTaskComplete(Long logId, Long taskId) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+
         ProjectCostBudget task = projectCostBudgetServiceImpl.getBaseMapper().selectById(taskId);
         if (ObjectUtil.isEmpty(task.getDeptId())) {
             throw new ServiceException("获取部门信息失败,请联系管理员");
@@ -309,43 +400,69 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         User departmentHead = taskProcessService.getDepartmentHead(task.getDeptId());
         if (departmentHead != null) {
             //修改计划任务的状态为已完成
-            boolean updated = projectCostBudgetServiceImpl.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getStatus, 4).eq(ProjectCostBudget::getId, taskId));
-            if (updated) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(1); //任务审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
-
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                auditUserIds.add(departmentHead.getId() + "");
-
-                List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                for (String userId : auditUserIds) {
-                    if (StringUtils.isNotEmpty(userId)) {
-                        nonEmptyAuditUserIds.add(userId);
+            ProjectCostBudget obj = projectCostBudgetServiceImpl.getById(taskId);
+            if (obj != null && !obj.getTaskUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("该任务不属于当前用户,操作失败");
+            }
+
+            //判断计划任务是否逾期完成
+            if (obj != null && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
+                Date now = DateUtil.now();
+                Date planEndDate = Date.from(obj.getPlanEndTime().atStartOfDay(ZoneId.systemDefault()).toInstant());
+                int comparison = now.compareTo(planEndDate);
+                if (comparison > 0) {
+                    //now在planEndDate之后表示逾期完成
+                    jdbcTemplate.execute("delete from c_task_plan_overdue_status where plan_task_id = " + taskId + " ; insert into c_task_plan_overdue_status(id,user_id,plan_task_id,is_overdue) values (" + SnowFlakeUtil.getId() + "," + SecureUtil.getUserId() + "," + taskId + ",1)");
+                }
+            }
+
+            //获取当天,当前用户所有的计划任务信息,新增关联信息
+            if (ObjectUtil.isNotEmpty(logId)) { //编辑时,点完成,那么重塑关系信息
+                List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
+                if (taskPlanInfoVOS.size() > 0) {
+                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + logId);
+                    for (TaskPlanInfoVO taskPlanInfoVO : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + logId + "," + taskPlanInfoVO.getId() + ")");
                     }
                 }
-                if (nonEmptyAuditUserIds.size() == 0) {
-                    taskProcessInfo.setAuditUserIds(null);
-                } else {
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+            }
+
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessInfo.setId(SnowFlakeUtil.getId());
+            taskProcessInfo.setStatus(1); //待审批
+            taskProcessInfo.setReportDate(new Date());
+            taskProcessInfo.setTaskType(1); //任务审批
+            taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
+
+            //上报人
+            taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+            //审批人
+            List<String> auditUserIds = new LinkedList<>();
+            auditUserIds.add(departmentHead.getId() + "");
+
+            List<String> nonEmptyAuditUserIds = new LinkedList<>();
+            for (String userId : auditUserIds) {
+                if (StringUtils.isNotEmpty(userId)) {
+                    nonEmptyAuditUserIds.add(userId);
                 }
+            }
+            if (nonEmptyAuditUserIds.size() == 0) {
+                taskProcessInfo.setAuditUserIds(null);
+            } else {
+                taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+            }
 
-                taskProcessService.save(taskProcessInfo);
+            taskProcessService.save(taskProcessInfo);
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + task.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + task.getId() + ",1)");
-                return true;
-            }
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + task.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + task.getId() + ",1)");
+            return true;
+            //}
+        } else {
+            throw new ServiceException("获取部门负责人失败,无法提交任务完成,请联系管理员");
         }
-        return false;
     }
 
     @Override

+ 26 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -702,6 +702,32 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * 查询预览-费用分类列表
+     */
+    @Override
+    public List<DictInfo> getCostType() {
+        List<DictInfo> costType = baseMapper.getCostType();
+        DictInfo dictInfo = new DictInfo();
+        dictInfo.setDictName("所有");
+        dictInfo.setDictValue(-1);
+        costType.add(dictInfo);
+        return costType;
+    }
+
+    /**
+     * 查询预览-单位列表
+     */
+    @Override
+    public List<DictInfo> getUnitType() {
+        List<DictInfo> unitType = baseMapper.getUnitType();
+        DictInfo dictInfo = new DictInfo();
+        dictInfo.setDictName("所有");
+        dictInfo.setDictValue(-1);
+        unitType.add(dictInfo);
+        return unitType;
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java

@@ -117,6 +117,12 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
         ProjectCostBudgetStatsVO vo = new ProjectCostBudgetStatsVO();
         ControlProjectInfo projectInfo = projectInfoService.getById(costBudget.getProjectId());
         vo.setProjectName(projectInfo.getName());
+        if (costBudget.getCostType() != null && costBudget.getCostType() == -1){
+            costBudget.setCostType(null);
+        }
+        if (costBudget.getUnitType() != null && costBudget.getUnitType() == -1){
+            costBudget.setUnitType(null);
+        }
         List<ProjectCostBudgetVO> list = budgetService.budgetList(costBudget);
         BigDecimal bigDecimal = new BigDecimal("0");
         for (ProjectCostBudgetVO l : list) {

+ 8 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -107,6 +107,10 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         if (one1 != null){
             throw new ServiceException("项目存在合同,不能删除");
         }
+        List<ProjectCostBudget> list = budgetService.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId, id));
+        if (list != null && list.size() > 0){
+            throw new ServiceException("项目已经做了预算,不能删除");
+        }
         baseMapper.deleteById(id);
         processService.removeProjectProcess(id);
     }
@@ -202,6 +206,10 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return null;
     }
 
+    /**
+     * 获取当年的项目
+     * @return
+     */
     @Override
     public List<ControlProjectInfo> listByYear(int year) {
         return baseMapper.listByYear(year);

+ 73 - 33
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -44,8 +44,10 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.LocalDate;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -239,15 +241,14 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 }
                                 break;
                             case 10: //成本测算
-                                List<ProjectCostBudget> query = jdbcTemplate.query("select * from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
+                                List<ProjectCostBudget> query = jdbcTemplate.query("select project_id from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
                                 if (query.size() > 0) {
                                     Long projectId = query.stream().map(ProjectCostBudget::getProjectId).collect(Collectors.toList()).stream().findAny().orElse(null);
                                     if (projectId != null) {
-                                        ProjectCostBudgetStats projectCostBudgetStats = jdbcTemplate.query("select * from c_project_cost_budget_stats where project_id = " + projectId, new BeanPropertyRowMapper<>(ProjectCostBudgetStats.class)).stream().findAny().orElse(null);
-                                        TaskProjectCostBudgetVO voCbCs = new TaskProjectCostBudgetVO();
-                                        voCbCs.setProjectCostBudgetList(query);
-                                        voCbCs.setProjectCostBudgetStats(projectCostBudgetStats);
-                                        data = voCbCs;
+                                        ProjectCostBudgetStats stats = jdbcTemplate.query("select id from c_project_cost_budget_stats where project_id = " + projectId, new BeanPropertyRowMapper<>(ProjectCostBudgetStats.class)).stream().findAny().orElse(null);
+                                        if (stats != null) {
+                                            data = projectCostBudgetStatsService.getBudgetStatsById(stats.getId());
+                                        }
                                     }
                                 }
                                 break;
@@ -419,7 +420,25 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             queryWrapper.lambda().eq(ProjectCostBudget::getDeptId, dto.getDeptId());
         }
         if (ObjectUtil.isNotEmpty(dto.getTaskStatus())) {
-            queryWrapper.lambda().eq(ProjectCostBudget::getStatus, dto.getTaskStatus());
+            if (dto.getTaskStatus().equals("2")) {
+                //已完成任务
+                queryWrapper.lambda().eq(ProjectCostBudget::getStatus, 4);
+            } else if (dto.getTaskStatus().equals("1")) {
+                //未完成任务
+                queryWrapper.lambda().in(ProjectCostBudget::getStatus, 1, 2, 3);
+            } else if (dto.getTaskStatus().equals("3")) {
+                //逾期完成
+                List<TaskPlanOverdueStatusVO> query = jdbcTemplate.query("select * from c_task_plan_overdue_status where user_id = " + SecureUtil.getUserId(), new BeanPropertyRowMapper<>(TaskPlanOverdueStatusVO.class));
+                List<Long> taskIds = query.stream().map(TaskPlanOverdueStatusVO::getPlanTaskId).collect(Collectors.toList());
+                queryWrapper.lambda().in(ProjectCostBudget::getId, taskIds);
+            }
+            if (dto.getTaskStatus().equals("4")) {
+                //逾期未完成
+                Date now = DateUtil.now();
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                String format = simpleDateFormat.format(now);
+                queryWrapper.lambda().in(ProjectCostBudget::getStatus, 1, 2, 3).lt(ProjectCostBudget::getPlanEndTime, format);
+            }
         }
         if (ObjectUtil.isNotEmpty(dto.getStartTime()) && ObjectUtil.isNotEmpty(dto.getEndTime())) {
             queryWrapper.lambda().ge(ProjectCostBudget::getPlanStartTime, dto.getStartTime()).le(ProjectCostBudget::getPlanEndTime, dto.getEndTime());
@@ -436,6 +455,14 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
         //构造page参数
         List<ProjectCostBudget> records = pages.getRecords();
+        List<String> taskIds = records.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
+        //获取所有审批任务与计划任务关系
+        Map<String, ExpenseTaskRecord> taskRecordMaps = new LinkedHashMap<>();
+        if (taskIds.size() > 0) {
+            List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+            taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
+        }
+
         List<TaskPlanInfoVO> vos = new ArrayList<>();
         for (ProjectCostBudget obj : records) {
             TaskPlanInfoVO vo = new TaskPlanInfoVO();
@@ -444,7 +471,19 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             vo.setTaskDesc(obj.getPlanTaskDesc());
             vo.setPlanTarget(obj.getPlanTarget());
 
-            vo.setStatusName(null); //TODO 任务状态 多种
+            //判断任务状态
+            ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(vo.getId()), null);
+            if (record != null) {
+                TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
+                if (task != null) {
+                    vo.setStatus(task.getStatus());
+                    vo.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未提交审批")));
+                }
+            }
+            if (StringUtils.isEmpty(vo.getStatusName())) {
+                vo.setStatus(0);
+                vo.setStatusName("未提交审批");
+            }
 
             for (ControlProjectInfo projectInfo : controlProjectInfos) {
                 if (projectInfo.getId().equals(obj.getProjectId())) {
@@ -530,7 +569,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1,'" + completionTimeStr + "',null,null,null)");
 
                         //新增审批任务关联信息
-                        jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
+                        jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + planTaskInfo.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
 
                     } else if (departmentHead != null && dto.getUpdateType().equals("2")) {
                         //任务转移
@@ -563,7 +602,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",2,'" + completionTimeStr + "'," + SecureUtil.getUserId() + "," + dto.getTransferObject() + "," + dto.getTransferReason() + ")");
 
                         //新增审批任务关联信息
-                        jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
+                        jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + planTaskInfo.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
                     }
                 }
             }
@@ -624,6 +663,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
     @Override
     public boolean approveCostBudgetSubmit(String id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         ProjectCostBudgetStats projectCostBudgetStats = projectCostBudgetStatsService.getBaseMapper().selectById(id);
         if (projectCostBudgetStats != null) {
             List<ProjectCostBudget> projectCostBudgetList = projectCostBudgetService.getBaseMapper().selectList(Wrappers.<ProjectCostBudget>lambdaQuery()
@@ -632,10 +674,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             if (projectCostBudgetList.size() > 0) {
                 //审批人(总经理)
                 List<String> auditUserIds = new LinkedList<>();
-                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = 003077 and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
                 if (query.size() == 1) {
                     Dept dept = query.get(0);
-                    List<User> users = jdbcTemplate.query("select id from blade_user where dept_id like '%" + dept.getId() + "%' and tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
+                    List<User> users = jdbcTemplate.query("select id from blade_user where dept_id like '%" + dept.getId() + "%' and tenant_id = " + SecureUtil.getUser().getTenantId() + " and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
                     if (users.size() > 0) {
                         List<Long> ids = users.stream().map(User::getId).collect(Collectors.toList());
                         auditUserIds.add(StringUtils.join(ids, ","));
@@ -669,7 +711,11 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 //新增审批任务关联信息
                 List<String> ids = projectCostBudgetList.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
                 String budgetIds = StringUtils.join(ids, ",");
-                jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + budgetIds + ",10)");
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 10 and expense_info_id = '" + budgetIds + "' ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + ",'" + budgetIds + "',10)");
+
+                //修改projectCostBudgetList的approve=2(审批中)
+                projectCostBudgetService.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getApprove, 2).in(ProjectCostBudget::getId, ids));
+
                 return true;
             }
         }
@@ -687,11 +733,11 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         switch (businessDataType) {
             case 1: //计划任务
                 if (taskStatus == 2) {
-                    //已完成 = 已完成
-                    jdbcTemplate.execute("update c_project_cost_budget set status = 4 where id = " + dataId);
+                    //task_approve = 1 已审批 , status = 4 已完成
+                    jdbcTemplate.execute("update c_project_cost_budget set task_approve = 1,status = 4 where id = " + dataId);
                 } else if (taskStatus == 3) {
-                    //已驳回 = 未开始
-                    jdbcTemplate.execute("update c_project_cost_budget set status = 1 where id = " + dataId);
+                    //task_approve = 0 未开始 , status = 2 进行中
+                    jdbcTemplate.execute("update c_project_cost_budget set task_approve = 0,status = 2 where id = " + dataId);
                 }
                 break;
 
@@ -721,11 +767,12 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 break;
             case 10: //成本测算
                 if (taskStatus == 2) {
-                    //已完成 = 已完成(修改成本测算的数据状态)dataId = ids
+                    //已完成 = approve = 1
                     jdbcTemplate.execute("update c_project_cost_budget set approve = 1 where id in(" + dataId + ")");
 
                 } else if (taskStatus == 3) {
-                    //已驳回 = 不做处理,驳回后依然是未上报
+                    //已驳回 = approve = 0
+                    jdbcTemplate.execute("update c_project_cost_budget set approve = 0 where id in(" + dataId + ")");
                     break;
                 }
                 break;
@@ -782,16 +829,6 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         }
                     }
                 }
-
-                break;
-            case 3:
-                //支付 不做处理,只存储记录,关联项目合同段后,在项目处统计通过的任务的金额
-                break;
-            case 5:
-                //采购 不做处理,只存储记录,在经营预算处统计通过的任务的金额
-                break;
-            case 8:
-                //外包 不做处理,只存储记录,关联项目后,在项目处统计通过的任务的金额
                 break;
         }
     }
@@ -934,8 +971,11 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @return
      */
     public Map<String, List<User>> getApproveUserMaps(int type) {
-        //tenant_id = 003077(管控平台) dept_type = 3(最底层为岗位信息)
-        List<Dept> deptListControl = jdbcTemplate.query("select * from blade_dept where tenant_id = 003077 and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        //tenant_id = SecureUtil.getUser().getTenantId()(管控平台) dept_type = 3(最底层为岗位信息)
+        List<Dept> deptListControl = jdbcTemplate.query("select * from blade_dept where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
         Map<String, List<User>> resultMaps = new LinkedHashMap<>();
         List<String> spPostIds = new LinkedList<>();
         List<String> zcPostIds = new LinkedList<>();
@@ -997,7 +1037,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         if (spPostIds.size() > 0) {
             List<User> spUserListAll = new LinkedList<>();
             for (String spPostId : spPostIds) {
-                List<User> spUserList = jdbcTemplate.query("select * from blade_user where tenant_id = 003077 and dept_id =" + spPostId, new BeanPropertyRowMapper<>(User.class));
+                List<User> spUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_id =" + spPostId, new BeanPropertyRowMapper<>(User.class));
                 spUserListAll.addAll(spUserList);
             }
             if (spUserListAll.size() > 0) {
@@ -1005,7 +1045,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             }
         }
         if (zcPostIds.size() > 0) {
-            List<User> zcUserList = jdbcTemplate.query("select * from blade_user where tenant_id = 003077 and dept_id in(" + StringUtils.join(zcPostIds, ",") + ")", new BeanPropertyRowMapper<>(User.class));
+            List<User> zcUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_id in(" + StringUtils.join(zcPostIds, ",") + ")", new BeanPropertyRowMapper<>(User.class));
             if (zcUserList.size() > 0) {
                 resultMaps.put("ZC", zcUserList);
             }

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

@@ -352,7 +352,9 @@ public class ArchiveTreeContractController extends BladeController {
             return R.fail(200, "节点错误");
         }
         boolean b = archiveTreeContractService.syncProjectTree(archiveTree);
-        //
+
+        //TODO 待节点都同步完了以后,再去设置wbs节点的组卷规则。(方式:客户级wbs节点-》项目级wbs节点-》wbs项目级组卷规则-》设置规则到客户级wbs节点以及子节点)
+
         if (b) {
             return R.success("同步成功");
         }

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

@@ -12,6 +12,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.common.utils.BaseUtils;
+import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -32,6 +34,8 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -82,6 +86,10 @@ public class WbsParamController {
     public R saveOrUpdateBatch(@RequestBody ParamBean pb) {
         try {
             List<WbsParamBean> wps = pb.getWps();
+            String names=checkRepeat(wps);
+            if(names!=null){
+                return R.success("存在重复参数【"+names+"】,删除多余项再保存");
+            }
             /*执行顺序,删>增>改*/
             if (Func.isNotEmpty(pb.getDelIds())) {
                 List<Long> delIds = pb.getDelIds().stream().filter(Func::isNotEmpty).collect(Collectors.toList());
@@ -187,6 +195,16 @@ public class WbsParamController {
 
     }
 
+    public String checkRepeat( List<WbsParamBean> wps){
+        if(Func.isNotEmpty(wps)){
+           List<List<WbsParamBean>> target=wps.stream().collect(Collectors.groupingBy(WbsParamBean::getK)).values().stream().filter(l->l.size()>1).collect(Collectors.toList());
+           if(target.size()>0){
+               return target.stream().map(l->l.get(0).getName()).collect(Collectors.joining(","));
+           }
+        }
+        return null;
+    }
+
     /**
      * /**
      * 删除
@@ -239,6 +257,7 @@ public class WbsParamController {
     @ApiOperation(value = "节点参数列表", notes = "节点参数列表")
     @GetMapping("/list")
     public R<List<WbsParamBean>> list3(@ApiParam(value = "节点id", required = true) Long wbsId) {
+        this.service.duplicate(wbsId);
         List<WbsParam> data = this.service.list(Wrappers.<WbsParam>lambdaQuery()
                 .select(WbsParam::getId, WbsParam::getName, WbsParam::getK, WbsParam::getV, WbsParam::getRemark, WbsParam::getNodeId, WbsParam::getProjectId)
                 .eq(WbsParam::getNodeId, wbsId)
@@ -410,7 +429,7 @@ public class WbsParamController {
         try {
             StopWatch stopWatch = new StopWatch();
             stopWatch.start("节点参数查重及删除");
-            List<Map<String, Object>> mapList = this.jdbcTemplate.queryForList("select  node_id nodeId,k,count(*) num from m_wbs_param  where is_deleted=0 and type=1 GROUP BY node_id,k HAVING count(*)>2");
+            List<Map<String, Object>> mapList = this.jdbcTemplate.queryForList("select  node_id nodeId,k,count(*) num from m_wbs_param  where is_deleted=0 and type=1 GROUP BY node_id,k HAVING count(*)>1");
             if (!mapList.isEmpty()) {
                 List<WbsParam> list = this.service.list(Wrappers.<WbsParam>lambdaQuery().in(WbsParam::getNodeId, mapList.stream().map(m -> m.get("nodeId")).collect(Collectors.toList())));
                 List<Long> removeWpIds = new ArrayList<>();
@@ -437,6 +456,9 @@ public class WbsParamController {
                 System.out.println("待删除参数" + removeWpIds.size() + "个");
                 System.out.println("待删除中间关联" + removeMapingIds.size() + "个");
                 System.out.println("待删除公式" + removeFormulaIds.size() + "个");
+//                    batchDel(this.service,removeWpIds);
+//                    batchDel(this.elementFormulaMappingService,removeMapingIds);
+//                    batchDel(this.formulaService,removeFormulaIds);
                 Map<String, Integer> result = new HashMap<>();
                 result.put("查找到重复参数", list.size());
                 result.put("待删除参数", removeWpIds.size());
@@ -453,4 +475,11 @@ public class WbsParamController {
         return R.fail("执行异常");
     }
 
+    public <T> void  batchDel(BaseService<T> sv,List<Long> list){
+        if(sv!=null&&Func.isNotEmpty(list)) {
+            List<List<Long>> removeWpIdsList = BaseUtils.splitList(list, 1000);
+            removeWpIdsList.forEach(sv::deleteLogic);
+        }
+    }
+
 }

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

@@ -400,7 +400,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
      * @return
      */
     @Override
-    public Long getNextPkeyIdByNodeType(Long pkeyId, Long nodeType) {
+    public Long getNextPkeyIdByNodeType(Long pkeyId, Integer nodeType) {
         WbsTreeContract one = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
         if (one != null) {
 

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

@@ -29,5 +29,6 @@ public interface IWbsParamService extends BaseService<WbsParam> {
     List<WbsParam> findByNodeId(Long nodeId);
 
     List<WbsTreeContract> chain(Long contractId, Long id, Long pkId, WbsTreeContract wbsTreeContract);
-    public List<WbsTreeContract> tracing(@NotNull Long pkeyId);
+     List<WbsTreeContract> tracing(@NotNull Long pkeyId);
+    void duplicate(Long nodeId);
 }

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

@@ -462,7 +462,7 @@ public class ArTreeContractInitServiceImpl {
             //设置关联
             archiveTree.setExtType(1);
             archiveTree.setExtId(wbsTreeVO2.getId());
-            archiveTree.setExtKeyId(wbsTreeVO2.getId());
+            archiveTree.setExtKeyId(wbsTreeVO2.getPKeyId());
             archiveTree.setExtAttachId(subTree.getId());
             archiveTree.setSort(wbsTreeVO2.getSort());
             archiveTree.setDisplayHierarchy(level.toString());

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

@@ -186,11 +186,12 @@ public class ArchiveAutoRuleSyncImpl {
                     }
                 }
             }
-
-
             //archiveAutoType  与系统级一致  不用处理
             //archiveAutoGroupSelect  与系统级一致 不用处理
             //archiveAutoGroupId 与系统级一致 不用处理
+
+            //TODO 挂载WBS节点的系统级规则同步  用当前项目级的wbs节点-》找出对应系统级WBS节点-》找出m_archive_auto_rule_wbs里系统级的规则-》最后在m_archive_auto_rule_wbs添加对应的项目级规则
+            //TODO 挂载WBS节点是否在vo2Map.values()中待验证
         }
     }
 

+ 4 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -1023,7 +1023,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * @param level
 	 * @return
 	 */
-	public Long getWbsKeyIdFromLayer(Long keyId,Long level){
+	public Long getWbsKeyIdFromLayer(Long keyId,Integer level){
 		return wbsTreeContractClient.getNextPkeyIdByNodeType(keyId,level);
 	}
 
@@ -1060,13 +1060,13 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		for (ArchiveTreeContract associatedNode:associatedNodes) {
 			Long attachId = associatedNode.getId();
 
-			Long level = null;
+			Integer level = null;
 			if (associatedNode.getDisplayHierarchy()!= null) {
-				level = Long.parseLong(associatedNode.getDisplayHierarchy());
+				level = Integer.valueOf(associatedNode.getDisplayHierarchy());
 			}
 
 			Long levelkeyId = getWbsKeyIdFromLayer(keyId,level);
-			ArchiveTreeContract node = getWbsNodeFromWbsKeyId(contractId,keyId,attachId);
+			ArchiveTreeContract node = getWbsNodeFromWbsKeyId(contractId,levelkeyId,attachId);
 			if (node!= null ) {
 
 				archiveFileClient.addOrUpdateArchiveFileBusinessData(node.getId(),keyId,contractId,formDataId);

+ 79 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -1,11 +1,13 @@
 package org.springblade.manager.service.impl;
 
+import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.BaseUtils;
+import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
@@ -14,9 +16,12 @@ import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.mapper.WbsParamMapper;
+import org.springblade.manager.service.IElementFormulaMappingService;
+import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.IWbsParamService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -33,6 +38,10 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsParam> implements IWbsParamService {
     private final IWbsTreeContractService treeContractService;
+    private final IElementFormulaMappingService elementFormulaMappingService;
+    private final IFormulaService formulaService;
+    private final JdbcTemplate jdbcTemplate;
+
     private static final String NOT_SET = "还未配置提名规则";
     /**
      * 文件题名
@@ -44,7 +53,6 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
     public String createFileTitle(Long nodeId, Long contractId, WbsTreeContract wbsTreeContract) {
         if (BaseUtils.isNotNull(nodeId, contractId)) {
             StaticLog.info("获取节点{}文件题名", nodeId);
-          //  List<WbsTreeContract> nodes = chain(contractId, nodeId, wbsTreeContract.getPKeyId(), wbsTreeContract);
             List<WbsTreeContract> nodes = tracing(wbsTreeContract.getPKeyId());
             if (Func.isNotEmpty(nodes)) {
                 /*优先取私有*/
@@ -82,6 +90,76 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return new ArrayList<>();
     }
 
+    @Override
+    public void duplicate(Long nodeId) {
+        try {
+            StopWatch stopWatch = new StopWatch();
+            stopWatch.start("节点参数查重及删除");
+            List<Map<String, Object>> mapList = this.jdbcTemplate.queryForList("select  node_id nodeId,k,count(*) num from m_wbs_param  where is_deleted=0 and type=1 and node_id="+nodeId+" GROUP BY node_id,k HAVING count(*)>1");
+            if (!mapList.isEmpty()) {
+                List<WbsParam> list = this.list(Wrappers.<WbsParam>lambdaQuery().in(WbsParam::getNodeId, mapList.stream().map(m -> m.get("nodeId")).collect(Collectors.toList())));
+                List<Long> removeWpIds = new ArrayList<>();
+                List<Long> removeMapingIds = new ArrayList<>();
+                List<Long> removeFormulaIds = new ArrayList<>();
+                Map<Long, Map<String, List<WbsParam>>> group = list.stream().collect(Collectors.groupingBy(WbsParam::getNodeId, LinkedHashMap::new, Collectors.groupingBy(WbsParam::getK)));
+                group.values().forEach(m -> {
+                    m.forEach((k, v) -> {
+                        List<Map<String, Object>> relationMap = this.jdbcTemplate.queryForList("select a.id paramId,b.id mappingId,b.formula_id formulaId from m_wbs_param a join m_element_formula_mapping b on a.id=b.param_id where b.scope=35 and a.id in(" + v.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining("','", "'", "'")) + ") order by  b.update_time desc");
+                        if (!relationMap.isEmpty()) {
+                            Object id = relationMap.get(0).get("paramId");
+                            removeWpIds.addAll(v.stream().map(WbsParam::getId).filter(eId -> !StringUtils.isNotEquals(id, eId)).collect(Collectors.toList()));
+                            /*同一道工序下,一个节点参数可能会关联多个元素,除了保留参数关联的以外全部添加到待删除列表*/
+                            relationMap.stream().filter(x -> StringUtils.isNotEquals(x.get("paramId"), id)).forEach(e -> {
+                                removeMapingIds.add(Long.parseLong(e.get("mappingId").toString()));
+                                removeFormulaIds.add(Long.parseLong(e.get("formulaId").toString()));
+                            });
+                        } else {
+                            removeWpIds.addAll(v.stream().skip(1).map(WbsParam::getId).collect(Collectors.toList()));
+                        }
+                    });
+                });
+                System.out.println("查找到重复参数" + list.size() + "个");
+                System.out.println("待删除参数" + removeWpIds.size() + "个");
+                System.out.println("待删除中间关联" + removeMapingIds.size() + "个");
+                System.out.println("待删除公式" + removeFormulaIds.size() + "个");
+                Map<String, Integer> result = new HashMap<>();
+                result.put("查找到重复参数", list.size());
+                result.put("待删除参数", removeWpIds.size());
+                result.put("待删除中间关联", removeMapingIds.size());
+                result.put("待删除公式", removeFormulaIds.size());
+//                if(removeWpIds.size()>0) {
+//                    this.deleteLogic(removeWpIds);
+//                }
+//                if(removeMapingIds.size()>0){
+//                    this.elementFormulaMappingService.deleteLogic(removeMapingIds);
+//                }
+//                if(removeFormulaIds.size()>0){
+//                    this.formulaService.deleteLogic(removeFormulaIds);
+//                }
+                if(removeWpIds.size()>0) {
+                    batchDel(this,removeWpIds);
+                }
+                if(removeMapingIds.size()>0){
+                    batchDel(this.elementFormulaMappingService,removeMapingIds);
+                }
+                if(removeFormulaIds.size()>0){
+                    batchDel(this.formulaService,removeFormulaIds);
+                }
+                stopWatch.stop();
+                Long totalTime = stopWatch.getTotalTimeMillis();
+                StaticLog.info("公式执行用时:{},删除情况:{}", totalTime,result);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    public <T> void  batchDel(BaseService<T> sv, List<Long> list){
+        if(sv!=null&&Func.isNotEmpty(list)) {
+            List<List<Long>> removeWpIdsList = BaseUtils.splitList(list, 1000);
+            removeWpIdsList.forEach(sv::deleteLogic);
+        }
+    }
+
     @Override
     public List<WbsParam> findByNodeId(Long nodeId) {
         if (nodeId != null) {

+ 45 - 35
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -845,10 +845,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     List<Map<String, Object>> mapsList = jdbcTemplate.queryForList("select * from " + initTabName + " where p_key_id = " + pKeyId);
                     if (mapsList.size() > 0) {
                         LinkedCaseInsensitiveMap<Object> maps = (LinkedCaseInsensitiveMap<Object>) mapsList.get(0);
+                        maps.entrySet().removeIf(entry -> entry.getValue() == null || entry.getValue().toString().trim().isEmpty()); //排除空串
                         LinkedHashMap<String, Object> resultMaps = new LinkedHashMap<>(maps);
-                        resultMaps.entrySet().removeIf(entry -> entry.getValue() == null || entry.getValue().toString().trim().isEmpty()); //排除空串
-
                         for (Map.Entry<String, Object> obj : resultMaps.entrySet()) {
+                            List<String> values = new ArrayList<>();
+
                             String key = obj.getKey();
                             Object value = obj.getValue();
 
@@ -928,25 +929,37 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                                 //下拉框
                                                 tdJL = docJL.select("el-select[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
                                             }
-
-                                            if (tdJL.size() >= 1) {
+                                            if (tdJL.size() == 1) {
+                                                Element element = tdJL.get(0);
+                                                String keyname = element.attr("keyname");
+                                                if (StringUtils.isNotEmpty(keyname)) {
+                                                    String[] keynameJL = keyname.split("__");
+                                                    String keyJL = keynameJL[0];
+                                                    String keyJLIndex = keynameJL[1];
+
+                                                    InsertDataVO vo = new InsertDataVO();
+                                                    vo.setPKeyId(pKeyIdJL);
+                                                    vo.setInitTabName(initTabNameJL);
+                                                    if (keyJL.length() > 3) { //排除key=key的时候,也就是找不到key值,正常为key_X
+                                                        vo.setKey(keyJL);
+                                                        vo.setData(data + "_^_" + keyJLIndex);
+                                                        resultData.add(vo);
+                                                    }
+                                                }
+                                            } else if (tdJL.size() > 1) { //存在跨单元格,但是数据是100.2391_^_28_4这个格式的,也就是一列只填了一个值,那么不存在☆符号,就会到这里 "非跨单元格(一个单元格)"判断中
                                                 for (Element element : tdJL) {
                                                     String keyname = element.attr("keyname");
                                                     if (StringUtils.isNotEmpty(keyname)) {
                                                         String[] keynameJL = keyname.split("__");
                                                         String keyJL = keynameJL[0];
-                                                        String keyJLIndex = keynameJL[1];
-
-                                                        InsertDataVO vo = new InsertDataVO();
-                                                        vo.setPKeyId(pKeyIdJL);
-                                                        vo.setInitTabName(initTabNameJL);
                                                         if (keyJL.length() > 3) { //排除key=key的时候,也就是找不到key值,正常为key_X
-                                                            vo.setKey(keyJL);
-                                                            vo.setData(data + "_^_" + keyJLIndex);
-                                                            resultData.add(vo);
+                                                            String keyJLIndex = keynameJL[1];
+                                                            if (keyJLIndex.equals(index)) { //位置相同才复制
+                                                                values.add(data + "_^_" + keyJLIndex + "---" + keyJL + "---" + placeholderValue + "tabId:" + pKeyId);
+                                                                break;
+                                                            }
                                                         }
                                                     }
-                                                    break;
                                                 }
                                             }
                                         }
@@ -956,9 +969,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 //跨单元格(多个单元格)
                             } else if (value.toString().contains("_^_") && value.toString().contains("☆")) {
                                 String[] oneCells = value.toString().split("☆"); //一个单元格
-
-                                List<String> values = new ArrayList<>();
-
                                 for (String cell : oneCells) {
                                     String[] fieldArr = cell.split("_\\^_");
                                     String data = fieldArr[0];
@@ -1056,26 +1066,26 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                         }
                                     }
                                 }
+                            }
 
-                                Set<String> dataResult = new HashSet<>();
-                                Set<String> keyResult = new HashSet<>();
-                                Set<String> nameResult = new HashSet<>();
-                                for (String v : values) {
-                                    String[] split1 = v.split("---");
-                                    dataResult.add(split1[0]);
-                                    keyResult.add(split1[1]);
-                                    nameResult.add(split1[2]);
-                                }
-                                if (dataResult.size() > 0 && keyResult.size() > 0) {
-                                    InsertDataVO vo = new InsertDataVO();
-                                    vo.setPKeyId(pKeyIdJL);
-                                    vo.setInitTabName(initTabNameJL);
-                                    vo.setKey(keyResult.stream().findAny().orElse(null));
-                                    vo.setData(StringUtils.join(dataResult, "☆"));
-                                    vo.setDataLength(vo.getData().length());
-                                    vo.setName(nameResult.stream().findAny().orElse(null));
-                                    resultData.add(vo);
-                                }
+                            Set<String> dataResult = new HashSet<>();
+                            Set<String> keyResult = new HashSet<>();
+                            Set<String> nameResult = new HashSet<>();
+                            for (String v : values) {
+                                String[] split1 = v.split("---");
+                                dataResult.add(split1[0]);
+                                keyResult.add(split1[1]);
+                                nameResult.add(split1[2]);
+                            }
+                            if (dataResult.size() > 0 && keyResult.size() > 0) {
+                                InsertDataVO vo = new InsertDataVO();
+                                vo.setPKeyId(pKeyIdJL);
+                                vo.setInitTabName(initTabNameJL);
+                                vo.setKey(keyResult.stream().findAny().orElse(null));
+                                vo.setData(StringUtils.join(dataResult, "☆"));
+                                vo.setDataLength(vo.getData().length());
+                                vo.setName(nameResult.stream().findAny().orElse(null));
+                                resultData.add(vo);
                             }
                         }
                     }

+ 45 - 38
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -41,6 +41,8 @@ import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SqlParameterValue;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -50,9 +52,12 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.sql.Timestamp;
+import java.sql.Types;
 import java.time.LocalDateTime;
 import java.io.*;
 import java.util.*;
+import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -897,7 +902,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
     @Override
     public boolean syncNodeParam(String projectId, String pKeyId) {
-        projectId = null;//暂不执行
+       // projectId = null;//暂不执行
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(pKeyId)) {
             ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
             //当前选择同步的节点信息
@@ -905,26 +910,31 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             if (selectNodeNow == null) {
                 throw new ServiceException("未获取到当前选择同步的节点信息,请联系管理员");
             }
-
-            //获取当前选择的节点与它所有子节点
-            List<WbsTreePrivate> selectNodeAndChildNodes = Optional.ofNullable(this.getChildNodes(selectNodeNow)).orElse(new ArrayList<>());
-            selectNodeAndChildNodes.add(selectNodeNow);
-            List<Long> privateNodeIds = selectNodeAndChildNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
-            List<Long> privateNodePKeyIds = selectNodeAndChildNodes.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
             if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
                 // ---------私有才需要引用同步---------节点参数nodeId绑定的是m_wbs_private 的p_key_id  ;同节点下mapping scope=35 共用一个formula;也就是说同一个节点下的同一个element都指向同一个公式
                 /*全部查出来,pkeyId-id-paramId  source:key  最后比较;同节点相同k的参数都指向同一个公式,mapping 对象除了elementId不一样其它都一样*/
                 /*同步的范围不一定是整棵树,可以是局部分支*/
                 //获取当前私有引用模板的根节点信息
-                WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                        .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
+                WbsTreePrivate sourceRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
                         .eq(WbsTreePrivate::getPKeyId, selectNodeNow.getWbsId()).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-                List<Map<String, Object>> sourceListMap = this.jdbcTemplate.queryForList("select a.id,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
-                        "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.id in(?) and a.is_deleted=0  and a.type=1 ", treePrivateRootNode.getProjectId(), privateNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")));
-                List<Map<String, Object>> distListMap = this.jdbcTemplate.queryForList("select a.id,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
-                        "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in(?) and a.is_deleted=0  and a.type=1 ", projectId, privateNodePKeyIds.stream().map(Object::toString).collect(Collectors.joining(",")));
-                Map<String, Map<String, Object>> sourceMap = sourceListMap.stream().collect(Collectors.toMap(m -> m.get("privateId").toString() + m.get("k"), m -> m));
-                Map<String, Map<String, Object>> distMap = distListMap.stream().collect(Collectors.toMap(m -> m.get("privateId").toString() + m.get("k"), m -> m));
+
+                List<WbsTreePrivate> selectNodeAndChildNodes = Optional.ofNullable(this.getChildNodes(selectNodeNow)).orElse(new ArrayList<>());
+                selectNodeAndChildNodes.add(selectNodeNow);
+                List<Long> sourceNodeIds = jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id in("+selectNodeAndChildNodes.stream().map(WbsTreePrivate::getId).map(Object::toString).collect(Collectors.joining(","))+") and  is_deleted=0 and project_id ="+sourceRootNode.getProjectId(),Long.class);
+                List<Long> distNodeIds = selectNodeAndChildNodes.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                List<Map<String, Object>> sourceListMap = this.jdbcTemplate.queryForList("select a.id,a.name ,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
+                        "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in("+sourceNodeIds.stream().map(Object::toString).collect(Collectors.joining(","))+") and a.is_deleted=0  and a.type=1 ",  Long.parseLong(sourceRootNode.getProjectId()));
+                List<Map<String, Object>> distListMap = this.jdbcTemplate.queryForList("select a.id,a.name,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
+                        "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in("+distNodeIds.stream().map(Object::toString).collect(Collectors.joining(","))+") and a.is_deleted=0  and a.type=1 ", Long.parseLong(projectId));
+
+                /*存在多个同名参数;保留日期最新那个参数*/
+                BinaryOperator<Map<String,Object>> mapBinaryOperator= (m1, m2) -> {
+                    LocalDateTime sldt = ((Timestamp)m1.get("updateTime")).toLocalDateTime();
+                    LocalDateTime tldt = ((Timestamp)m2.get("updateTime")).toLocalDateTime();
+                    return sldt.isAfter(tldt)?m1:m2;
+                };
+                Map<String, Map<String, Object>> sourceMap = sourceListMap.stream().collect(Collectors.toMap(m -> m.get("privateId").toString() + m.get("k"), m -> m,mapBinaryOperator));
+                Map<String, Map<String, Object>> distMap = distListMap.stream().collect(Collectors.toMap(m -> m.get("privateId").toString() + m.get("k"), m -> m,mapBinaryOperator));
                 /*比较的结果*/
                 Map<String, Map<String, Object>> updateMap = new HashMap<>();
                 Map<String, Map<String, Object>> insertMap = new HashMap<>();
@@ -934,8 +944,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         Map<String, Object> u = distMap.get(k);
                         String t = Func.toStr(u.get("v"));
                         if (!s.equals(t)) {
-                            LocalDateTime sldt = LocalDateTime.parse(Func.toStr(v.get("updateTime")));
-                            LocalDateTime tldt = LocalDateTime.parse(Func.toStr(u.get("updateTime")));
+                            LocalDateTime sldt = ((Timestamp)v.get("updateTime")).toLocalDateTime();
+                            LocalDateTime tldt = ((Timestamp)u.get("updateTime")).toLocalDateTime();
                             /*假如内容不一样,且模版最后更新时间更晚,则覆盖*/
                             if (sldt.isAfter(tldt)) {
                                 u.put("v", s);
@@ -959,7 +969,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 }
                 List<WbsParam> insertList = new ArrayList<>();
                 if (!insertMap.isEmpty()) {
-                    List<WbsTreePrivate> targetList = Optional.ofNullable(this.list(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getId, insertMap.values().stream().map(m -> m.get("privateId")).collect(Collectors.toList())))).orElse(new ArrayList<>());
+                    List<WbsTreePrivate> targetList = Optional.ofNullable(this.list(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId,projectId).in(WbsTreePrivate::getId, insertMap.values().stream().map(m -> m.get("privateId")).collect(Collectors.toList())))).orElse(new ArrayList<>());
                     targetList.forEach(e -> {
                         Map<String, Object> kmp = insertMap.get(e.getId().toString());
                         if (kmp != null) {
@@ -998,32 +1008,26 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 "select c.e_name as name ,c.id,a.p_key_id pKeyId from m_wbs_tree_private a " +
                                         "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
                                         "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
-                                        "where  b.project_id=" + projectId + " and a.p_key_id in(?)  and b.is_deleted=0 and c.is_deleted=0 ", nodeIds);
+                                        "where  b.project_id=" + projectId + " and a.p_key_id in("+String.join(",",nodeIds)+")  and b.is_deleted=0 and c.is_deleted=0 ");
 
                         Map<String, List<Map<String, Object>>> groupElementNode = listMaps.stream().collect(Collectors.groupingBy(e -> Func.toStr(e.get("pKeyId"))));
                         List<ElementFormulaMapping> insertEfm = new ArrayList<>();
                         insertList.forEach(p -> {
                             List<Map<String, Object>> elementMap = groupElementNode.get(p.getNodeId().toString());
                             Formula formula = insertFormulaMap.get(p.getId());
-                            elementMap.forEach(m -> {
-                                if (com.mixsmart.utils.StringUtils.handleNull(m.get("name")).contains(p.getName())) {
-                                    /*匹配名称,且该元素没有绑定任何节点参数公式*/
-//                                    if (longList.stream().noneMatch(k -> com.mixsmart.utils.StringUtils.isEquals(k, m.get("id")))) {
-//                                        ElementFormulaMapping efm = new ElementFormulaMapping();
-//                                        efm.setScope(FormulaBean.PARAM);
-//                                        efm.setParamId(e.getId());
-//                                        efm.setElementId(Long.parseLong(m.get("id").toString()));
-//                                        efm.setFormulaId(finalFormula.getId());
-//                                        this.elementFormulaMappingService.save(efm);
-//                                    }
-                                    ElementFormulaMapping efm = new ElementFormulaMapping();
-                                    efm.setScope(FormulaBean.PARAM);
-                                    efm.setParamId(p.getId());
-                                    efm.setElementId(Long.parseLong(m.get("id").toString()));
-                                    efm.setFormulaId(formula.getId());
-                                    insertEfm.add(efm);
-                                }
-                            });
+                           if(Func.isNotEmpty(elementMap)) {
+                               elementMap.forEach(m -> {
+                                   if (com.mixsmart.utils.StringUtils.handleNull(m.get("name")).contains(p.getName())) {
+                                       /*匹配名称,且该元素没有绑定任何节点参数公式*/
+                                       ElementFormulaMapping efm = new ElementFormulaMapping();
+                                       efm.setScope(FormulaBean.PARAM);
+                                       efm.setParamId(p.getId());
+                                       efm.setElementId(Long.parseLong(m.get("id").toString()));
+                                       efm.setFormulaId(formula.getId());
+                                       insertEfm.add(efm);
+                                   }
+                               });
+                           }
                         });
                         if (insertFormulaMap.size() > 0) {
                             this.formulaService.saveBatch(insertFormulaMap.values(), 1000);
@@ -1039,6 +1043,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return false;
     }
 
+
+
+
     @Override
     public R<String> syncPrivateProjectFormula(Long projectId, Long pKeyId) {
         if (projectId != null && pKeyId != null) {

+ 0 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java

@@ -61,7 +61,6 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @AllArgsConstructor
 @RequestMapping("/dept")
 @Api(value = "部门", tags = "部门")
-@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
 public class DeptController extends BladeController {
 
     private final IDeptService deptService;

+ 2 - 0
blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java

@@ -317,8 +317,10 @@ public class MenuController extends BladeController {
 
         //接口
         vo.setApiScope(menuService.apiScopeTreeKeys(roleIds));
+
         // 内控系统
         vo.setHacMenu(menuService.apiScopeTreeKeys(roleIds));
+
         //征拆系统
         vo.setLarMenu(menuService.apiScopeTreeKeys(roleIds));
 

+ 0 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java

@@ -72,7 +72,6 @@ public class TenantController extends BladeController {
     @GetMapping("/detail")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "详情", notes = "传入tenant")
-    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
     public R<Tenant> detail(Tenant tenant) {
         Tenant detail = tenantService.getOne(Condition.getQueryWrapper(tenant));
         return R.data(detail);

+ 1 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java

@@ -83,4 +83,5 @@ public interface RoleMapper extends BaseMapper<Role> {
 
     List<RoleTypeVO> getRoleInfoByParentId(String ParentId);
 
+    List<Role> getRoleDeptInfoByParentId(String ParentId);
 }

+ 10 - 3
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml

@@ -77,13 +77,12 @@
         SELECT
         role_alias
         FROM
-        blade_role
+        c_role_dept_info
         WHERE
         id IN
         <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">
             #{ids}
         </foreach>
-        and is_deleted = 0
     </select>
 
     <select id="selectRoleAndTableOwnerListByRoleId" resultType="org.springblade.manager.entity.WbsTableOwnerRole">
@@ -101,7 +100,15 @@
     </select>
 
     <select id="getRoleInfoByParentId" resultMap="RoleTypeVOMap">
-        select id,id as `value`,role_name as label from blade_role where is_deleted = 0 and parent_id=#{ParentId}
+        select id, id as `value`, role_name as label
+        from blade_role
+        where is_deleted = 0
+          and parent_id = #{ParentId}
     </select>
 
+    <select id="getRoleDeptInfoByParentId" resultMap="roleResultMap">
+        select *
+        from c_role_dept_info
+        where parent_id = #{ParentId}
+    </select>
 </mapper>

+ 139 - 111
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -107,59 +107,75 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 
         // 组装配置-后台
         List<RoleMenu> roleMenus = new ArrayList<>();
-        roleIds.forEach(roleId -> menuIds.forEach(menuId -> {
-            RoleMenu roleMenu = new RoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(Long.valueOf(menuId.split("---")[0]));
-            roleMenu.setStatus(menuId.split("---")[1]);
-            roleMenus.add(roleMenu);
-        }));
-
+        if (menuIds != null && menuIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuIds.forEach(menuId -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuId.split("---")[0]));
+                roleMenu.setStatus(menuId.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
         // 组装配置-客户端
-        roleIds.forEach(roleId -> menuClientIds.forEach(menuIdC -> {
-            RoleMenu roleMenu = new RoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
-            roleMenu.setStatus(menuIdC.split("---")[1]);
-            roleMenus.add(roleMenu);
-        }));
-
+        if (menuClientIds != null && menuClientIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuClientIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
         // 组装配置-档案
-        roleIds.forEach(roleId -> menuArchivesIds.forEach(menuIdC -> {
-            RoleMenu roleMenu = new RoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
-            roleMenu.setStatus(menuIdC.split("---")[1]);
-            roleMenus.add(roleMenu);
-        }));
-
+        if (menuArchivesIds != null && menuArchivesIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuArchivesIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
         // 组装配置-内控
-        roleIds.forEach(roleId -> menuHacIds.forEach(menuIdC -> {
-            RoleMenu roleMenu = new RoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
-            roleMenu.setStatus(menuIdC.split("---")[1]);
-            roleMenus.add(roleMenu);
-        }));
-
+        if (menuHacIds != null && menuHacIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuHacIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
         // 组装配置-征拆
-        roleIds.forEach(roleId -> menuLarIds.forEach(menuIdC -> {
-            RoleMenu roleMenu = new RoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
-            roleMenu.setStatus(menuIdC.split("---")[1]);
-            roleMenus.add(roleMenu);
-        }));
-
+        if (menuLarIds != null && menuLarIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuLarIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
         // 新增配置
-        roleMenuService.saveBatch(roleMenus);
-
+        boolean b = roleMenuService.saveBatch(roleMenus);
+        System.out.println("ddd");
         // 递归设置下属角色菜单集合
-        recursionRoleMenu(roleIds, menuIds);
-        recursionRoleMenu(roleIds, menuClientIds);
-        recursionRoleMenu(roleIds, menuArchivesIds);
-        recursionRoleMenu(roleIds, menuHacIds); //内控
-        recursionRoleMenu(roleIds, menuLarIds); //征拆
+        if (menuIds != null && menuIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuIds);
+        }
+        if (menuClientIds != null && menuClientIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuClientIds);
+        }
+        if (menuArchivesIds != null && menuArchivesIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuArchivesIds);
+        }
+        if (menuHacIds != null && menuHacIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuHacIds); //内控
+        }
+        if (menuLarIds != null && menuLarIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuLarIds); //征拆
+        }
+
         return true;
     }
 
@@ -171,50 +187,58 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
             String id = split[0]; //id
             menuIds.add(Long.valueOf(id));
         }
-        roleIds.forEach(roleId -> baseMapper.selectList(Wrappers.<Role>query().lambda().eq(Role::getParentId, roleId)).forEach(role -> {
-            List<RoleMenu> roleMenuList = roleMenuService.list(Wrappers.<RoleMenu>query().lambda().eq(RoleMenu::getRoleId, role.getId()));
-            // 子节点过滤出父节点删除的菜单集合
-            List<Long> collectRoleMenuIds = roleMenuList.stream().map(RoleMenu::getMenuId).filter(menuId -> !menuIds.contains(menuId)).collect(Collectors.toList());
-            if (collectRoleMenuIds.size() > 0) {
-                // 删除子节点权限外的菜单集合
-                roleMenuService.remove(Wrappers.<RoleMenu>update().lambda().eq(RoleMenu::getRoleId, role.getId()).in(RoleMenu::getMenuId, collectRoleMenuIds));
-                // 递归设置下属角色菜单集合
-                recursionRoleMenu(Collections.singletonList(role.getId()), menuIdsAll);
-            }
-        }));
+        //
+        for (Long roleId : roleIds) {
+            List<Role> roleList = roleMapper.getRoleDeptInfoByParentId(roleId + "");
+            roleList.forEach(role -> {
+                List<RoleMenu> roleMenuList = roleMenuService.list(Wrappers.<RoleMenu>query().lambda().eq(RoleMenu::getRoleId, role.getId()));
+                // 子节点过滤出父节点删除的菜单集合
+                List<Long> collectRoleMenuIds = roleMenuList.stream().map(RoleMenu::getMenuId).filter(menuId -> !menuIds.contains(menuId)).collect(Collectors.toList());
+                if (collectRoleMenuIds.size() > 0) {
+                    // 删除子节点权限外的菜单集合
+                    roleMenuService.remove(Wrappers.<RoleMenu>update().lambda().eq(RoleMenu::getRoleId, role.getId()).in(RoleMenu::getMenuId, collectRoleMenuIds));
+                    // 递归设置下属角色菜单集合
+                    recursionRoleMenu(Collections.singletonList(role.getId()), menuIdsAll);
+                }
+            });
+        }
     }
 
     private boolean grantDataScope(List<Long> roleIds, List<Long> dataScopeIds) {
         // 删除角色配置的数据权限集合
-        roleScopeService.remove(Wrappers.<RoleScope>update().lambda().eq(RoleScope::getScopeCategory, DATA_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds));
-        // 组装配置
-        List<RoleScope> roleDataScopes = new ArrayList<>();
-        roleIds.forEach(roleId -> dataScopeIds.forEach(scopeId -> {
-            RoleScope roleScope = new RoleScope();
-            roleScope.setScopeCategory(DATA_SCOPE_CATEGORY);
-            roleScope.setRoleId(roleId);
-            roleScope.setScopeId(scopeId);
-            roleDataScopes.add(roleScope);
-        }));
-        // 新增配置
-        roleScopeService.saveBatch(roleDataScopes);
+        if (roleIds != null && roleIds.size() >= 1 && dataScopeIds != null && dataScopeIds.size() >= 1) {
+            roleScopeService.remove(Wrappers.<RoleScope>update().lambda().eq(RoleScope::getScopeCategory, DATA_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds));
+            // 组装配置
+            List<RoleScope> roleDataScopes = new ArrayList<>();
+            roleIds.forEach(roleId -> dataScopeIds.forEach(scopeId -> {
+                RoleScope roleScope = new RoleScope();
+                roleScope.setScopeCategory(DATA_SCOPE_CATEGORY);
+                roleScope.setRoleId(roleId);
+                roleScope.setScopeId(scopeId);
+                roleDataScopes.add(roleScope);
+            }));
+            // 新增配置
+            roleScopeService.saveBatch(roleDataScopes);
+        }
         return true;
     }
 
     private boolean grantApiScope(List<Long> roleIds, List<Long> apiScopeIds) {
-        // 删除角色配置的接口权限集合
-        roleScopeService.remove(Wrappers.<RoleScope>update().lambda().eq(RoleScope::getScopeCategory, API_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds));
-        // 组装配置
-        List<RoleScope> roleApiScopes = new ArrayList<>();
-        roleIds.forEach(roleId -> apiScopeIds.forEach(scopeId -> {
-            RoleScope roleScope = new RoleScope();
-            roleScope.setScopeCategory(API_SCOPE_CATEGORY);
-            roleScope.setScopeId(scopeId);
-            roleScope.setRoleId(roleId);
-            roleApiScopes.add(roleScope);
-        }));
-        // 新增配置
-        roleScopeService.saveBatch(roleApiScopes);
+        if (roleIds != null && roleIds.size() >= 1 && apiScopeIds != null && apiScopeIds.size() >= 1) {
+            // 删除角色配置的接口权限集合
+            roleScopeService.remove(Wrappers.<RoleScope>update().lambda().eq(RoleScope::getScopeCategory, API_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds));
+            // 组装配置
+            List<RoleScope> roleApiScopes = new ArrayList<>();
+            roleIds.forEach(roleId -> apiScopeIds.forEach(scopeId -> {
+                RoleScope roleScope = new RoleScope();
+                roleScope.setScopeCategory(API_SCOPE_CATEGORY);
+                roleScope.setScopeId(scopeId);
+                roleScope.setRoleId(roleId);
+                roleApiScopes.add(roleScope);
+            }));
+            // 新增配置
+            roleScopeService.saveBatch(roleApiScopes);
+        }
         return true;
     }
 
@@ -317,46 +341,50 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 
     @Transactional(rollbackFor = Exception.class)
     public Boolean submitRoleAndTableOwner(List<Long> roleIds, List<Long> tableOwners) {
-        for (Long role : roleIds) {
-            List<WbsTableOwnerRole> list = baseMapper.selectRoleAndTableOwnerListByRoleId(role);
+        if (tableOwners != null && tableOwners.size() >= 1) {
+            for (Long role : roleIds) {
+                List<WbsTableOwnerRole> list = baseMapper.selectRoleAndTableOwnerListByRoleId(role);
 
-            List<String> tableOwnerValuesIn = list.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
+                List<String> tableOwnerValuesIn = list.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
 
-            List<String> tableOwnerValuesOut = tableOwners.stream().map(String::valueOf).collect(Collectors.toList());
+                List<String> tableOwnerValuesOut = tableOwners.stream().map(String::valueOf).collect(Collectors.toList());
 
-            List<String> diffRent = getDiffRent(tableOwnerValuesOut, tableOwnerValuesIn);
+                List<String> diffRent = getDiffRent(tableOwnerValuesOut, tableOwnerValuesIn);
 
-            List<String> ids = new ArrayList<>();
+                List<String> ids = new ArrayList<>();
 
-            //获取ids
-            for (WbsTableOwnerRole wbsTableOwnerRole : list) {
-                for (String diff : diffRent) {
-                    if (wbsTableOwnerRole.getTableOwnerNumber().equals(diff)) {
-                        ids.add(String.valueOf(wbsTableOwnerRole.getId()));
+                //获取ids
+                for (WbsTableOwnerRole wbsTableOwnerRole : list) {
+                    for (String diff : diffRent) {
+                        if (wbsTableOwnerRole.getTableOwnerNumber().equals(diff)) {
+                            ids.add(String.valueOf(wbsTableOwnerRole.getId()));
+                        }
                     }
                 }
-            }
 
-            if (diffRent.size() == 0) {
-                return true;
-            } else {
-                if (tableOwnerValuesOut.size() > tableOwnerValuesIn.size()) {
-                    //新增
-                    for (String tableOwner : diffRent) {
-                        Long id = SnowFlakeUtil.getId();
-                        baseMapper.insertRoleAndTableOwner(id, role, tableOwner);
-                    }
+                if (diffRent.size() == 0) {
                     return true;
-
-                } else if (tableOwnerValuesOut.size() < tableOwnerValuesIn.size()) {
-                    //删除
-                    Integer row = baseMapper.deleteRoleAndTableOwner(ids);
-                    return row > 0;
+                } else {
+                    if (tableOwnerValuesOut.size() > tableOwnerValuesIn.size()) {
+                        //新增
+                        for (String tableOwner : diffRent) {
+                            Long id = SnowFlakeUtil.getId();
+                            baseMapper.insertRoleAndTableOwner(id, role, tableOwner);
+                        }
+                        return true;
+
+                    } else if (tableOwnerValuesOut.size() < tableOwnerValuesIn.size()) {
+                        //删除
+                        Integer row = baseMapper.deleteRoleAndTableOwner(ids);
+                        return row > 0;
+                    }
                 }
+                return false;
             }
-            return false;
+            return true;
+        } else {
+            return true;
         }
-        return false;
     }
 
     private static List<String> getDiffRent(List<String> list1, List<String> list2) {

+ 2 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -190,6 +190,7 @@ public class UserController {
             }
             user.setPostId(postId);
             user.setDeptId(deptId);
+            user.setRoleId(postId);
             user.setIsLeader(isLaderpostId);
         }
 
@@ -242,6 +243,7 @@ public class UserController {
             user.setIsLeader(isLaderpostId);
             user.setPostId(postId);
             user.setDeptId(deptId);
+            user.setRoleId(postId);
             user.setDeptInfo(JSONArray.toJSONString(deptList));
         }
         return R.status(userService.updateUser(user));

+ 1 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -337,6 +337,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 userInfo.setRoles(roleAlias);
             }
         }
+
         // 根据每个用户平台,建立对应的detail表,通过查询将结果集写入到detail字段
         Kv detail = Kv.create().set("type", userEnum.getName());
         if (userEnum == UserEnum.WEB) {