Explorar el Código

任务相关及客户端BUG修复

huangjn hace 3 años
padre
commit
cd12e531d0
Se han modificado 16 ficheros con 271 adiciones y 73 borrados
  1. 21 16
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 29 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewISmsClient.java
  3. 28 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewISmsClientImpl.java
  4. 21 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BatchTaskVO.java
  5. 15 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ConstructionLedgerVO.java
  6. 22 4
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java
  7. 6 0
      blade-service/blade-business/pom.xml
  8. 19 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java
  9. 18 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  10. 58 32
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  11. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  12. 12 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java
  13. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/entity/TaskParallel.java
  14. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskParallelMapper.xml
  15. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  16. 13 11
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

+ 21 - 16
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -1,19 +1,3 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.common.utils;
 
 import org.apache.commons.lang.StringUtils;
@@ -21,6 +5,7 @@ import org.apache.commons.lang.StringUtils;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 /**
  * 通用工具类
@@ -29,6 +14,26 @@ import java.util.List;
  */
 public class CommonUtil {
 
+    /**
+     * 随机生成短信验证码
+     * @param length 生成长度
+     */
+    public static String getCharAndNumber(int length) {
+        StringBuilder val = new StringBuilder();
+
+        Random random = new Random();
+        for (int i = 0; i < length; i++) {
+            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
+            if ("char".equalsIgnoreCase(charOrNum)) {
+                int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
+                val.append((char) (choice + random.nextInt(26)));
+            } else {
+                val.append(random.nextInt(10));
+            }
+        }
+        return val.toString();
+    }
+
     /**
      * 判断参数是否是数字
      * @param value 需要判断数据

+ 29 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewISmsClient.java

@@ -0,0 +1,29 @@
+package org.springblade.resource.feign;
+
+import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.core.sms.model.SmsResponse;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(
+        value = AppConstant.APPLICATION_RESOURCE_NAME
+)
+public interface NewISmsClient {
+
+    String API_PREFIX = "/newClient";
+    String SEND_MESSAGE = API_PREFIX + "/send-message";
+
+    /**
+     * 通用短信发送
+     *
+     * @param code   资源编号
+     * @param params 模板参数
+     * @param phones 手机号集合
+     * @return R
+     */
+    @PostMapping(SEND_MESSAGE)
+    R<SmsResponse> sendMessage(@RequestParam("code") String code, @RequestParam("params") String params, @RequestParam("phones") String phones);
+
+}

+ 28 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewISmsClientImpl.java

@@ -0,0 +1,28 @@
+package org.springblade.resource.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.sms.model.SmsData;
+import org.springblade.core.sms.model.SmsResponse;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.resource.builder.sms.SmsBuilder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@NonDS
+@RestController
+@AllArgsConstructor
+public class NewISmsClientImpl implements NewISmsClient {
+
+    private final SmsBuilder smsBuilder;
+
+    @Override
+    @PostMapping(SEND_MESSAGE)
+    public R<SmsResponse> sendMessage(String code, String params, String phones) {
+        SmsData smsData = new SmsData(JsonUtil.readMap(params, String.class, String.class));
+        SmsResponse response = smsBuilder.template(code).sendMessage(smsData, Func.toStrList(phones));
+        return R.data(response);
+    }
+}

+ 21 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BatchTaskVO.java

@@ -0,0 +1,21 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BatchTaskVO {
+
+    @ApiModelProperty("所选列表的taskId")
+    private String taskIds;
+
+    @ApiModelProperty("列表中对应的parallelProcessInstanceId字段")
+    private String parallelProcessInstanceIds;
+
+    @ApiModelProperty("同意传OK(大写),废除可传非OK外任意字符或传空")
+    private String flag;
+
+    @ApiModelProperty("审批意见")
+    private String comment;
+
+}

+ 15 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ConstructionLedgerVO.java

@@ -1,8 +1,11 @@
 package org.springblade.business.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.business.entity.ConstructionLedger;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -34,4 +37,16 @@ public class ConstructionLedgerVO extends ConstructionLedger {
 
 	private Integer size;
 
+	/**
+	 * 检测开始时间
+	 */
+	@ApiModelProperty("检测开始时间")
+	private String detectionStartTimeValue;
+
+	/**
+	 * 检测结束时间
+	 */
+	@ApiModelProperty("检测结束时间")
+	private String detectionEndTimeValue;
+
 }

+ 22 - 4
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java

@@ -47,9 +47,6 @@ public class TaskVO extends Task {
 	@ApiModelProperty("环节任务ID")
 	private String taskId;
 
-	@ApiModelProperty("状态类型")
-	private String statusValue;
-
 	@ApiModelProperty("审批人集合")
 	List<WaitingUser> waitingUserList = new ArrayList<>();
 
@@ -57,12 +54,33 @@ public class TaskVO extends Task {
 		this.waitingUserList.add(new WaitingUser(waitingUserName, status));
 	}
 
+	private TaskStatus taskStatus;
+
+	public void setTaskStatus(String statusValue, Integer status){
+		this.taskStatus = new TaskStatus(statusValue, status);
+	}
+
+	@Data
+	private class TaskStatus {
+		@ApiModelProperty("状态类型")
+		private String statusValue;
+
+		@ApiModelProperty("审批状态,1未签字(黑色),2已签字(绿色),3已废除(黄色)")
+		private Integer status;
+
+		public TaskStatus(String statusValue, Integer status){
+			this.statusValue = statusValue;
+			this.status = status;
+		}
+
+	}
+
 	@Data
 	private class WaitingUser {
 		@ApiModelProperty("审批人姓名")
 		private String waitingUserName;
 
-		@ApiModelProperty("审批状态,1未签字(黑色),2已签字(绿色),999签字异常(红色)")
+		@ApiModelProperty("审批状态,1未签字(黑色),2已签字(绿色),3已废除(黄色),999签字异常(红色)")
 		private Integer status;
 
 		public WaitingUser(String waitingUserName, Integer status){

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

@@ -70,6 +70,12 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-resource-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

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

@@ -1,6 +1,8 @@
 package org.springblade.business.controller;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -94,7 +96,23 @@ public class ConstructionLedgerController extends BladeController {
 		} else {
 			pages = this.constructionLedgerService.page(Condition.getPage(query), Condition.getQueryWrapper(ledger).lambda().in(ConstructionLedger::getWbsId, vo.getWbsIds()));
 		}
-		return R.data(ConstructionLedgerWrapper.build().pageVO(pages));
+
+		//类型转换
+//		List<ConstructionLedgerVO> ledgerVOS = JSONArray.parseArray(JSONObject.toJSONString(pages.getRecords()), ConstructionLedgerVO.class);
+//		ledgerVOS.forEach(vos -> {
+//			vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
+//			vos.setDetectionTimeStr(DateUtil.format(vos.getSiteEndTime(), "yyyy-MM-dd"));
+//		});
+
+		IPage<ConstructionLedgerVO> voiPage = ConstructionLedgerWrapper.build().pageVO(pages);
+		voiPage.getRecords().forEach(vos -> {
+			vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
+			vos.setDetectionTimeStr(DateUtil.format(vos.getSiteEndTime(), "yyyy-MM-dd"));
+			vos.setDetectionStartTimeValue(DateUtil.format(vos.getDetectionStartTime(), "yyyy-MM-dd"));
+			vos.setDetectionEndTimeValue(DateUtil.format(vos.getDetectionEndTime(), "yyyy-MM-dd"));
+		});
+
+		return R.data(voiPage);
 	}
 
 	/**

+ 18 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -187,16 +188,24 @@ public class ImageClassificationFileController extends BladeController {
 	@ApiOperation(value = "获取类型列表(类型主页)")
 	public R<List<ImageClassificationConfigVO>> getClassIfyList(@RequestParam String projectId, @RequestParam String contractId){
 		//获取当前项目下的类型显隐情况
-		List<ImageClassificationShow> showClassifyIdList = this.imageClassificationShowService.queryShowClassify(projectId, contractId, "valid");
+		List<ImageClassificationShow> allShowClassifyIdList = this.imageClassificationShowService.queryShowClassify(projectId, contractId, null);
 
 		//根据当前项目显示的类型ID获取系统默认的分类
-		List<ImageClassificationConfig> configList;
-		if(showClassifyIdList != null && showClassifyIdList.size() != 0){
-			//获取分类ID集合
-			List<Long> classifyIds = showClassifyIdList.stream().map(ImageClassificationShow::getClassifyId).distinct().collect(Collectors.toList());
-			configList = this.imageClassificationConfigClient.queryClassificationConfigListByIds(classifyIds);
-		} else {
+		List<ImageClassificationConfig> configList = new ArrayList<>();
+		if(allShowClassifyIdList == null || allShowClassifyIdList.size() == 0){
+			//说明没有控制显隐,全查
 			configList = this.imageClassificationConfigClient.queryClassificationConfigList();
+		} else {
+			//获取分类ID集合
+			List<Long> classifyIds = new ArrayList<>();
+			allShowClassifyIdList.forEach(classify -> {
+				if(new Integer("1").equals(classify.getIsShow())){
+					classifyIds.add(classify.getClassifyId());
+				}
+			});
+			if(classifyIds.size() > 0){
+				configList = this.imageClassificationConfigClient.queryClassificationConfigListByIds(classifyIds);
+			}
 		}
 		//转换类型
 		List<ImageClassificationConfigVO> configVoList = JSONArray.parseArray(JSONObject.toJSONString(configList), ImageClassificationConfigVO.class);
@@ -258,6 +267,8 @@ public class ImageClassificationFileController extends BladeController {
 	})
 	public R<IPage<ImageClassificationFileVO>> page(ImageClassificationFileVO fileVO, Query query){
 		IPage<ImageClassificationFileVO> page = this.imageClassificationFileService.selectImageClassificationFilePage(Condition.getPage(query), fileVO);
+		page.getRecords().forEach(vos -> vos.setShootingTimeStr(DateUtil.format(vos.getShootingTime(), "yyyy-MM-dd")));
+
 		return R.data(page);
 	}
 

+ 58 - 32
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -11,17 +11,22 @@ import io.swagger.annotations.ApiOperation;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.service.ITaskParallelService;
+import org.springblade.business.vo.BatchTaskVO;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskQueryVO;
 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.utils.AuthUtil;
+import org.springblade.core.sms.model.SmsResponse;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
+import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.beans.BeanUtils;
@@ -32,10 +37,7 @@ import org.springblade.business.vo.TaskVO;
 import org.springblade.business.service.ITaskService;
 import org.springblade.core.boot.ctrl.BladeController;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -58,6 +60,22 @@ public class TaskController extends BladeController {
 
 	private final IDictBizClient dictBizClient;
 
+	private final NewISmsClient newSmsClient;
+
+	/**
+	 * 短信验证
+	 */
+	@PostMapping("/send-notice")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "短信验证")
+	public R<Boolean> sendNotice(@RequestParam String phone){
+		String code = CommonUtil.getCharAndNumber(4);
+		Map<String, String> params = new HashMap<>(3);
+		params.put("code", code);
+		R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
+		return result.getData().isSuccess() ? R.data(200, true, code) : R.data(499, false, String.valueOf(JSONObject.parseObject(result.getData().getMsg(), Map.class).get("Message")));
+	}
+
 	/**
 	 * 获取发起
 	 */
@@ -102,46 +120,49 @@ public class TaskController extends BladeController {
 					//设置关键信息
 					vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
 					vo.setTaskId(flow.getTaskId());
-					vo.setStatusValue(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除");
+					vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
 					//查询分支流程信息
 					List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
 					if(linkList != null && !linkList.isEmpty()){
-						linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : 1));
+						this.integrationMethod(vo, linkList);
 					}
 
 					finalResult.add(vo);
 				});
 
 				//最终分页数据
-				IPage<TaskVO> finalPage = Condition.getPage(query);
-				finalPage.setTotal(flowIPage.getTotal());
-				finalPage.setSize(query.getSize());
-				finalPage.setCurrent(query.getCurrent());
-				finalPage.setRecords(finalResult);
-
-				return R.data(finalPage);
+				return this.getIPageR(query, flowIPage, finalResult);
 			}
 		}
 
 		return R.data(null);
 	}
 
+	/**
+	 * 统合方法
+	 */
+	private void integrationMethod(TaskVO vo, List<TaskParallel> linkList) {
+		linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : new Integer("3").equals(link.getStatus()) && new Integer("1").equals(link.getInitiative()) ? 3 : 1));
+	}
+
 	/**
 	 * 批量审批
 	 */
 	@PostMapping("/batch-complete-approval-task")
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "批量审批")
-	public R<Boolean> batchCompleteApprovalTask(@RequestBody TaskApprovalVO taskApprovalVO){
-		String taskIds = taskApprovalVO.getTaskIds();
+	public R<Boolean> batchCompleteApprovalTask(@RequestBody BatchTaskVO batchTaskVO){
+		String taskIds = batchTaskVO.getTaskIds();
+		String parallelProcessInstanceIds = batchTaskVO.getParallelProcessInstanceIds();
 		if(StringUtils.isNotEmpty(taskIds)){
 			String[] taskIdArray = taskIds.split(",");
-			for(String taskId : taskIdArray){
+			String[] parallelProcessInstanceIdArray = parallelProcessInstanceIds.split(",");
+			for(int i = 0, l = taskIdArray.length; i < l; i ++){
 				TaskApprovalVO approvalVO = new TaskApprovalVO();
-				approvalVO.setTaskId(taskId);
-				approvalVO.setParallelProcessInstanceId(taskId);
-				approvalVO.setFlag("OK");
-				approvalVO.setComment("同意");
+				approvalVO.setTaskId(taskIdArray[i]);
+				approvalVO.setParallelProcessInstanceId(parallelProcessInstanceIdArray[i]);
+				approvalVO.setFlag(batchTaskVO.getFlag());
+				approvalVO.setComment(batchTaskVO.getComment());
 
 				//批量审批
 				this.taskService.completeApprovalTask(approvalVO);
@@ -189,7 +210,7 @@ public class TaskController extends BladeController {
 		Map<String,TaskParallel> parallelMap = new HashMap<>();
 		List<String> parallelProcessInstanceIds = new ArrayList<>();
 		//统合查询方法
-		this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2");
+		this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2,3");
 
 		//获取已办(基于原生已办)
 		R<Object> rObject = this.newFlowClient.selectDonePage(queryVO.getCurrent(), queryVO.getSize(), String.join(",", parallelProcessInstanceIds));
@@ -202,7 +223,7 @@ public class TaskController extends BladeController {
 	 */
 	@GetMapping("/query-approval-parameter")
 	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "审批页详情")
+	@ApiOperation(value = "审批页详情(单任务时)")
 	public R<TaskApprovalVO> getApprovalTaskParameter(String parallelProcessInstanceId){
 
 		return R.data(null);
@@ -246,7 +267,7 @@ public class TaskController extends BladeController {
 		});
 
 		if(processInstanceIds.size() > 0){
-			List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).eq(TaskParallel::getStatus, status));
+			List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).in(TaskParallel::getStatus, Arrays.asList(status.split(","))));
 			parallelTaskList.forEach(parallel -> {
 				parallelMap.put(parallel.getParallelProcessInstanceId(), parallel);
 				parallelProcessInstanceIds.add(parallel.getParallelProcessInstanceId());
@@ -310,11 +331,11 @@ public class TaskController extends BladeController {
 							vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
 							vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
 							vo.setTaskId(flow.getTaskId());
-							vo.setStatusValue(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除");
+							vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
 							//获取主流程下所有相关的审批人
 							List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
 							if(linkList != null && linkList.size() > 0){
-								linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : 1));
+								this.integrationMethod(vo, linkList);
 							}
 
 							//设置最终集合
@@ -334,18 +355,23 @@ public class TaskController extends BladeController {
 				}
 
 				//最终分页数据
-				IPage<TaskVO> finalPage = Condition.getPage(query);
-				finalPage.setTotal(flowIPage.getTotal());
-				finalPage.setSize(query.getSize());
-				finalPage.setCurrent(query.getCurrent());
-				finalPage.setRecords(finalFlowList);
-
-				return R.data(finalPage);
+				return this.getIPageR(query, flowIPage, finalFlowList);
 			}
 		}
 		return R.data(null);
 	}
 
+	@NotNull
+	private R<IPage<TaskVO>> getIPageR(Query query, IPage flowIPage, List<TaskVO> finalFlowList) {
+		IPage<TaskVO> finalPage = Condition.getPage(query);
+		finalPage.setTotal(flowIPage.getTotal());
+		finalPage.setSize(query.getSize());
+		finalPage.setCurrent(query.getCurrent());
+		finalPage.setRecords(finalFlowList);
+
+		return R.data(finalPage);
+	}
+
 	/**
 	 * 完成/审批任务
 	 */

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

@@ -298,7 +298,7 @@ public class UserOpinionController extends BladeController {
 		//获取当前登录人
 		BladeUser user = AuthUtil.getUser();
 		userOpinion.setCreateUser(user.getUserId());
-		userOpinion.setCreateUserName(user.getRoleName());
+		userOpinion.setCreateUserName(user.getNickName());
 		userOpinion.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
 	}
 }

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

@@ -2,6 +2,7 @@ package org.springblade.business.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.*;
+import io.undertow.util.DateUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -20,6 +21,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.core.mp.support.Condition;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -60,6 +62,10 @@ public class WeatherController {
     public R<Boolean> updateWeatherById(@RequestBody WeatherInfo weatherInfo){
         //记录修改时间及修改人
         setUserData(weatherInfo, true);
+        //重新计算平均气温
+        BigDecimal tempHigh = new BigDecimal(weatherInfo.getTempHigh()), tempLow = new BigDecimal(weatherInfo.getTempLow());
+        weatherInfo.setAirTemp((tempHigh.add(tempLow)).divide(new BigDecimal("2.00"),1, BigDecimal.ROUND_HALF_UP).toString());
+
         return R.status(this.weatherInfoService.updateById(weatherInfo));
     }
 
@@ -107,9 +113,14 @@ public class WeatherController {
             if(recordTime.contains("~")){
                 //说明是时间区间
                 String[] recordTimes = recordTime.split("~");
+                String startTime = recordTimes[0].trim();
+                String endTime = recordTimes[1].trim();
+                //因为between的含头不含尾属性,需要给结尾时间+1
+                endTime = DateUtil.format(org.apache.commons.lang.time.DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
+
                 //因为是区间,所以需要删除原本的条件
                 weatherMap.remove("recordTime");
-                return R.data(this.weatherInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(weatherMap, WeatherInfo.class).lambda().between(WeatherInfo::getRecordTime, recordTimes[0].trim(), recordTimes[1].trim()).orderByDesc(WeatherInfo::getRecordTime)));
+                return R.data(this.weatherInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(weatherMap, WeatherInfo.class).lambda().between(WeatherInfo::getRecordTime, startTime, endTime).orderByDesc(WeatherInfo::getRecordTime)));
             } else {
                 return R.data(this.weatherInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(weatherMap, WeatherInfo.class).lambda().orderByDesc(WeatherInfo::getRecordTime)));
             }

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

@@ -66,6 +66,11 @@ public class TaskParallel extends BaseEntity {
      */
     private String taskUserName;
 
+    /**
+     * 主动审批
+     */
+    private Integer initiative;
+
     public TaskParallel(String processInstanceId, String parallelProcessInstanceId, String taskUser, String taskUserName){
         this.processInstanceId = processInstanceId;
         this.parallelProcessInstanceId = parallelProcessInstanceId;

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

@@ -18,6 +18,7 @@
         <result column="e_visa_content" property="eVisaContent"/>
         <result column="task_user" property="taskUser"/>
         <result column="task_user_name" property="taskUserName"/>
+        <result column="initiative" property="initiative"/>
     </resultMap>
 
     <select id="queryOtherLinkList" resultMap="taskParallelResultMap">

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -106,6 +106,8 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 			TreeVo yearResult = new TreeVo(year, monthResult, year);
 			result.add(yearResult);
 		}
+		//时间倒序
+		result.sort(Comparator.comparing(TreeVo::getName).reversed());
 
 		return result;
 	}

+ 13 - 11
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -99,7 +99,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             //todo ============================ 执行电签区域 ============================
 
             //电签状态为999(错误状态)的就需要重新提交请求
-            if(!"999".equals(eVisaStatus)){
+            if(!"999".equals(eVisaStatus) && currentLink != null){
                 //完成/审批当前分支流程
                 this.newFlowClient.completeApprovalTask(taskId, parallelProcessInstanceId, comment).getData();
                 //修改分支状态,改为已完成
@@ -129,7 +129,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             //完成/审批当前分支流程
             this.newFlowClient.completeApprovalTask(taskId, parallelProcessInstanceId, comment).getData();
             //将分支状态更改为已废除
-            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate().set(TaskParallel::getStatus, 3).set(TaskParallel::getUpdateTime, new Date()).eq(TaskParallel::getParallelProcessInstanceId, parallelProcessInstanceId));
+            this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate().set(TaskParallel::getStatus, 3).set(TaskParallel::getUpdateUser, AuthUtil.getUserId()).set(TaskParallel::getUpdateTime, new Date()).eq(TaskParallel::getParallelProcessInstanceId, parallelProcessInstanceId));
             //获取除当前分支外的所有分支
             List<TaskParallel> otherLink = this.taskParallelService.queryOtherLinkList(parallelProcessInstanceId);
             //主流程实例ID
@@ -142,16 +142,18 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         // todo =================== 撤签调用 ===================
                         // todo =================== 撤签调用 ===================
                     }
-                    //修改所有状态为已废除
-                    this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate().set(TaskParallel::getStatus, 3).set(TaskParallel::getUpdateTime, new Date()).eq(TaskParallel::getId, parallel.getId()));
+                    if(!new Integer("2").equals(parallel.getStatus())){
+                        //修改所有状态为已废除
+                        this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate().set(TaskParallel::getInitiative, 2).set(TaskParallel::getUpdateUser, AuthUtil.getUserId()).set(TaskParallel::getUpdateTime, new Date()).eq(TaskParallel::getId, parallel.getId()));
 
-                    if(new Integer("1").equals(parallel.getStatus())){
-                        //存在未审批的情况,自动执行其分支流程
-                        //获取流程ID
-                        String parallelTaskId = this.newFlowClient.queryTaskIdByProcessInstanceId(parallel.getParallelProcessInstanceId());
-                        if(StringUtils.isNotEmpty(parallelTaskId)){
-                            //执行流程
-                            this.newFlowClient.completeApprovalTask(parallelTaskId, parallel.getParallelProcessInstanceId(), "废除");
+                        if(new Integer("1").equals(parallel.getStatus())){
+                            //存在未审批的情况,自动执行其分支流程
+                            //获取流程ID
+                            String parallelTaskId = this.newFlowClient.queryTaskIdByProcessInstanceId(parallel.getParallelProcessInstanceId());
+                            if(StringUtils.isNotEmpty(parallelTaskId)){
+                                //执行流程
+                                this.newFlowClient.completeApprovalTask(parallelTaskId, parallel.getParallelProcessInstanceId(), "其它分支主动废除任务,当前任务被动完成");
+                            }
                         }
                     }
                 }