Преглед изворни кода

Merge remote-tracking branch 'origin/master'

liuyc пре 2 година
родитељ
комит
c158302c6e
33 измењених фајлова са 899 додато и 61 уклоњено
  1. 20 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanStatisticVO.java
  2. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectIncomeCostRatioVO.java
  3. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java
  4. 28 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectServiceProcessVO.java
  5. 27 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/RiskPlanByMonthOfYearVO.java
  6. 5 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
  7. 8 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/UserVO.java
  8. 4 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  9. 10 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  10. 75 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  11. 184 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileTransJavaDemo.java
  12. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  13. 83 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/HttpUtil.java
  14. 104 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/SpeechRecognizerRESTfulDemo.java
  15. 30 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  16. 18 7
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  17. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  18. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  19. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  20. 25 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  21. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  22. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  23. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  24. 6 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  25. 155 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  26. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  27. 3 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java
  28. 41 26
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  29. 3 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java
  30. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/PostMapper.xml
  31. 3 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  32. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  33. 7 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/wrapper/UserWrapper.java

+ 20 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanStatisticVO.java

@@ -0,0 +1,20 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param  门户普通权限,计划统计图
+ * @Author wangwl
+ * @Date 2023/6/30 14:32
+ **/
+@Data
+public class PlanStatisticVO {
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "计划总数")
+    private List<Integer> value;
+}

+ 22 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectIncomeCostRatioVO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Param  门户-统计项目收入占比,支出占比
+ * @Author wangwl
+ * @Date 2023/6/30 10:05
+ **/
+@Data
+public class ProjectIncomeCostRatioVO {
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "项目支出")
+    private Integer projectCost;
+
+    @ApiModelProperty(value = "项目收入")
+    private Integer projectIncome;
+
+}

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

@@ -21,7 +21,7 @@ public class ProjectProcessVO extends ProjectProcess {
     @ApiModelProperty(value = "进程状态值")
     private String statusValue;
 
-    @ApiModelProperty(value = "是否参与")
+    @ApiModelProperty(value = "是否参与,0未参与,1参与")
     private Integer isParticipate;
 
     @ApiModelProperty(value = "成本支出")

+ 28 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectServiceProcessVO.java

@@ -0,0 +1,28 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   门户-项目服务进程
+ * @Author wangwl
+ * @Date 2023/6/30 11:59
+ **/
+@Data
+public class ProjectServiceProcessVO {
+
+    @ApiModelProperty(value = "进程名称")
+    private String processName;
+
+    @ApiModelProperty(value = "进程执行进度条")
+    private Integer processProgressBar;
+
+    @ApiModelProperty(value = "进程已支出成本进度条")
+    private Integer processCostProgressBar;
+
+    @ApiModelProperty(value = "进程已支出成本金额")
+    private BigDecimal processCostCount;
+
+}

+ 27 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/RiskPlanByMonthOfYearVO.java

@@ -0,0 +1,27 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param  任务统计-风险计划
+ * @Author wangwl
+ * @Date 2023/6/30 16:01
+ **/
+@Data
+public class RiskPlanByMonthOfYearVO {
+    @ApiModelProperty(value = "计划名称")
+    private String name;
+
+    @ApiModelProperty(value = "格式")
+    private String type;
+
+    @ApiModelProperty(value = "格式")
+    private String stack;
+
+    @ApiModelProperty(value = "计划数量")
+    private List<Integer> data;
+
+}

+ 5 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java

@@ -164,4 +164,9 @@ public class User extends TenantEntity {
     @ApiModelProperty(value = "日单价")
     private Double oneMoney;
 
+    /**
+     * 职位
+     */
+    @ApiModelProperty(value = "机构信息")
+    private String deptInfo;
 }

+ 8 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/UserVO.java

@@ -26,6 +26,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.system.user.entity.User;
 
+import java.util.List;
+
 /**
  * 视图实体类
  *
@@ -96,4 +98,10 @@ public class UserVO extends User {
      */
     @ApiModelProperty(value = "拓展信息")
     private String userExt;
+
+    /**
+     * 组织机构
+     */
+    @ApiModelProperty(value = "组织机构对象(内控)")
+    private List<DeptUserVO> deptList;
 }

+ 4 - 6
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -37,6 +37,7 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -603,11 +604,8 @@ public class ArchivesAutoController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "file", value = "文件源", required = true)
 	})
-	public R putFileAttach(@RequestParam("file") MultipartFile file) {
-		String file_path = FileUtils.getSysLocalFileUrl();
-
-
-
-		return R.success("上传成功");
+	public R searchInfo(@RequestParam("file") MultipartFile file, BladeUser user) {
+		return archivesAutoService.searchInfo(file);
 	}
+
 }

+ 10 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -25,7 +25,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -86,13 +88,18 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	List<User> getArchiveDestroyUser();
 
-	List<Map<String,List<Map<String,String>>>> getArchivesCabinet(ArchivesAutoVO archivesAuto);
+	List<Map<String, List<Map<String, String>>>> getArchivesCabinet(ArchivesAutoVO archivesAuto);
 
 	R pageByArchivesAuto2(ArchivesAutoVO archivesAuto);
 
-    void getArchivesAuthByUser(Long projectId,Long contractId,Integer archiveType);
+	void getArchivesAuthByUser(Long projectId, Long contractId, Integer archiveType);
 
-    Long allArchiveFileSize(Long projectId);
+	Long allArchiveFileSize(Long projectId);
 
 	ArchivesAutoVO getArchiveFileList(Long id);
+
+
+	// 语音搜索
+	R searchInfo(MultipartFile file) throws IOException;
+
 }

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

@@ -16,14 +16,16 @@
  */
 package org.springblade.archive.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+
+import com.aliyun.oss.OSSClient;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -32,6 +34,7 @@ import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
+import org.springblade.archive.utils.FileTransJavaDemo;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
@@ -70,7 +73,11 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
@@ -315,6 +322,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return vo;
 	}
 
+
 	/**
 	 * 根据搜索获取档案柜
 	 * @param archivesAuto
@@ -2029,14 +2037,78 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				e.printStackTrace();
 				log.error("自动组卷报错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 				//设置自动组卷结束
-				contractClient.updateIsArchivesAutoById(contractId,0);
+				contractClient.updateIsArchivesAutoById(contractId, 0);
 			}
 		});
 	}
+
 	@Override
 	public List<User> getArchiveDestroyUser() {
 		return autoMapper.getArchiveDestroyUser();
 	}
 
 
+	/**
+	 * 语音搜索
+	 *
+	 * @param file
+	 * @return
+	 */
+	@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");
+
+		final String accessKeyId = "LTAI5tMwtPCL85iXbUtjLTxD";
+		final String accessKeySecret = "WiUW5ag7HhQZPNoMAoQSC5LuxD2kLw";
+		final String appKey = "IxV21DxuzHuc8Oe4";
+		//  String fileUrl = FileUtils.getSysLocalFileUrl()+"/voiceInfo/123456.wav";
+
+
+		///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);
+		if (taskId != null) {
+			System.out.println("录音文件识别请求成功,task_id: " + taskId);
+		} else {
+			System.out.println("录音文件识别请求失败!");
+		}
+		// 第二步:根据任务ID轮询识别结果。
+		String result = demo.getFileTransResult(taskId);
+		if (result != null) {
+			System.out.println("录音文件识别结果查询成功:" + result);
+			JSONObject dataInfo = JSONObject.parseObject(result);
+			JSONArray word = dataInfo.getJSONArray("Words");
+			JSONArray sentences = dataInfo.getJSONArray("Sentences");
+
+		} else {
+			System.out.println("录音文件识别结果查询失败!");
+		}
+
+		return R.data(json);
+	}
+
+
 }

+ 184 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileTransJavaDemo.java

@@ -0,0 +1,184 @@
+package org.springblade.archive.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+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;
+
+public class FileTransJavaDemo {
+    // 地域ID,常量,固定值。
+    public static final String REGIONID = "cn-shanghai";
+    public static final String ENDPOINTNAME = "cn-shanghai";
+    public static final String PRODUCT = "nls-filetrans";
+    public static final String DOMAIN = "filetrans.cn-shanghai.aliyuncs.com";
+    public static final String API_VERSION = "2018-08-17";  // 中国站版本
+    // public static final String API_VERSION = "2019-08-23";  // 国际站版本
+    public static final String POST_REQUEST_ACTION = "SubmitTask";
+    public static final String GET_REQUEST_ACTION = "GetTaskResult";
+    // 请求参数
+    public static final String KEY_APP_KEY = "appkey";
+    public static final String KEY_FILE_LINK = "file_link";
+    public static final String KEY_VERSION = "version";
+    public static final String KEY_ENABLE_WORDS = "enable_words";
+    // 响应参数
+    public static final String KEY_TASK = "Task";
+    public static final String KEY_TASK_ID = "TaskId";
+    public static final String KEY_STATUS_TEXT = "StatusText";
+    public static final String KEY_RESULT = "Result";
+    // 状态值
+    public static final String STATUS_SUCCESS = "SUCCESS";
+    private static final String STATUS_RUNNING = "RUNNING";
+    private static final String STATUS_QUEUEING = "QUEUEING";
+    // 阿里云鉴权client
+    IAcsClient client;
+
+    public FileTransJavaDemo(String accessKeyId, String accessKeySecret) {
+        // 设置endpoint
+        try {
+            DefaultProfile.addEndpoint(ENDPOINTNAME, REGIONID, PRODUCT, DOMAIN);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        // 创建DefaultAcsClient实例并初始化
+        DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
+        this.client = new DefaultAcsClient(profile);
+    }
+
+    public String submitFileTransRequest(String appKey, String fileLink) {
+        /**
+         * 1. 创建CommonRequest,设置请求参数。
+         */
+        CommonRequest postRequest = new CommonRequest();
+        // 设置域名
+        postRequest.setDomain(DOMAIN);
+        // 设置API的版本号,格式为YYYY-MM-DD。
+        postRequest.setVersion(API_VERSION);
+        // 设置action
+        postRequest.setAction(POST_REQUEST_ACTION);
+        // 设置产品名称
+        postRequest.setProduct(PRODUCT);
+        /**
+         * 2. 设置录音文件识别请求参数,以JSON字符串的格式设置到请求Body中。
+         */
+        JSONObject taskObject = new JSONObject();
+        // 设置appkey
+        taskObject.put(KEY_APP_KEY, appKey);
+        // 设置音频文件访问链接
+        taskObject.put(KEY_FILE_LINK, fileLink);
+        // 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。
+        taskObject.put(KEY_VERSION, "4.0");
+        // 设置是否输出词信息,默认为false,开启时需要设置version为4.0及以上。
+        taskObject.put(KEY_ENABLE_WORDS, true);
+
+        taskObject.put("enable_sample_rate_adaptive", true);
+
+        String task = taskObject.toJSONString();
+        System.out.println(task);
+        // 设置以上JSON字符串为Body参数。
+        postRequest.putBodyParameter(KEY_TASK, task);
+        // 设置为POST方式的请求。
+        postRequest.setMethod(MethodType.POST);
+        /**
+         * 3. 提交录音文件识别请求,获取录音文件识别请求任务的ID,以供识别结果查询使用。
+         */
+        String taskId = null;
+        try {
+            CommonResponse postResponse = client.getCommonResponse(postRequest);
+            System.err.println("提交录音文件识别请求的响应:" + postResponse.getData());
+            if (postResponse.getHttpStatus() == 200) {
+                JSONObject result = JSONObject.parseObject(postResponse.getData());
+                String statusText = result.getString(KEY_STATUS_TEXT);
+                if (STATUS_SUCCESS.equals(statusText)) {
+                    taskId = result.getString(KEY_TASK_ID);
+                }
+            }
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        return taskId;
+    }
+
+    public String getFileTransResult(String taskId) {
+        /**
+         * 1. 创建CommonRequest,设置任务ID。
+         */
+        CommonRequest getRequest = new CommonRequest();
+        // 设置域名
+        getRequest.setDomain(DOMAIN);
+        // 设置API版本
+        getRequest.setVersion(API_VERSION);
+        // 设置action
+        getRequest.setAction(GET_REQUEST_ACTION);
+        // 设置产品名称
+        getRequest.setProduct(PRODUCT);
+        // 设置任务ID为查询参数
+        getRequest.putQueryParameter(KEY_TASK_ID, taskId);
+        // 设置为GET方式的请求
+        getRequest.setMethod(MethodType.GET);
+        /**
+         * 2. 提交录音文件识别结果查询请求
+         * 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述为“SUCCESS”或错误描述,则结束轮询。
+         */
+        String result = null;
+        while (true) {
+            try {
+                CommonResponse getResponse = client.getCommonResponse(getRequest);
+                System.err.println("识别查询结果:" + getResponse.getData());
+                if (getResponse.getHttpStatus() != 200) {
+                    break;
+                }
+                JSONObject rootObj = JSONObject.parseObject(getResponse.getData());
+                String statusText = rootObj.getString(KEY_STATUS_TEXT);
+                if (STATUS_RUNNING.equals(statusText) || STATUS_QUEUEING.equals(statusText)) {
+                    // 继续轮询,注意设置轮询时间间隔。
+                    Thread.sleep(10000);
+                } else {
+                    // 状态信息为成功,返回识别结果;状态信息为异常,返回空。
+                    if (STATUS_SUCCESS.equals(statusText)) {
+                        result = rootObj.getString(KEY_RESULT);
+                        // 状态信息为成功,但没有识别结果,则可能是由于文件里全是静音、噪音等导致识别为空。
+                        if (result == null) {
+                            result = "";
+                        }
+                    }
+                    break;
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    public static void main(String args[]) throws Exception {
+
+        final String accessKeyId = "LTAI5tMwtPCL85iXbUtjLTxD";
+        final String accessKeySecret = "WiUW5ag7HhQZPNoMAoQSC5LuxD2kLw";
+        final String appKey = "IxV21DxuzHuc8Oe4";
+        //  String fileUrl = FileUtils.getSysLocalFileUrl()+"/voiceInfo/123456.wav";
+
+
+        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("录音文件识别结果查询失败!");
+        }
+    }
+}

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

@@ -1,14 +1,13 @@
 package org.springblade.archive.utils;
 
 import com.aspose.cells.SaveFormat;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.itextpdf.text.Document;
 import com.itextpdf.text.Element;
 import com.itextpdf.text.pdf.*;
 import com.sun.image.codec.jpeg.JPEGCodec;
 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.ListUtils;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
 import org.apache.poi.ss.usermodel.ClientAnchor;
@@ -727,4 +726,5 @@ public class FileUtils {
         demo.process("./nls-sample-16k.wav", 16000);
         demo.shutdown();*/
     }
+
 }

+ 83 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/HttpUtil.java

@@ -0,0 +1,83 @@
+package org.springblade.archive.utils;
+
+import okhttp3.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class HttpUtil {
+
+    private static String getResponseWithTimeout(Request q) {
+        String ret = null;
+
+        OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
+        OkHttpClient client = httpBuilder.connectTimeout(10, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .build();
+
+        try {
+            Response s = client.newCall(q).execute();
+            ret = s.body().string();
+            s.close();
+        } catch (SocketTimeoutException e) {
+            ret = null;
+            System.err.println("get result timeout");
+        } catch (IOException e) {
+            System.err.println("get result error " + e.getMessage());
+        }
+
+        return ret;
+    }
+
+    public static String sendPostFile(String url, HashMap<String, String> headers, File file) {
+        RequestBody body;
+
+        body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
+
+        Headers.Builder hb = new Headers.Builder();
+        if (headers != null && !headers.isEmpty()) {
+            for (Map.Entry<String, String> entry : headers.entrySet()) {
+                hb.add(entry.getKey(), entry.getValue());
+            }
+        }
+
+        Request request = new Request.Builder()
+                .url(url)
+                .headers(hb.build())
+                .post(body)
+                .build();
+
+        return getResponseWithTimeout(request);
+    }
+
+    public static String sendPostData(String url, HashMap<String, String> headers, byte[] data) {
+        RequestBody body;
+
+        if (data.length == 0) {
+            System.err.println("The send data is empty.");
+            return null;
+        } else {
+            body = RequestBody.create(MediaType.parse("application/octet-stream"), data);
+        }
+
+        Headers.Builder hb = new Headers.Builder();
+        if (headers != null && !headers.isEmpty()) {
+            for (Map.Entry<String, String> entry : headers.entrySet()) {
+                hb.add(entry.getKey(), entry.getValue());
+            }
+        }
+
+        Request request = new Request.Builder()
+                .url(url)
+                .headers(hb.build())
+                .post(body)
+                .build();
+
+        return getResponseWithTimeout(request);
+    }
+}

+ 104 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/SpeechRecognizerRESTfulDemo.java

@@ -0,0 +1,104 @@
+/*
+package org.springblade.archive.utils;
+
+import com.alibaba.fastjson.JSONPath;
+
+import java.io.File;
+import java.util.HashMap;
+public class SpeechRecognizerRESTfulDemo {
+    private String accessToken;
+    private String appkey;
+
+    public SpeechRecognizerRESTfulDemo(String appkey, String token) {
+        this.appkey = appkey;
+        this.accessToken = token;
+    }
+
+    public String process(File fileName, String format, int sampleRate,
+                          boolean enablePunctuationPrediction,
+                          boolean enableInverseTextNormalization,
+                          boolean enableVoiceDetection) {
+
+        */
+/**
+ * 设置HTTPS RESTful POST请求:
+ * 1.使用HTTPS协议。
+ * 2.语音识别服务域名:nls-gateway-cn-shanghai.aliyuncs.com。
+ * 3.语音识别接口请求路径:/stream/v1/asr。
+ * 4.设置必选请求参数:appkey、format、sample_rate。
+ * 5.设置可选请求参数:enable_punctuation_prediction、enable_inverse_text_normalization、enable_voice_detection。
+ * <p>
+ * 设置HTTPS头部字段:
+ * 1.鉴权参数。
+ * 2.Content-Type:application/octet-stream。
+ * <p>
+ * 发送HTTPS POST请求,返回服务端的响应。
+ *//*
+
+        String url = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/asr";
+        String request = url;
+        request = request + "?appkey=" + appkey;
+        request = request + "&format=" + format;
+        request = request + "&sample_rate=" + sampleRate;
+        if (enablePunctuationPrediction) {
+            request = request + "&enable_punctuation_prediction=" + true;
+        }
+        if (enableInverseTextNormalization) {
+            request = request + "&enable_inverse_text_normalization=" + true;
+        }
+        if (enableVoiceDetection) {
+            request = request + "&enable_voice_detection=" + true;
+        }
+
+        System.out.println("Request: " + request);
+
+        */
+/**
+ * 设置HTTPS头部字段:
+ * 1.鉴权参数。
+ * 2.Content-Type:application/octet-stream。
+ *//*
+
+        HashMap<String, String> headers = new HashMap<String, String>();
+        headers.put("X-NLS-Token", this.accessToken);
+        headers.put("Content-Type", "application/octet-stream");
+
+        */
+/**
+ * 发送HTTPS POST请求,返回服务端的响应。
+ *//*
+
+        String response = HttpUtil.sendPostFile(request, headers, fileName);
+
+        if (response != null) {
+            System.out.println("Response: " + response);
+            String result = JSONPath.read(response, "result").toString();
+            System.out.println("识别结果:" + result);
+            return result;
+        }
+        else {
+            System.err.println("识别失败!");
+        }
+
+        return "1";
+    }
+
+    public static void main(String[] args) {
+
+
+        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(fileName, format, sampleRate, enablePunctuationPrediction, enableInverseTextNormalization, enableVoiceDetection);
+        System.out.println("123");
+        //System.out.println(dataInfo);
+    }
+}*/

+ 30 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -187,6 +187,36 @@ public class AnnualBudgetController {
         return R.data(budgetService.portalRiskPlan());
     }
 
+    /**
+     * 门户-各项目支出占比
+     */
+    @GetMapping("/portalProjectCostRatio")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "门户-各项目支出占比",notes = "传入年月,如2023-06")
+    public R<List<ProjectIncomeCostRatioVO>> portalProjectCostRatio(String date) {
+        return R.data(budgetService.portalProjectCostRatio(date));
+    }
+
+    /**
+     * 门户-各项目收入占比
+     */
+    @GetMapping("/portalProjectIncomeRatio")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "门户-各项目收入占比",notes = "传入年月,如2023-06")
+    public R<List<ProjectIncomeCostRatioVO>> portalProjectIncomeRatio(String date) {
+        return R.data(budgetService.portalProjectIncomeRatio(date));
+    }
+
+    /**
+     * 门户-项目服务阶段进程
+     */
+    @GetMapping("/portalProjectProcess")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "门户-项目服务阶段进程",notes = "传入项目id")
+    public R<List<ProjectServiceProcessVO>> portalProjectProcess(Long projectId) {
+        return R.data(budgetService.portalProjectProcess(projectId));
+    }
+
 //    /**
 //     * 门户-风险计划查看
 //     */

+ 18 - 7
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -11,6 +11,7 @@ import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.PlanStatisticVO;
 import org.springblade.control.vo.ProjectCostBudgetVO;
 import org.springblade.control.vo.ProjectCostBudgetVO3;
 import org.springblade.core.mp.support.Query;
@@ -109,7 +110,7 @@ public class ProjectCostBudgetController {
      */
     @GetMapping("/planOverview")
     @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "门户普通权限总计划统计")
+    @ApiOperation(value = "门户-普通权限-总计划统计")
     public R<ProjectCostBudgetVO3> planOverview(){
         return R.data(budgetService.planOverview());
     }
@@ -119,30 +120,40 @@ public class ProjectCostBudgetController {
      */
     @GetMapping("/postponePlan")
     @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "门户普通权限预警")
+    @ApiOperation(value = "门户-普通权限-预警")
     public R<List<ProjectCostBudgetVO3>> postponePlan(){
         return R.data(budgetService.postponePlan());
     }
 
     /**
-     * 门户普通权限单月计划统计
+     * 门户-普通权限-单月计划统计
      */
     @GetMapping("/MonthPlanOverview")
     @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "门户普通权限单月计划统计")
+    @ApiOperation(value = "门-户普通权限-单月计划统计")
     public R<ProjectCostBudgetVO3> MonthPlanOverview(String planDate){
         return R.data(budgetService.MonthPlanOverview(planDate));
     }
 
     /**
-     * 门户普通权限计划统计图
+     * 门户-普通权限-计划统计图
      */
     @GetMapping("/MonthOfYearPlanOverview")
     @ApiOperationSupport(order = 10)
-    @ApiOperation(value = "门户普通权限计划统计图")
-    public R<List<Map<String,List<Integer>>>> MonthOfYearPlanOverview(){
+    @ApiOperation(value = "门户-普通权限-计划统计图")
+    public R<List<PlanStatisticVO>> MonthOfYearPlanOverview(){
         return R.data(budgetService.MonthOfYearPlanOverview());
     }
 
+    /**
+     * 任务统计-计划统计图
+     */
+    @GetMapping("/MonthOfYearPlanOverview2")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "任务统计-计划统计图",notes = "有参数的计划统计图")
+    public R<List<PlanStatisticVO>> MonthOfYearPlanOverview2(Long deptId,Long UserId,LocalDate start,LocalDate end){
+        return R.data(budgetService.MonthOfYearPlanOverview2(deptId,UserId,start,end));
+    }
+
 
 }

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

@@ -26,4 +26,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     List<ContractReturnedInfoVO> getListByProjectId(@Param("projectId") Long projectId,@Param("contractId") Long contractId);
 
     BigDecimal getYearReturned(@Param("year") int year);
+
+    List<ContractReturnedInfo> getProjectReturnedByMonth(@Param("date") String date);
 }

+ 8 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -30,4 +30,12 @@
             and DATE_FORMAT(practical_returned_time ,'%Y') = #{year}
         </if>
     </select>
+    <select id="getProjectReturnedByMonth" resultType="org.springblade.control.entity.ContractReturnedInfo">
+        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}
+        </if>
+        and practical_returned_money is not null
+    </select>
 </mapper>

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

@@ -65,4 +65,8 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ProjectCostBudgetVO2> getPlanByMonth(@Param("date") String date);
 
     List<ProjectCostBudget> getRiskPlan(@Param("projectId") Long projectId,@Param("costType") Integer costType);
+
+    List<ProjectCostBudget> getPlanPracticalCostByMonth(@Param("date") String date);
+
+    List<ProjectCostBudget> MonthOfYearPlanOverview2(@Param("deptId") Long deptId,@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
 }

+ 25 - 3
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -125,7 +125,11 @@
         select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{id} and pcb.parent_id = 0
     </select>
     <select id="getProjectAllFinishedTask" resultType="org.springblade.control.entity.ProjectCostBudget">
-        select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and cost_type = #{costType} and pcb.task_approve = 1
+        select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId}
+        <if test="costType != null and costType != ''">
+            and cost_type = #{costType}
+        </if>
+        and pcb.task_approve = 1
     </select>
     <select id="getAllPracticalBudgetByProjectId"
             resultType="org.springblade.control.entity.ProjectCostBudget">
@@ -155,8 +159,12 @@
         select pcb.*,
                (pcb.plan_days * (select bu.one_money from blade_user bu WHERE bu.id = pcb.task_user)) as 'planCountMoney',
                 (select cpi.name from c_control_project_info cpi WHERE cpi.id = pcb.project_id) as 'projectName'
-        from c_project_cost_budget pcb WHERE DATE_FORMAT(pcb.plan_start_time ,'%Y-%m') = #{date}
-                                         and pcb.task_user is not null and pcb.plan_days is not null
+        from c_project_cost_budget pcb
+        WHERE pcb.is_deleted = 0
+        <if test="date != null and date != ''">
+            and DATE_FORMAT(pcb.plan_start_time ,'%Y-%m') = #{date}
+        </if>
+        and pcb.task_user is not null and pcb.plan_days is not null
     </select>
     <select id="getRiskPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
         SELECT * from c_project_cost_budget WHERE plan_end_time &lt; NOW() and status in (2,3)
@@ -175,6 +183,20 @@
             and cost_type = #{costType}
         </if>
     </select>
+    <select id="getPlanPracticalCostByMonth" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select pcb.*
+        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}
+        </if>
+    </select>
+    <select id="MonthOfYearPlanOverview2" 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}
+    </select>
 
 
 </mapper>

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

@@ -62,6 +62,7 @@
     </select>
     <select id="ProjectListStats" resultType="org.springblade.control.vo.AllProjectStatsVO">
         select
+            cpi.id as 'projectId',
             cpi.name as 'projectName',
             cci.contract_money  as 'contractMoney',
                 (select cbs.project_cost_total from c_project_cost_budget_stats cbs WHERE cpi.id = cbs.project_id  and cbs.is_deleted = 0) as 'budgetCost',

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

@@ -44,4 +44,10 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     List<DeptMonthPlanRatioVO> portalProjectMonthRatio(String date);
 
     List<AllProjectStatsVO> portalRiskPlan();
+
+    List<ProjectIncomeCostRatioVO> portalProjectCostRatio(String date);
+
+    List<ProjectIncomeCostRatioVO> portalProjectIncomeRatio(String date);
+
+    List<ProjectServiceProcessVO> portalProjectProcess(Long projectId);
 }

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java

@@ -36,4 +36,6 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
 
     //获取指定一年的回款
     BigDecimal getYearReturned(int year);
+
+    List<ContractReturnedInfo> getProjectReturnedByMonth(String date);
 }

+ 6 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -8,10 +8,7 @@ import org.springblade.control.entity.ControlProjectInfo;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.ProjectCostBudgetStats;
-import org.springblade.control.vo.ControlProjectInfoVO;
-import org.springblade.control.vo.ProjectCostBudgetVO;
-import org.springblade.control.vo.ProjectCostBudgetVO2;
-import org.springblade.control.vo.ProjectCostBudgetVO3;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 
@@ -53,7 +50,9 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     List<ProjectCostBudgetVO3> postponePlan();
 
-    List<Map<String,List<Integer>>> MonthOfYearPlanOverview();
+    List<PlanStatisticVO> MonthOfYearPlanOverview();
+
+    List<PlanStatisticVO> MonthOfYearPlanOverview2(Long deptId,Long UserId,LocalDate start,LocalDate end);
 
     List<ProjectCostBudget> getAllBudgetByProjectId(Long id);
 
@@ -68,4 +67,6 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<ProjectCostBudgetVO2> getPlanByMonth(String date);
 
     List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType);
+
+    List<ProjectCostBudget> getPlanPracticalCostByMonth(String date);
 }

+ 155 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -2,6 +2,7 @@ package org.springblade.control.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
+import org.hibernate.validator.internal.IgnoreForbiddenApisErrors;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.entity.*;
@@ -44,6 +45,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
 
     private final IProjectInfoService projectInfoService;
 
+    private final IProjectProcessService processService;
+
     /**
      * 新增年度经营预算
      * @param dto
@@ -450,6 +453,9 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
      */
     @Override
     public List<DeptMonthPlanRatioVO> portalProjectMonthRatio(String date) {
+        if ("汇总所有".equals(date)){
+            date = "";
+        }
         //获取当月所有计划,和计划工资
         List<ProjectCostBudgetVO2> planByMonth = budgetService.getPlanByMonth(date);
         if (planByMonth != null || planByMonth.size() >= 0) {
@@ -560,6 +566,155 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return vos;
     }
 
+    /**
+     * 门户-各项目支出占比
+     */
+    @Override
+    public List<ProjectIncomeCostRatioVO> portalProjectCostRatio(String date) {
+        if ("汇总所有".equals(date)){
+            date = "";
+        }
+        //获取项目列表
+        List<ControlProjectInfo> list = projectInfoService.list();
+        if (list == null || list.size() <= 0){
+            return null;
+        }
+        List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
+        //按月获取闭环任务,根据项目分组
+        List<ProjectCostBudget> costByMonth = budgetService.getPlanPracticalCostByMonth(date);
+        if (costByMonth == null || costByMonth.size() <= 0){
+            //没有闭环任务,为每个项目设置为0
+            for (ControlProjectInfo info : list) {
+                ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
+                vo.setProjectName(info.getName());
+                vo.setProjectCost(0);
+                vos.add(vo);
+            }
+            return vos;
+        }
+        Map<Long, List<ProjectCostBudget>> map = costByMonth.parallelStream()
+                .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
+        //为每个合同设置支出
+        for (ControlProjectInfo info : list) {
+            ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
+            vo.setProjectName(info.getName());
+            BigDecimal big = new BigDecimal(0);
+            List<ProjectCostBudget> budgets = map.get(info.getId());
+            if (budgets != null && budgets.size() > 0){
+                for (ProjectCostBudget budget : budgets) {
+                    big = big.add(budget.getActualTotalMoney());
+                }
+            }
+            vo.setProjectCost(big.intValue());
+            vos.add(vo);
+        }
+        return vos;
+    }
+
+    @Override
+    public List<ProjectIncomeCostRatioVO> portalProjectIncomeRatio(String date) {
+        if ("汇总所有".equals(date)){
+            date = "";
+        }
+        //获取项目列表
+        List<ControlProjectInfo> list = projectInfoService.list();
+        if (list == null || list.size() <= 0){
+            return null;
+        }
+        //获取所有回款,根据项目分组
+        List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
+        List<ContractReturnedInfo> returnedByMonth = returnedInfoService.getProjectReturnedByMonth(date);
+        if (returnedByMonth == null || returnedByMonth.size() <= 0){
+            //没有闭环任务,为每个项目设置为0
+            for (ControlProjectInfo info : list) {
+                ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
+                vo.setProjectName(info.getName());
+                vo.setProjectIncome(0);
+                vos.add(vo);
+            }
+            return vos;
+        }
+        Map<Long, List<ContractReturnedInfo>> map = returnedByMonth.parallelStream()
+                .collect(Collectors.groupingBy(ContractReturnedInfo::getProjectId));
+        //为每个合同设置收入
+        for (ControlProjectInfo info : list) {
+            ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
+            vo.setProjectName(info.getName());
+            BigDecimal big = new BigDecimal(0);
+            List<ContractReturnedInfo> returnedInfos = map.get(info.getId());
+            if (returnedInfos != null && returnedInfos.size() > 0){
+                for (ContractReturnedInfo returnedInfo : returnedInfos) {
+                    big = big.add(returnedInfo.getPracticalReturnedMoney());
+                }
+            }
+            vo.setProjectCost(big.intValue());
+            vos.add(vo);
+        }
+        return vos;
+    }
+
+    /**
+     * 门户-项目服务阶段进程
+     */
+    @Override
+    public List<ProjectServiceProcessVO> portalProjectProcess(Long projectId) {
+        //获取当前项目所有进程
+        List<ProjectProcessVO> projectProcess = processService.getProjectProcess(projectId);
+        //获取项目所有已经闭环的计划
+        List<ProjectCostBudget> finishedTask = budgetService.getProjectAllFinishedTask(projectId, null);
+        Map<Long, List<ProjectCostBudget>> collect = new HashMap<>();
+        boolean isPlan = false ;
+        if (finishedTask == null || finishedTask.size() <= 0){
+                isPlan = true;
+        }else {
+            collect = finishedTask.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
+        }
+        //把计划根据进程分组
+        //为每个进程设置值
+        List<ProjectServiceProcessVO> vos = new ArrayList<>();
+        for (ProjectProcessVO process : projectProcess) {
+            ProjectServiceProcessVO vo = new ProjectServiceProcessVO();
+            vo.setProcessName(process.getName());
+            //设置进程百分比
+            if (process.getProcessEndTime() != null && process.getProcessEndTime() != null){
+                if (process.getStatus() == 1){
+                    //未开始
+                    vo.setProcessProgressBar(0);
+                }else if (process.getStatus() == 3){
+                    //已闭环
+                    vo.setProcessProgressBar(100);
+                }else {
+                    //进行中
+                    vo.setProcessProgressBar(50);
+                }
+            }else {
+                //未设置时间默认未开始
+                vo.setProcessProgressBar(0);
+            }
+            //设置进程支出金额,目前只统计人工支出
+            if (isPlan){
+                vo.setProcessCostCount(new BigDecimal(0));
+            }else {
+                List<ProjectCostBudget> budgets = collect.get(process.getId());
+                if (budgets != null && budgets.size() > 0){
+                    //计算所有任务支出总和
+                    BigDecimal big = new BigDecimal(0);
+                    for (ProjectCostBudget budget : budgets) {
+                        big = big.add(budget.getActualTotalMoney());
+                    }
+                    vo.setProcessCostCount(big);
+                }else {
+                    vo.setProcessCostCount(new BigDecimal(0));
+                }
+            }
+            //设置进程支出金额百分比
+            vo.setProcessCostProgressBar(40);
+            vos.add(vo);
+        }
+        return vos;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

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

@@ -97,4 +97,14 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
         }
         return yearReturned;
     }
+
+    /**
+     * 根据月份获取回款
+     * @param date
+     * @return
+     */
+    @Override
+    public List<ContractReturnedInfo> getProjectReturnedByMonth(String date) {
+        return baseMapper.getProjectReturnedByMonth(date);
+    }
 }

+ 3 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java

@@ -20,6 +20,7 @@ import org.springblade.control.vo.ControlProjectInfoVO;
 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.utils.SecureUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -39,7 +40,7 @@ public class PlanInformServiceImpl extends BaseServiceImpl<PlanInformMapper, Pla
     @Override
     public List<PlanInform> getUserInform() {
         //没有用户
-        Long user = 1123598821738675201L;
-        return this.list(new LambdaQueryWrapper<PlanInform>().eq(PlanInform::getInformUser,user).orderByDesc(PlanInform::getInformDate).last("limit 5"));
+        Long userId = SecureUtil.getUserId();
+        return this.list(new LambdaQueryWrapper<PlanInform>().eq(PlanInform::getInformUser,userId).orderByDesc(PlanInform::getInformDate).last("limit 5"));
     }
 }

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

@@ -19,12 +19,10 @@ import org.springblade.control.mapper.ProjectInfoMapper;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
-import org.springblade.control.vo.ControlProjectInfoVO;
-import org.springblade.control.vo.ProjectCostBudgetVO;
-import org.springblade.control.vo.ProjectCostBudgetVO2;
-import org.springblade.control.vo.ProjectCostBudgetVO3;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -319,9 +317,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
      */
     @Override
     public ProjectCostBudgetVO3 planOverview() {
-        //没有用户
-        Long user = 1123598821738675201L;
-        ProjectCostBudgetVO3 vo3 = baseMapper.getUserALLPlan(user);
+        Long userId = SecureUtil.getUserId();
+        ProjectCostBudgetVO3 vo3 = baseMapper.getUserALLPlan(userId);
         return vo3;
     }
 
@@ -331,7 +328,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     @Override
     public ProjectCostBudgetVO3 MonthPlanOverview(String planDate) {
         //没有用户
-        Long user = 1123598821738675201L;
+        Long userId = SecureUtil.getUserId();
         //初始化时间段
         String[] split = planDate.split("-");
         int year = Integer.parseInt(split[0]);
@@ -352,7 +349,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 }
             }
         }
-        ProjectCostBudgetVO3 vo3 = baseMapper.MonthPlanOverview(user, startDate, endDate);
+        ProjectCostBudgetVO3 vo3 = baseMapper.MonthPlanOverview(userId, startDate, endDate);
         return vo3;
     }
 
@@ -362,8 +359,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     @Override
     public List<ProjectCostBudgetVO3> postponePlan() {
         //没有用户
-        Long user = 1123598821738675201L;
-        return baseMapper.postponePlan(user);
+        Long userId = SecureUtil.getUserId();
+        return baseMapper.postponePlan(userId);
     }
 
 
@@ -371,15 +368,15 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
      * 门户普通权限计划统计图
      */
     @Override
-    public List<Map<String, List<Integer>>> MonthOfYearPlanOverview() {
-        //没有用户
-        Long user = 1123598821738675201L;
+    public List<PlanStatisticVO> MonthOfYearPlanOverview() {
+        //查询当前用户
+        Long userId = SecureUtil.getUserId();
         //获取今年
         int year = LocalDate.now().getYear();
         //获取今年所有的当前用户的计划
-        List<ProjectCostBudget> list = baseMapper.MonthOfYearPlanOverview(user, year);
+        List<ProjectCostBudget> list = baseMapper.MonthOfYearPlanOverview(userId, year);
         if (list != null && list.size() > 0) {
-            List<Map<String, List<Integer>>> mapList = new ArrayList<>();
+            List<PlanStatisticVO> mapList = new ArrayList<>();
             List<Integer> allPlan = new ArrayList<>();
             List<Integer> finishedPlan = new ArrayList<>();
             List<Integer> unfinishedPlan = new ArrayList<>();
@@ -403,21 +400,29 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 finishedPlan.add(total2);
                 unfinishedPlan.add(total3);
             }
-            HashMap<String, List<Integer>> map1 = new HashMap<>();
-            map1.put("总计划",allPlan);
-            HashMap<String, List<Integer>> map2 = new HashMap<>();
-            map2.put("已完成",finishedPlan);
-            HashMap<String, List<Integer>> map3 = new HashMap<>();
-            map3.put("未完成",unfinishedPlan);
-            mapList.add(map1);
-            mapList.add(map2);
-            mapList.add(map3);
+            PlanStatisticVO vo1 = new PlanStatisticVO();
+            vo1.setName("总计划");
+            vo1.setValue(allPlan);
+            PlanStatisticVO vo2 = new PlanStatisticVO();
+            vo2.setName("已完成");
+            vo2.setValue(finishedPlan);
+            PlanStatisticVO vo3 = new PlanStatisticVO();
+            vo3.setName("未完成");
+            vo3.setValue(unfinishedPlan);
+            mapList.add(vo1);
+            mapList.add(vo2);
+            mapList.add(vo3);
             return mapList;
         }else {
             return null;
         }
     }
 
+    @Override
+    public List<PlanStatisticVO> MonthOfYearPlanOverview2(Long deptId, Long UserId, LocalDate start, LocalDate end) {
+        return null;
+    }
+
     @Override
     public List<ProjectCostBudget> getAllBudgetByProjectId(Long id) {
         return baseMapper.getAllBudgetByProjectId(id);
@@ -468,7 +473,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     }
 
     /**
-     * 按月查询所有支出
+     * 按月查询所有计划支出
      * @param date
      * @return
      */
@@ -489,6 +494,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getRiskPlan(projectId,costType);
     }
 
+    /**
+     * 根据月获取计划闭环后实际金额
+     * @param date
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getPlanPracticalCostByMonth(String date) {
+        return baseMapper.getPlanPracticalCostByMonth(date);
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 3 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -86,7 +86,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
     }
 
     /**
-     * 根项目id获取项目的进程
+     * 根项目id获取项目的进程
      *
      * @return
      */
@@ -95,8 +95,9 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
         List<ProjectProcessVO> list = processMapper.getProjectProcess(id);
         list.stream().forEach(l -> {
             if (l.getProcessStartTime() != null && l.getProcessEndTime() != null) {
-                //是否开始时间,在当前时间之前
+                //开始时间是否在今天以前,是则已开始,否则未开始
                 if (l.getProcessStartTime().isBefore(LocalDate.now())) {
+                    //结束时间是否在今天以前,是则已结果,否则进行中
                     if (l.getProcessEndTime().isBefore(LocalDate.now())) {
                         l.setStatusValue("已闭环");
                         l.setStatus(3);

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/PostMapper.xml

@@ -28,7 +28,7 @@
         SELECT
         post_name
         FROM
-        blade_post
+        blade_view_post
         WHERE
         id IN
         <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">

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

@@ -168,6 +168,7 @@ public class UserController {
         // 内控系统拆分
         List<DeptUserVO> deptList = user.getDeptList();
         if (deptList != null && deptList.size() >= 1) {
+            user.setRoleId(JSON.toJSONString(deptList));
             String deptId = "";
             String postId = "";
             String isLaderpostId = "";
@@ -189,6 +190,7 @@ public class UserController {
             }
             user.setPostId(postId);
             user.setDeptId(deptId);
+            user.setIsLeader(isLaderpostId);
         }
 
 
@@ -240,6 +242,7 @@ public class UserController {
             user.setIsLeader(isLaderpostId);
             user.setPostId(postId);
             user.setDeptId(deptId);
+            user.setDeptInfo(JSONArray.toJSONString(deptList));
         }
         return R.status(userService.updateUser(user));
     }

+ 1 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -34,6 +34,7 @@
         <result column="sys_type" property="sysType"/>
         <result column="is_lader" property="isLeader"/>
         <result column="one_money" property="oneMoney"/>
+        <result column="dept_info" property="deptInfo"/>
     </resultMap>
     <update id="updateRoleIdById">
         UPDATE blade_user

+ 7 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/wrapper/UserWrapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.system.user.wrapper;
 
+import com.alibaba.fastjson.JSON;
 import org.springblade.core.mp.support.BaseEntityWrapper;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
@@ -25,6 +26,7 @@ import org.springblade.system.cache.SysCache;
 import org.springblade.system.entity.Tenant;
 import org.springblade.system.enums.DictEnum;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.vo.DeptUserVO;
 import org.springblade.system.user.vo.UserVO;
 
 import java.util.List;
@@ -53,6 +55,11 @@ public class UserWrapper extends BaseEntityWrapper<User, UserVO> {
         userVO.setDeptName(Func.join(deptName));
         userVO.setPostName(Func.join(postName));
         userVO.setSexName(DictCache.getValue(DictEnum.SEX, user.getSex()));
+
+        // 用户机构集合
+        userVO.setDeptList(JSON.parseArray(user.getDeptInfo(), DeptUserVO.class));
+
+        // 用户所属 项目
         if (ObjectUtil.isNotEmpty(user.getUserType())) {
             String value = DictCache.getValue(DictEnum.USER_TYPE, user.getUserType()).replace("[", "").replace("]", "");
             userVO.setUserTypeName(value);