Ver Fonte

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

 Conflicts:
	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java
liuyc há 3 anos atrás
pai
commit
490fdb2634
56 ficheiros alterados com 1028 adições e 174 exclusões
  1. 21 0
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java
  3. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionComments.java
  4. 114 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessUserOpinionVO.java
  5. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java
  6. 2 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationShowVO.java
  7. 4 5
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TreeVo.java
  8. 13 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionCommentsVO.java
  9. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ImageClassificationConfig.java
  10. 32 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClient.java
  11. 2 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java
  12. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectContractAreaClient.java
  13. 7 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImageClassificationConfigVO.java
  14. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVOS.java
  15. 124 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/BusinessUserOpinionController.java
  16. 63 34
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  17. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionCommentsController.java
  18. 82 19
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  19. 25 5
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFlowController.java
  20. 21 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java
  21. 8 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java
  22. 10 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java
  23. 45 22
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  24. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionCommentsMapper.xml
  25. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.java
  26. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.xml
  27. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.java
  28. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.xml
  29. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.java
  30. 50 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.xml
  31. 9 18
      blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java
  32. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionCommentsService.java
  33. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFileService.java
  34. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFlowService.java
  35. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionService.java
  36. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/WeatherInfoService.java
  37. 40 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  38. 30 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionCommentsServiceImpl.java
  39. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFileServiceImpl.java
  40. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionFlowServiceImpl.java
  41. 118 24
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java
  42. 21 17
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  43. 28 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClientImpl.java
  44. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java
  45. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectContractAreaClientImpl.java
  46. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.java
  47. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.xml
  48. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.java
  49. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml
  50. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java
  51. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml
  52. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java
  53. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProjectContractAreaService.java
  54. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java
  55. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectContractAreaServiceImpl.java
  56. 12 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java

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

@@ -16,6 +16,9 @@
  */
 package org.springblade.common.utils;
 
+import org.apache.commons.lang.StringUtils;
+
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -26,6 +29,24 @@ import java.util.List;
  */
 public class CommonUtil {
 
+    /**
+     * 判断参数是否是数字
+     * @param value 需要判断数据
+     * @return 判断结果,数字则为true,反之false
+     */
+    public static boolean checkIsBigDecimal(Object value){
+        try{
+            if(StringUtils.isNotEmpty(String.valueOf(value))){
+                new BigDecimal(String.valueOf(value));
+                return true;
+            } else {
+                return false;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
     /**
      * 根据每页信息分组
      */

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

@@ -94,6 +94,11 @@ public class ImageClassificationFile extends BaseEntity {
      */
     @ApiModelProperty("拍摄时间")
     private LocalDateTime shootingTime;
+    /**
+     * 上传日期
+     */
+    @ApiModelProperty("上传日期")
+    private String uploadTime;
     /**
      * 照片号,视频格式不填
      */

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/UserOpinionComments.java

@@ -20,6 +20,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -48,10 +50,12 @@ public class UserOpinionComments extends BaseEntity {
     /**
      * 回复内容
      */
+    @ApiModelProperty("回复内容")
     private String replyContent;
     /**
      * 点赞量
      */
+    @ApiModelProperty("点赞量")
     private Integer goodCount;
     /**
      * 项目ID,创建人所在项目

+ 114 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessUserOpinionVO.java

@@ -0,0 +1,114 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class BusinessUserOpinionVO {
+
+    /**
+     * 工单ID
+     */
+    @ApiModelProperty(value = "工单ID")
+    private Long userOpinionId;
+
+    /**
+     * 提交时间
+     */
+    @ApiModelProperty(value = "提交时间")
+    private Date createTime;
+
+    /**
+     * 剩余时间(分钟)
+     */
+    @ApiModelProperty(value = "剩余时间(分钟)")
+    private String timeRemaining;
+
+    /**
+     * 最后处理时间
+     */
+    @ApiModelProperty(value = "最后处理时间")
+    private String manageTime;
+
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    /**
+     * 合同段名称
+     */
+    @ApiModelProperty(value = "合同段名称")
+    private String contractName;
+
+    /**
+     * 问题类型
+     */
+    @ApiModelProperty(value = "问题类型")
+    private String problemType;
+
+    /**
+     * 内容
+     */
+    @ApiModelProperty(value = "内容")
+    private String opinionContent;
+
+    /**
+     * 图片路径
+     */
+    @ApiModelProperty(value = "图片路径")
+    private List<String> imageUrl;
+
+    /**
+     * 当前用户的处理状态(false为异常或未处理,true为已处理,但不一定是最新的)
+     */
+    @ApiModelProperty(value = "当前用户的处理状态(false为异常或未处理,true为已处理,但不一定是最新的)")
+    private Boolean isCurrent;
+
+    /**
+     * 当前用户处理属于第几次流程
+     */
+    @ApiModelProperty(value = "第几次流程")
+    private Integer number;
+
+    /**
+     * 当前用户的评价类型,默认null: 1满意,2不满意并再次提交,3不满意并投诉
+     */
+    @ApiModelProperty(value = "当前用户的评价类型,默认null: 1满意,2不满意并再次提交,3不满意并投诉")
+    private Integer evaluation;
+
+    /**
+     * 当前工单的最新处理状态(false为异常或未处理,true为已处理,但不一定是最新的)
+     */
+    @ApiModelProperty(value = "当前工单的最新处理状态(false为异常或未处理,true为已处理,但不一定是最新的)")
+    private Boolean newIsCurrent;
+
+    /**
+     * 当前工单最新的流程
+     */
+    @ApiModelProperty(value = "当前工单最新的流程")
+    private Integer newNumber;
+
+    /**
+     * 当前流程能否被当前登录用户操作
+     */
+    @ApiModelProperty(value = "当前流程能否被当前登录用户操作")
+    private Boolean operation;
+
+    /**
+     * 当前环节ID
+     */
+    @ApiModelProperty(value = "当前环节ID")
+    private Long currentLinkId;
+
+    /**
+     * 当前环节
+     */
+    @ApiModelProperty(value = "当前环节")
+    private Integer currentLink;
+
+}

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java

@@ -65,4 +65,10 @@ public class ImageClassificationFileVO extends ImageClassificationFile {
 	@ApiModelProperty("时间查询(年、年-月、年-月-日)")
 	private String queryDate;
 
+	/**
+	 * 拍摄时间,字符串
+	 */
+	@ApiModelProperty("拍摄时间,字符串")
+	private String shootingTimeStr;
+
 }

+ 2 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationShowVO.java

@@ -1,5 +1,6 @@
 package org.springblade.business.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.business.entity.ImageClassificationShow;
 
@@ -8,6 +9,7 @@ import java.util.List;
 @Data
 public class ImageClassificationShowVO {
 
+    @ApiModelProperty("显隐控制表单数据")
     private List<ImageClassificationShow> showList;
 
 }

+ 4 - 5
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TreeVo.java

@@ -10,15 +10,14 @@ public class TreeVo {
 
     private String name;
 
+    private String hierarchy;
+
     private List<TreeVo> treeList = new ArrayList<>();
 
-    public TreeVo(String name, List<TreeVo> treeList){
+    public TreeVo(String name, List<TreeVo> treeList, String hierarchy){
         this.name = name;
         this.treeList = treeList;
-    }
-
-    public TreeVo(String name){
-        this.name = name;
+        this.hierarchy = hierarchy;
     }
 
     public TreeVo(){}

+ 13 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/UserOpinionCommentsVO.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.business.entity.UserOpinionComments;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -31,4 +32,16 @@ import lombok.EqualsAndHashCode;
 public class UserOpinionCommentsVO extends UserOpinionComments {
 	private static final long serialVersionUID = 1L;
 
+	/**
+	 * 用户头像
+	 */
+	@ApiModelProperty(value = "用户头像")
+	private String avatar;
+
+	/**
+	 * 用户姓名
+	 */
+	@ApiModelProperty(value = "用户姓名")
+	private String userName;
+
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ImageClassificationConfig.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -40,22 +41,27 @@ public class ImageClassificationConfig extends BaseEntity {
     /**
      * 分类名称
      */
+    @ApiModelProperty(value = "分类名称")
     private String classfName;
     /**
      * 所属项目阶段
      */
+    @ApiModelProperty(value = "所属项目阶段")
     private String projectStage;
     /**
      * 所属方
      */
+    @ApiModelProperty(value = "所属方")
     private String affiliatedParty;
     /**
      * 文件类型
      */
+    @ApiModelProperty(value = "文件类型 1视频文件,2图片文件")
     private Integer fileType;
     /**
      * 存储目录格式
      */
+    @ApiModelProperty(value = "存储目录格式 1按部位存储,2按日期存储")
     private Integer storageDirectoryFormat;
 
 

+ 32 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClient.java

@@ -0,0 +1,32 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+public interface ProjectAssignmentUserClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/projectAssignmentUser";
+
+    @GetMapping(API_PREFIX + "/queryCurrentUserDownAllContractAndProjectId")
+    List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(@RequestParam Long userId);
+
+    /**
+     * 根据项目ID及合同段ID获取当前绑定的维护人员
+     * @param projectId 项目ID
+     * @param contractId 合同段ID
+     * @return 结果
+     */
+    @GetMapping(API_PREFIX + "/queryCurrentProjectContractAssignmentUserList")
+    List<SaveUserInfoByProjectDTO> queryCurrentProjectContractAssignmentUserList(@RequestParam Long projectId, @RequestParam Long contractId);
+
+}

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

@@ -3,6 +3,7 @@ package org.springblade.manager.feign;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -21,6 +22,6 @@ public interface ProjectClient {
      * @return 结果集
      */
     @GetMapping(API_PREFIX + "/queryProjectList")
-    List<ProjectInfo> queryProjectList();
+    List<ProjectInfo> queryProjectList(@RequestParam List<String> projectIds);
 
 }

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

@@ -5,6 +5,8 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
 @FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
@@ -23,4 +25,7 @@ public interface ProjectContractAreaClient {
     @GetMapping(API_PREFIX + "/queryContractAreaByContractId")
     ProjectContractArea queryContractAreaByContractId(@RequestParam String contractId);
 
+    @GetMapping(API_PREFIX + "/queryAllContractArea")
+    List<ProjectContractArea> queryAllContractArea();
+
 }

+ 7 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImageClassificationConfigVO.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.manager.entity.ImageClassificationConfig;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -34,11 +35,16 @@ public class ImageClassificationConfigVO extends ImageClassificationConfig {
 	/**
 	 * image_classification_show表 is_show
 	 */
-	private Integer isShow;
+	@ApiModelProperty(value = "是否显示 true为显示")
+	private Boolean isShow;
 
 	/**
 	 * image_classification_show表 ID
 	 */
+	@ApiModelProperty(value = "显示控制表主键,可为空,若有值则修改数据时必传")
 	private Long showId;
 
+	@ApiModelProperty(value = "当前类型下文件数量")
+	private Integer count;
+
 }

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVOS.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.ArrayList;
@@ -11,24 +12,32 @@ import java.util.List;
 @Data
 public class WbsTreeContractTreeVOS {
 
+    @ApiModelProperty("显隐控制表单数据")
     private String value;
 
     private String key;
 
+    @ApiModelProperty("节点类型")
     private Integer type;
 
+    @ApiModelProperty("节点名称")
     private String title;
 
+    @ApiModelProperty("父节点")
     private String parentId;
 
     private String id;
 
+    @ApiModelProperty("模板类型")
     private Integer wbsType;
 
+    @ApiModelProperty("主键,唯一ID")
     private String primaryKeyId;
 
+    @ApiModelProperty("是否是工序 true为工序")
     private Boolean leaf;
 
+    @ApiModelProperty("子节点")
     private List<WbsTreeContractTreeVOS> children = new ArrayList<>();
 
 }

+ 124 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/BusinessUserOpinionController.java

@@ -0,0 +1,124 @@
+package org.springblade.business.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.UserOpinionFlow;
+import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.business.service.IUserOpinionService;
+import org.springblade.business.vo.BusinessUserOpinionVO;
+import org.springblade.business.vo.UserOpinionFlowVO;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/businessUserOpinion")
+@Api(tags = "维护人员工单列表")
+public class BusinessUserOpinionController {
+
+    private final IUserOpinionService userOpinionService;
+
+    private final IUserOpinionFlowService userOpinionFlowService;
+
+    /**
+     * 获取所有工单及处理进度
+     * @param query 分页信息
+     * @return 结果
+     */
+    @GetMapping("/queryBusinessUserOpinionListAll")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "所有工单处理列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "query", value = "分页信息", required = true)
+    })
+    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionListAll(@RequestBody Query query){
+        return R.data(this.userOpinionService.queryBusinessUserOpinionListAll(query));
+    }
+
+    /**
+     * 业务人员提交环节操作
+     * @return 结果
+     */
+    @PostMapping("/manageUserOperationStatus")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "业务人员提交环节操作")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userOpinionId", value = "工单ID", required = true),
+            @ApiImplicitParam(name = "newNumber", value = "当前流程次数", required = true),
+            @ApiImplicitParam(name = "currentLinkId", value = "当前环节ID", required = true)
+    })
+    public R<Boolean> manageUserOperationStatus(@RequestParam String userOpinionId, @RequestParam Integer newNumber, @RequestParam String currentLinkId){
+        if(StringUtils.isEmpty(currentLinkId)){
+            return R.data(-1, false, "缺少currentLinkId参数");
+        }
+        //获取当前操作用户
+        BladeUser user = AuthUtil.getUser();
+        //获取当前最新流程
+        List<UserOpinionFlowVO> flowVOS = this.userOpinionFlowService.queryCurrentUserOpinionFlowByUserOpinionId(userOpinionId, newNumber);
+        //找到当前环节的下一环节
+        Long nextLink = null, nextLinkEnd = null;
+        for(int i = 0, l = flowVOS.size(); i < l; i ++){
+            if(new Long(currentLinkId).equals(flowVOS.get(i).getId())){
+                //找到下一个环节ID
+                switch (i){
+                    case 1:
+                        //说明当前环节是提交"进入人工处理环节"操作
+                        nextLink = flowVOS.get(i + 1).getId();
+                        break;
+                    case 2:
+                        //说明当前环节是提交"已解决"操作
+                        nextLinkEnd = flowVOS.get(i + 1).getId();
+                        break;
+                    default:
+                        break;
+                }
+                break;
+            }
+        }
+        //将当前环节更改为已完成
+        boolean result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getIsCurrent, 2).set(UserOpinionFlow::getUpdateUser, user.getUserId()).set(UserOpinionFlow::getUpdateTime, new Date()).eq(UserOpinionFlow::getId, currentLinkId));
+        if(result){
+            if(nextLink != null && StringUtils.isNotEmpty(String.valueOf(nextLink))){
+                //提交"进入人工处理环节"操作
+                result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getIsCurrent, 1).eq(UserOpinionFlow::getId, nextLink));
+            }
+            if(nextLinkEnd != null && StringUtils.isNotEmpty(String.valueOf(nextLinkEnd))){
+                //提交"已解决"操作
+                result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getIsCurrent, 2).eq(UserOpinionFlow::getId, nextLinkEnd));
+            }
+            return R.data(result);
+        }
+
+        return R.data(false);
+    }
+
+    /**
+     * 获取分配给当前登录用户的工单记录
+     * @return 结果集
+     */
+    @GetMapping("/queryBusinessUserOpinionList")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取分配给当前登录用户的工单记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "current", value = "当前页", required = true),
+            @ApiImplicitParam(name = "size", value = "当前页显示数量", required = true)
+    })
+    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionList(@RequestBody Query query){
+        BladeUser user = AuthUtil.getUser();
+        //获取推送给当前用户的工单信息
+        return R.data(this.userOpinionService.queryBusinessUserOpinionList(String.valueOf(user.getUserId()),query));
+    }
+
+}

+ 63 - 34
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
@@ -7,8 +8,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-
-import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import org.springblade.business.entity.ImageClassificationShow;
 import org.springblade.business.service.ImageClassificationShowService;
@@ -25,6 +24,8 @@ import org.springblade.manager.feign.ImageClassificationConfigClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.ImageClassificationConfigVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.system.entity.Dict;
+import org.springblade.system.feign.IDictClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -32,7 +33,6 @@ import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.core.boot.ctrl.BladeController;
-import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -59,6 +59,8 @@ public class ImageClassificationFileController extends BladeController {
 
 	private final WbsTreeContractClient wbsTreeContractClient;
 
+	private final IDictClient dictClient;
+
 	/**
 	 * 获取当前合同段的工程划分
 	 * @param parentId 父节点,为空则查询第一级节点
@@ -76,19 +78,18 @@ public class ImageClassificationFileController extends BladeController {
 			//为空,说明初始化
 			//获取根节点
 			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
-			if(rootTreeNode != null && rootTreeNode.size() != 0){
-				rootTreeNode.forEach(vo -> {
-					//获取一级子节点
-					List<WbsTreeContractTreeVOS> treeNodes = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, vo.getId());
-					if(treeNodes != null && treeNodes.size() != 0){
-						vo.setChildren(treeNodes);
-					}
-				});
-			}
+//			if(rootTreeNode != null && rootTreeNode.size() != 0){
+//				rootTreeNode.forEach(vo -> {
+//					//获取一级子节点
+//					List<WbsTreeContractTreeVOS> treeNodes = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, vo.getId());
+//					if(treeNodes != null && treeNodes.size() != 0){
+//						vo.setChildren(treeNodes);
+//					}
+//				});
+//			}
 		} else {
-			// todo 先写死项目ID
 			//不为空,获取其下子节点
-			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType("1", 1, parentId);
+			rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
 		}
 		return R.data(rootTreeNode);
 	}
@@ -110,10 +111,11 @@ public class ImageClassificationFileController extends BladeController {
 		//判断提交的数据哪些是新增哪些是修改
 		List<ImageClassificationShow> saveShow = new ArrayList<>(), updateShow = new ArrayList<>();
 		shows.forEach(show -> {
-			if(show.getId() == null){
+			if(show.getId() == null || show.getId() == -1){
 				setUserData(show, true);
 				ImageClassificationShow newShow = new ImageClassificationShow();
 				BeanUtils.copyProperties(show, newShow);
+				newShow.setId(null);
 				saveShow.add(newShow);
 			} else {
 				setUserData(show, false);
@@ -155,7 +157,7 @@ public class ImageClassificationFileController extends BladeController {
 			showClassifyIdList.forEach(show -> {
 				for(ImageClassificationConfigVO vo : sysClassifyConfigVoList){
 					if(show.getClassifyId().equals(vo.getId())){
-						vo.setIsShow(show.getIsShow());
+						vo.setIsShow(new Integer("1").equals(show.getIsShow()));
 						vo.setShowId(show.getId());
 						break;
 					}
@@ -165,12 +167,12 @@ public class ImageClassificationFileController extends BladeController {
 			sysClassifyConfigVoList.forEach(vo -> {
 				if(StringUtils.isEmpty(String.valueOf(vo.getShowId()))){
 					//默认为不显示
-					vo.setIsShow(0);
+					vo.setIsShow(false);
 				}
 			});
 		} else {
 			//不存在显隐记录,全部默认为显示
-			sysClassifyConfigVoList.forEach(vo -> vo.setIsShow(1));
+			sysClassifyConfigVoList.forEach(vo -> vo.setIsShow(true));
 		}
 
 		return R.data(sysClassifyConfigVoList);
@@ -183,7 +185,7 @@ public class ImageClassificationFileController extends BladeController {
 	@GetMapping("/getClassIfyList")
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "获取类型列表(类型主页)")
-	public R<List<ImageClassificationConfig>> getClassIfyList(@RequestParam String projectId, @RequestParam String contractId){
+	public R<List<ImageClassificationConfigVO>> getClassIfyList(@RequestParam String projectId, @RequestParam String contractId){
 		//获取当前项目下的类型显隐情况
 		List<ImageClassificationShow> showClassifyIdList = this.imageClassificationShowService.queryShowClassify(projectId, contractId, "valid");
 
@@ -196,19 +198,28 @@ public class ImageClassificationFileController extends BladeController {
 		} else {
 			configList = this.imageClassificationConfigClient.queryClassificationConfigList();
 		}
+		//转换类型
+		List<ImageClassificationConfigVO> configVoList = JSONArray.parseArray(JSONObject.toJSONString(configList), ImageClassificationConfigVO.class);
 
-		return R.data(configList);
-	}
+		//获取项目阶段字典
+		List<Dict> dictBizList = this.dictClient.getList("project_stage").getData();
 
-	/**
-	 * 下载
-	 * @param id 要下载的数据ID
-	 */
-	@PostMapping("/downloadFileByUrl")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "下载", notes = "传入id主键")
-	public void downloadFileByUrl(@RequestParam String id, HttpServletResponse response) throws IOException {
+		configVoList.forEach(vo -> {
+			//转换项目阶段
+			for(Dict biz : dictBizList){
+				if(biz.getDictKey().equals(vo.getProjectStage())){
+					vo.setProjectStage(biz.getDictValue());
+					break;
+				}
+			}
+
+			//获取当前节点下的文件
+			Integer count = this.imageClassificationFileService.queryCurrentClassifyAllFileCount(projectId, contractId, vo.getId());
+			vo.setCount(count);
 
+		});
+
+		return R.data(configVoList);
 	}
 
 	/**
@@ -258,8 +269,15 @@ public class ImageClassificationFileController extends BladeController {
 	@PostMapping("/queryById")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "详情", notes = "传入主键")
-	public R<ImageClassificationFile> queryById(@RequestParam String id){
-		return R.data(this.imageClassificationFileService.getById(id));
+	public R<ImageClassificationFileVO> queryById(@RequestParam String id){
+		ImageClassificationFile file = this.imageClassificationFileService.getById(id);
+		if(file != null){
+			ImageClassificationFileVO vo = new ImageClassificationFileVO();
+			BeanUtils.copyProperties(file, vo);
+			vo.setShootingTimeStr(DateUtil.format(file.getShootingTime(), "yyyy-MM-dd"));
+			return R.data(vo);
+		}
+		return R.data(null);
 	}
 
 	/**
@@ -300,9 +318,20 @@ public class ImageClassificationFileController extends BladeController {
 		ImageClassificationFile newFile = new ImageClassificationFile();
 		//复制数据
 		BeanUtils.copyProperties(fileVO, newFile);
+		try{
+			String shootingTime = fileVO.getShootingTimeStr();
+			String format = "yyyy-MM-dd";
+			if(shootingTime.contains(":")){
+				format = "yyyy-MM-dd HH:mm:ss";
+			}
+			newFile.setShootingTime(DateUtil.parseLocalDateTime(shootingTime, format));
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+
 		//设置用户信息
 		setUserData(newFile, isCreate);
-		return new ImageClassificationFile();
+		return newFile;
 	}
 
 	/**
@@ -322,7 +351,7 @@ public class ImageClassificationFileController extends BladeController {
 		//记录操作人信息
 		if(isCreate){
 			imageClassificationShow.setCreateUser(user.getUserId());
-			imageClassificationShow.setCreateDept(Long.parseLong(user.getDeptId()));
+			imageClassificationShow.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
 		} else {
 			imageClassificationShow.setUpdateUser(user.getUserId());
 			imageClassificationShow.setUpdateTime(new Date());
@@ -336,7 +365,7 @@ public class ImageClassificationFileController extends BladeController {
 		//记录操作人信息
 		if(isCreate){
 			imageClassificationFile.setCreateUser(user.getUserId());
-			imageClassificationFile.setCreateDept(Long.parseLong(user.getDeptId()));
+			imageClassificationFile.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
 		} else {
 			imageClassificationFile.setUpdateUser(user.getUserId());
 			imageClassificationFile.setUpdateTime(new Date());

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

@@ -20,6 +20,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
+import org.springblade.business.vo.UserOpinionCommentsVO;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -56,7 +57,7 @@ public class UserOpinionCommentsController extends BladeController {
 	@GetMapping("/queryUserOpinionCommentsByUserOpinionId")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "获取当前工单下的所有评论")
-	public R<List<UserOpinionComments>> queryUserOpinionCommentsByUserOpinionId(@RequestParam String userOpinionId){
+	public R<List<UserOpinionCommentsVO>> queryUserOpinionCommentsByUserOpinionId(@RequestParam String userOpinionId){
 		return R.data(this.userOpinionCommentsService.queryUserOpinionCommentsByUserOpinionId(userOpinionId));
 	}
 

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

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -14,15 +15,19 @@ import org.springblade.business.entity.UserOpinionFile;
 import org.springblade.business.entity.UserOpinionFlow;
 import org.springblade.business.service.IUserOpinionFileService;
 import org.springblade.business.service.IUserOpinionFlowService;
-import org.springblade.common.utils.IDUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.feign.ProjectAssignmentUserClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.vo.DictBizVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
@@ -33,10 +38,7 @@ import org.springblade.business.vo.UserOpinionVO;
 import org.springblade.business.service.IUserOpinionService;
 import org.springblade.core.boot.ctrl.BladeController;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 /**
  * 用户意见表 控制器
@@ -58,6 +60,29 @@ public class UserOpinionController extends BladeController {
 
 	private final IDictBizClient dictBizClient;
 
+	private final ProjectAssignmentUserClient projectAssignmentUserClient;
+
+	private final IUserClient userClient;
+
+	/**
+	 * 取消点赞
+	 * @param userOpinionId 工单ID
+	 * @return 结果
+	 */
+	@PostMapping("/cancelGood")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "取消点赞")
+	@ApiImplicitParam(name = "userOpinionId", value = "工单ID")
+	public R<Boolean> cancelGood(@RequestParam String userOpinionId){
+		if(StringUtils.isNotEmpty(userOpinionId)){
+			UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
+			//获取原本的点赞数
+			Integer oldGood = opinion.getGoodNumber();
+			return R.data(this.userOpinionService.update(Wrappers.<UserOpinion>lambdaUpdate().set(UserOpinion::getGoodNumber, (oldGood - 1)).eq(UserOpinion::getId, userOpinionId)));
+		}
+		return R.data(-1, false, "数据操作失败");
+	}
+
 	/**
 	 * 获取工单服务相关数据字典
 	 * @return 结果
@@ -68,30 +93,47 @@ public class UserOpinionController extends BladeController {
 	public R<List<DictBizVO>> queryDictBizList(){
 		//获取字典
 		List<DictBiz> dictList = this.dictBizClient.getList("opinion_type", "").getData();
-		//首先找到父节点为0的
-		List<DictBizVO> result = new ArrayList<>();
+		//找到根节点
+		DictBiz root = null;
 		Iterator<DictBiz> iterator = dictList.iterator();
 		while (iterator.hasNext()){
 			DictBiz biz = iterator.next();
 			if(new Long("0").equals(biz.getParentId())){
+				root = biz;
+				iterator.remove();
+				break;
+			}
+		}
+
+		//首先找到父节点为0的
+		List<DictBizVO> result = new ArrayList<>();
+		Iterator<DictBiz> iterator1 = dictList.iterator();
+		while (iterator1.hasNext()){
+			DictBiz biz = iterator1.next();
+			if(root != null && root.getId().equals(biz.getParentId())){
 				DictBizVO vo = new DictBizVO();
 				BeanUtils.copyProperties(biz, vo);
 				result.add(vo);
-				iterator.remove();
+				iterator1.remove();
+			} else if(new Long("0").equals(biz.getParentId())){
+				DictBizVO vo = new DictBizVO();
+				BeanUtils.copyProperties(biz, vo);
+				result.add(vo);
+				iterator1.remove();
 			}
 		}
 		//组成相关结构树
 		result.forEach(vo -> {
 			List<DictBizVO> clientList = new ArrayList<>();
-			Iterator<DictBiz> iterators = dictList.iterator();
-			while (iterators.hasNext()){
-				DictBiz biz = iterators.next();
+			Iterator<DictBiz> iterator2 = dictList.iterator();
+			while (iterator2.hasNext()){
+				DictBiz biz = iterator2.next();
 				if(biz.getParentId().equals(vo.getId())){
 					//找到子节点
 					DictBizVO voClient = new DictBizVO();
 					BeanUtils.copyProperties(biz, voClient);
 					clientList.add(voClient);
-					iterators.remove();
+					iterator2.remove();
 				}
 			}
 			vo.setChildren(clientList);
@@ -156,7 +198,7 @@ public class UserOpinionController extends BladeController {
 		//设置用户信息
 		this.setUserData(userOpinionVo);
 		//生成主表ID
-		long idKey = IDUtils.generateId19();
+		long idKey = SnowFlakeUtil.getId();
 		userOpinionVo.setId(idKey);
 
 		//获取附件信息
@@ -183,18 +225,39 @@ public class UserOpinionController extends BladeController {
 			//新增附件信息
 			this.userOpinionFileService.saveBatch(saveFileList);
 		}
+		//获取当前项目合同段下分配的维护人员
+		String manageUserName = "admin", manegeUserPhone = "";
+		Long manageUser = 1123598821738675201L;
+		try{
+			List<SaveUserInfoByProjectDTO> assignmentUserList = this.projectAssignmentUserClient.queryCurrentProjectContractAssignmentUserList(userOpinionVo.getProjectId(), userOpinionVo.getContractId());
+			if(assignmentUserList != null && assignmentUserList.size() > 0){
+				//有分配人员,随机获取某一个人员
+				Random random = new Random();
+				//随机结果集长度下的数量
+				int ran = random.nextInt(assignmentUserList.size());
+				SaveUserInfoByProjectDTO userDto = assignmentUserList.get(ran);
+				User user = this.userClient.userInfoById(Long.parseLong(userDto.getUserId())).getData();
+				if(user != null){
+					manageUser = user.getId();
+					manageUserName = user.getRealName();
+					manegeUserPhone = user.getPhone();
+				}
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
 
 		//生成第一次流程
 		List<UserOpinionFlow> saveFlowList = new ArrayList<>();
+		String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
 		//提交成功环节
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 2, 1, 1, "已提交", "已成功提交您的工单信息", null, 123654L, "马自达", "123456789")));
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 2, 1, 1, "已提交", "已成功提交您的工单信息", manageTime, manageUser, manageUserName, manegeUserPhone)));
 		//分配维护人员环节
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 1, 1, 2, "已分配专属客服", "客服:马自达<br>电话:123456789", null, 123654L, "马自达", "123456789")));
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 1, 1, 2, "已分配专属客服", "客服:" + manageUser + "<br>电话:" + manegeUserPhone, manageTime, manageUser, manageUserName, manegeUserPhone)));
 		//进入人工预处理环节
-		String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, 123654L, "马自达", "123456789")));
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, manageUser, manageUserName, manegeUserPhone)));
 		//问题已解决
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 4, "问题已解决", null, null, 123654L, "马自达", "123456789")));
+		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 4, "问题已解决", null, manageTime, manageUser, manageUserName, manegeUserPhone)));
 		//新增处理环节
 		this.userOpinionFlowService.saveBatch(saveFlowList);
 		//最后新增主表数据
@@ -219,7 +282,7 @@ public class UserOpinionController extends BladeController {
 		//获取当前登录人
 		BladeUser user = AuthUtil.getUser();
 		userOpinion.setCreateUser(user.getUserId());
-		userOpinion.setCreateUserName(user.getUserName());
+		userOpinion.setCreateUserName(user.getRoleName());
 		userOpinion.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
 	}
 }

+ 25 - 5
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionFlowController.java

@@ -32,6 +32,10 @@ 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.DateUtil;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.feign.ProjectAssignmentUserClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.business.entity.UserOpinionFlow;
@@ -41,6 +45,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Random;
 
 /**
  * 用户意见处理流程表 控制器
@@ -58,6 +63,10 @@ public class UserOpinionFlowController extends BladeController {
 
 	private final IUserOpinionService userOpinionService;
 
+	private final ProjectAssignmentUserClient projectAssignmentUserClient;
+
+	private final IUserClient userClient;
+
 	/**
 	 * 统合接口
 	 * @param oldEndFlow 流程图的最后一个节点ID
@@ -118,17 +127,28 @@ public class UserOpinionFlowController extends BladeController {
 			Integer newNumber = userOpinion.getNumber() + 1;
 			userOpinion.setNumber(newNumber);
 
+			//获取前一个流程的维护人员
+			UserOpinionFlow leftFlow = this.userOpinionFlowService.queryLeftFlowManageUser(newNumber - 1, userOpinionId);
+
+			String manageUserName = "admin", manegeUserPhone = "";
+			Long manageUser = 1123598821738675201L;
+			if(leftFlow != null){
+				manageUser = leftFlow.getManageUser();
+				manageUserName = leftFlow.getManageUserName();
+				manegeUserPhone = leftFlow.getManageUserPhone();
+			}
+
 			//生成新流程
 			List<UserOpinionFlow> saveFlowList = new ArrayList<>();
+			String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
 			//提交成功环节
-			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 2, newNumber, 1, "已提交", "已成功提交您的工单信息", null, 123654L, "马自达", "123456789"), true));
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 2, newNumber, 1, "已提交", "已成功提交您的工单信息", manageTime, manageUser, manageUserName, manegeUserPhone), true));
 			//分配维护人员环节
-			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 1, newNumber, 2, "已分配专属客服", "客服:马自达<br>电话:123456789", null, 123654L, "马自达", "123456789"), true));
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 1, newNumber, 2, "已分配专属客服", "客服:"+manageUserName+"<br>电话:" + manegeUserPhone, manageTime, manageUser, manageUserName, manegeUserPhone), true));
 			//进入人工预处理环节
-			String manageTime = DateUtil.format(DateUtils.addDays(new Date(), 5), "yyyy-MM-dd");
-			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, 123654L, "马自达", "123456789"), true));
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 3, "进入人工预处理环节", "预计" + manageTime + "之前完成", manageTime, manageUser, manageUserName, manegeUserPhone), true));
 			//问题已解决
-			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 4, "问题已解决", null, null, 123654L, "马自达", "123456789"), true));
+			saveFlowList.add(this.setUserData(new UserOpinionFlow(Long.parseLong(userOpinionId), 0, newNumber, 4, "问题已解决", null, manageTime, manageUser, manageUserName, manegeUserPhone), true));
 
 			//修改流程
 			this.userOpinionFlowService.updateById(oldFlow);

+ 21 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java

@@ -6,10 +6,14 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ContractClient;
+import org.springblade.manager.feign.ProjectAssignmentUserClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.vo.ContractInfoVO;
 import org.springblade.manager.vo.ProjectInfoVO;
@@ -31,6 +35,8 @@ public class UserViewProjectContractController {
 
     private final ContractClient contractClient;
 
+    private final ProjectAssignmentUserClient projectAssignmentUserClient;
+
     /**
      * 获取客户端首页当前用户关联的项目及合同段信息
      * @return 项目及合同段结果集
@@ -39,19 +45,30 @@ public class UserViewProjectContractController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "获取客户端首页当前用户关联的项目及合同段信息")
     public R<List<ProjectInfoVO>> queryUserViewProjectAndContract(){
+        BladeUser user = AuthUtil.getUser();
+        if(user == null){
+            return R.data(null);
+        }
+        //获取当前用户的所有相关项目及合同段ID
+        List<SaveUserInfoByProjectDTO> userDownAll = this.projectAssignmentUserClient.queryCurrentUserDownAllContractAndProjectId(user.getUserId());
+        //获取项目ID
+        List<String> projectIds = userDownAll.stream().map(SaveUserInfoByProjectDTO::getProjectId).distinct().collect(Collectors.toList());
+        //获取合同段ID
+        List<String> contractIds = userDownAll.stream().map(SaveUserInfoByProjectDTO::getContractId).distinct().collect(Collectors.toList());
+
         //获取项目列表
-        List<ProjectInfo> projectInfos =this.projectClient.queryProjectList();
+        List<ProjectInfo> projectInfos = this.projectClient.queryProjectList(projectIds);
         if(projectInfos != null && projectInfos.size() != 0){
-            //获取所有项目ID
-            List<Long> projectIds = projectInfos.stream().map(ProjectInfo::getId).distinct().collect(Collectors.toList());
+            List<Long> longProjectIds = projectInfos.stream().map(ProjectInfo::getId).distinct().collect(Collectors.toList());
             //获取当前所有合同段
-            List<ContractInfo> contractInfos = this.contractClient.queryContractListByIds(projectIds);
+            List<ContractInfo> contractInfos = this.contractClient.queryContractListByIds(longProjectIds);
 
             //转换VO
             List<ProjectInfoVO> projectInfoVOS = JSONArray.parseArray(JSONObject.toJSONString(projectInfos), ProjectInfoVO.class);
             if(contractInfos != null && contractInfos.size() != 0){
                 //转换VO
                 List<ContractInfoVO> contractInfoVOS = JSONArray.parseArray(JSONObject.toJSONString(contractInfos), ContractInfoVO.class);
+                contractInfoVOS.removeIf(vo -> !contractIds.contains(String.valueOf(vo.getId())));
 
                 projectInfoVOS.forEach(vo -> {
                     //统一返回格式

+ 8 - 6
blade-service/blade-business/src/main/java/org/springblade/business/controller/WeatherController.java

@@ -1,9 +1,7 @@
 package org.springblade.business.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -70,9 +68,13 @@ public class WeatherController {
      * @param yearMonthDay 所选年份-月-日,也可以其他组合
      * @return 结果集
      */
-    @PostMapping(value = "queryWeatherAllByYear")
-    public R<List<Map<String,List<Map<String,Object>>>>> queryWeatherAllByYear(@RequestParam String yearMonthDay){
-        return R.data(this.weatherInfoService.queryWeatherAllByYear(yearMonthDay));
+    @GetMapping(value = "queryWeatherAllByYear")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "yearMonthDay", value = "年份", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+    })
+    public R<List<Map<String,List<Map<String,Object>>>>> queryWeatherAllByYear(@RequestParam String yearMonthDay, @RequestParam String contractId){
+        return R.data(this.weatherInfoService.queryWeatherAllByYear(yearMonthDay, contractId));
     }
 
     /**

+ 10 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.java

@@ -31,6 +31,15 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface ImageClassificationFileMapper extends BaseMapper<ImageClassificationFile> {
 
+	/**
+	 * 获取当前分类、项目、合同段下的所有文件数量
+	 * @param projectId 项目ID
+	 * @param contractId 合同段ID
+	 * @param classifyId 分类ID
+	 * @return 结果
+	 */
+	Integer queryCurrentClassifyAllFileCount(@Param("projectId") String projectId,@Param("contractId") String contractId,@Param("classifyId") Long classifyId);
+
 	/**
 	 * 获取当前分类下当前项目的拍摄时间
 	 * @param classifyId 分类ID
@@ -47,6 +56,6 @@ public interface ImageClassificationFileMapper extends BaseMapper<ImageClassific
 	 * @param imageClassificationFile 参数
 	 * @return 结果
 	 */
-	List<ImageClassificationFileVO> selectImageClassificationFilePage(@Param("current")long current, @Param("size")long size, @Param("param") ImageClassificationFileVO imageClassificationFile);
+	List<ImageClassificationFile> selectImageClassificationFilePage(@Param("current")long current, @Param("size")long size, @Param("param") ImageClassificationFileVO imageClassificationFile);
 
 }

+ 45 - 22
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -23,12 +23,20 @@
         <result column="file_name" property="fileName"/>
         <result column="shooting_user" property="shootingUser"/>
         <result column="shooting_time" property="shootingTime"/>
+        <result column="upload_time" property="uploadTime"/>
         <result column="photo_code" property="photoCode"/>
         <result column="film_code" property="filmCode"/>
         <result column="see_also_code" property="seeAlsoCode"/>
         <result column="text_content" property="textContent"/>
     </resultMap>
 
+    <select id="queryCurrentClassifyAllFileCount" resultType="java.lang.Integer">
+        select count(id) from u_image_classification_file where is_deleted = 0 and classify_id = #{classifyId} and contract_id = #{contractId}
+        <if test="projectId != null and projectId != ''">
+            and project_id = #{projectId}
+        </if>
+    </select>
+
     <select id="selectShootingTimeByClassifyAndProjectId" resultType="java.util.Date">
         select shooting_time from u_image_classification_file where is_deleted = 0 and classify_id = #{classifyId} and project_id = #{projectId}
         <if test="contractId != null and contractId != ''">
@@ -39,30 +47,45 @@
 
     <select id="selectImageClassificationFilePage" resultMap="imageClassificationFileResultMap">
         select
-            id,
-            title,
-            text_content,
-            shooting_user,
-            shooting_time,
-            file_size,
-            image_url
-        from u_image_classification_file where is_deleted = 0
-        and project_id = #{param.projectId} and classify_id = #{param.classifyId}
-        <if test="param.contractId != null and param.contractId != ''">
-            and contract_id = #{param.contractId}
-        </if>
-        <if test="param.queryStr != null and param.queryStr != ''">
-            and (title like CONCAT('%',#{param.queryStr},'%') OR shooting_user like CONCAT('%',#{param.queryStr},'%'))
-        </if>
+            files.id,
+            files.title,
+            files.text_content,
+            files.shooting_user,
+            files.shooting_time,
+            files.file_size,
+            files.image_url,
+            files.type
+        from
+        (
+            select
+                id,
+                title,
+                text_content,
+                shooting_user,
+                shooting_time,
+                file_size,
+                image_url,
+                type,
+                date_format(shooting_time,'%Y-%m-%d') as shootingTimeStr
+            from u_image_classification_file where is_deleted = 0
+            and project_id = #{param.projectId} and classify_id = #{param.classifyId}
+            <if test="param.contractId != null and param.contractId != ''">
+                and contract_id = #{param.contractId}
+            </if>
+            <if test="param.queryStr != null and param.queryStr != ''">
+                and (title like concat('%',#{param.queryStr},'%') OR shooting_user like concat('%',#{param.queryStr},'%'))
+            </if>
+            <if test="param.wbsIds != null and param.wbsIds.size != 0">
+                and wbs_id in
+                <foreach collection="param.wbsIds" item="webId" open="(" separator="," close=")">#{webId}</foreach>
+            </if>
+            order by shooting_time desc
+        ) as files
+        where
+            1 = 1
         <if test="param.queryDate != null and param.queryDate != ''">
-            and shooting_time like COUNCAT('%',#{param.queryDate},'%')
-        </if>
-        <if test="param.wbsIds != null and param.wbsIds.size != 0">
-            and wbs_id in
-            <foreach collection="param.wbsIds" item="webId" open="(" separator="," close=")">#{webId}</foreach>
+            and files.shootingTimeStr like concat('%',#{param.queryDate},'%')
         </if>
-        order by shooting_time desc
-        limit ${current},${size}
     </select>
 
 </mapper>

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

@@ -21,7 +21,7 @@
     </resultMap>
 
     <select id="queryUserOpinionCommentsByUserOpinionId" resultMap="userOpinionCommentsResultMap">
-        select id,user_opinion_id,reply_id,reply_content,good_count,project_id,contract_id from u_user_opinion_comments where user_opinion_id = #{key} and is_deleted = 0
+        select id,user_opinion_id,reply_id,reply_content,good_count,project_id,contract_id,create_user,create_time from u_user_opinion_comments where user_opinion_id = #{key} and is_deleted = 0
     </select>
 
     <select id="countCommentsByUserOpinionKey" resultType="java.lang.Integer">

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.business.entity.UserOpinionFile;
 import org.springblade.business.vo.UserOpinionFileVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -30,6 +31,8 @@ import java.util.List;
  */
 public interface UserOpinionFileMapper extends BaseMapper<UserOpinionFile> {
 
+	List<UserOpinionFile> selectUserOpinionFileByUserOpinionKeys(@Param("userOpinionKeys") List<Long> userOpinionKeys);
+
 	/**
 	 * 自定义分页
 	 *

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFileMapper.xml

@@ -11,6 +11,12 @@
         <result column="file_url" property="fileUrl"/>
     </resultMap>
 
+    <select id="selectUserOpinionFileByUserOpinionKeys" resultMap="userOpinionFileResultMap">
+        select file_url,user_opinion_id from u_user_opinion_file where is_deleted= 0 and user_opinion_id in
+        <foreach collection="userOpinionKeys" item="key" open="(" separator="," close=")">
+            #{key}
+        </foreach>
+    </select>
 
     <select id="selectUserOpinionFilePage" resultMap="userOpinionFileResultMap">
         select * from u_user_opinion_file where is_deleted = 0

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

@@ -31,6 +31,8 @@ import java.util.List;
  */
 public interface UserOpinionFlowMapper extends BaseMapper<UserOpinionFlow> {
 
+	UserOpinionFlow queryLeftFlowManageUser(@Param("number")Integer number, @Param("userOpinionId")String userOpinionId);
+
 	List<UserOpinionFlow> queryCurrentUserOpinionFlowByUserOpinionId(@Param("key")String userOpinionId, @Param("number")Integer number);
 
 	Integer selectIsSolveByUserOpinionKey(@Param("key") Long userOpinionKey);

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionFlowMapper.xml

@@ -25,6 +25,10 @@
         <result column="manage_time" property="manageTime"/>
     </resultMap>
 
+    <select id="queryLeftFlowManageUser" resultMap="userOpinionFlowResultMap">
+        select id,manage_user,manage_user_name,manage_user_phone from u_user_opinion_flow where is_deleted = 0 and number = #{number} and sort = 2 and user_opinion_id = #{userOpinionId}
+    </select>
+
     <select id="queryCurrentUserOpinionFlowByUserOpinionId" resultMap="userOpinionFlowResultMap">
         select
             id,

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.java

@@ -18,6 +18,7 @@ package org.springblade.business.mapper;
 
 import org.apache.ibatis.annotations.Param;
 import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.UserOpinionVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -31,6 +32,8 @@ import java.util.List;
  */
 public interface UserOpinionMapper extends BaseMapper<UserOpinion> {
 
+	List<BusinessUserOpinionVO> queryManageUserOpinionList(@Param("currentUser") String currentUser);
+
 	List<UserOpinion> queryCurrentUserOpinionList(@Param("userId")Long userId);
 
 	/**

+ 50 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.xml

@@ -21,12 +21,60 @@
         <result column="good_number" property="goodNumber"/>
     </resultMap>
 
+    <resultMap id="businessUserOpinionMap" type="org.springblade.business.vo.BusinessUserOpinionVO">
+        <result column="userOpinionId" property="userOpinionId"/>
+        <result column="createTime" property="createTime"/>
+        <result column="manageTime" property="manageTime"/>
+        <result column="create_time" property="createTime"/>
+        <result column="projectName" property="projectName"/>
+        <result column="contractId" property="contractName"/>
+        <result column="problemType" property="problemType"/>
+        <result column="opinionContent" property="opinionContent"/>
+        <result column="isCurrent" property="isCurrent"/>
+        <result column="number" property="number"/>
+        <result column="newNumber" property="newNumber"/>
+        <result column="evaluation" property="evaluation"/>
+    </resultMap>
+
+    <select id="queryManageUserOpinionList" resultMap="businessUserOpinionMap">
+        select
+            uo.id as userOpinionId,
+            uo.create_time as createTime,
+            uof.manage_time as manageTime,
+            pi.project_name as projectName,
+            ci.contract_name as contractName,
+            uo.problem_type as problemType,
+            uo.opinion_content as opinionContent,
+            case uof.is_current
+            when 2 then 'true' else 'false' end as isCurrent,
+            uof.number as number,
+	        uo.number as newNumber,
+            uof.evaluation as evaluation
+        from
+            u_user_opinion as uo
+        left join m_project_info as pi on uo.project_id = pi.id
+        left join m_contract_info as ci on uo.contract_id = ci.id
+        right join (
+            select
+                uof.*
+            from
+            (
+                select user_opinion_id,is_current,manage_time,number,sort,evaluation from u_user_opinion_flow where is_deleted = 0
+                <if test="currentUser != null and currentUser != ''">
+                    and manage_user = #{currentUser}
+                </if>
+                and sort = 4 order by number DESC
+            ) as uof group by uof.user_opinion_id
+        ) as uof on uof.user_opinion_id = uo.id
+        where uo.is_deleted = 0;
+    </select>
+
     <select id="queryCurrentUserOpinionList" resultMap="userOpinionResultMap">
-        select id, problem_type, create_time, number from u_user_opinion where create_user = #{userId} and is_deleted = 0 order by create_time DESC
+        select id,project_id,contract_id,opinion_content,problem_type,create_time,good_number, number,create_user,create_user_name from u_user_opinion where create_user = #{userId} and is_deleted = 0 order by create_time DESC
     </select>
 
     <select id="selectUserOpinionPage" resultMap="userOpinionResultMap">
-        select id,project_id,contract_id,opinion_content,problem_type,good_number, create_user from u_user_opinion where is_deleted = 0 and create_user != #{currentUser} order by create_time DESC limit ${current},${size}
+        select id,project_id,contract_id,opinion_content,problem_type,create_time,good_number, number,create_user,create_user_name from u_user_opinion where is_deleted = 0 and create_user != #{currentUser} order by create_time DESC limit ${current},${size}
     </select>
 
 </mapper>

+ 9 - 18
blade-service/blade-business/src/main/java/org/springblade/business/service/IImageClassificationFileService.java

@@ -1,19 +1,3 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.business.service;
 
 import org.springblade.business.entity.ImageClassificationFile;
@@ -21,8 +5,6 @@ import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.vo.TreeVo;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -33,6 +15,15 @@ import java.util.List;
  */
 public interface IImageClassificationFileService extends BaseService<ImageClassificationFile> {
 
+	/**
+	 * 获取当前分类、项目、合同段下的所有文件数量
+	 * @param projectId 项目ID
+	 * @param contractId 合同段ID
+	 * @param classifyId 分类ID
+	 * @return 结果
+	 */
+	Integer queryCurrentClassifyAllFileCount(String projectId, String contractId, Long classifyId);
+
 	/**
 	 * 获取当前分类下当前项目的拍摄时间
 	 * @param classifyId 分类ID

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

@@ -32,7 +32,7 @@ import java.util.Map;
  */
 public interface IUserOpinionCommentsService extends BaseService<UserOpinionComments> {
 
-	List<UserOpinionComments> queryUserOpinionCommentsByUserOpinionId(String userOpinionId);
+	List<UserOpinionCommentsVO> queryUserOpinionCommentsByUserOpinionId(String userOpinionId);
 
 	Map<String,Integer> selectCommentsAndGoodCountByUserOpinionKey(Long userOpinionKey);
 

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

@@ -31,6 +31,8 @@ import java.util.List;
  */
 public interface IUserOpinionFileService extends BaseService<UserOpinionFile> {
 
+	List<UserOpinionFile> selectUserOpinionFileByUserOpinionKeys(List<Long> userOpinionKeys);
+
 	/**
 	 * 获取具体工单相关附件
 	 * @param userOpinionKey 主表u_user_opinion主键

+ 8 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionFlowService.java

@@ -31,6 +31,14 @@ import java.util.List;
  */
 public interface IUserOpinionFlowService extends BaseService<UserOpinionFlow> {
 
+	/**
+	 * 获取前一个流程的维护人员
+	 * @param number 流程次数
+	 * @param userOpinionId
+	 * @return
+	 */
+	UserOpinionFlow queryLeftFlowManageUser(Integer number, String userOpinionId);
+
 	/**
 	 * 获取当前工单的最新流程
 	 * @param userOpinionId 当前工单ID

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

@@ -17,9 +17,11 @@
 package org.springblade.business.service;
 
 import org.springblade.business.entity.UserOpinion;
+import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.UserOpinionVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 
 import java.util.List;
@@ -32,6 +34,18 @@ import java.util.List;
  */
 public interface IUserOpinionService extends BaseService<UserOpinion> {
 
+	/**
+	 * 获取所有工单及相应进度
+	 * @return 结果集
+	 */
+	IPage<BusinessUserOpinionVO> queryBusinessUserOpinionListAll(Query query);
+
+	/**
+	 * 获取分配给当前登录用户的工单记录
+	 * @return 结果集
+	 */
+	IPage<BusinessUserOpinionVO> queryBusinessUserOpinionList(String currentUserId, Query query);
+
 	/**
 	 * 获取当前用户提交的工单信息
 	 * @param user 用户

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

@@ -11,7 +11,7 @@ public interface WeatherInfoService extends IService<WeatherInfo> {
     /**
      * 根据所选年份获取当年所有天气台账
      */
-    List<Map<String, List<Map<String,Object>>>> queryWeatherAllByYear(String year);
+    List<Map<String, List<Map<String,Object>>>> queryWeatherAllByYear(String year, String contractId);
 
     /**
      * 自动同步当天天气

+ 40 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -25,6 +25,7 @@ import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.mapper.ImageClassificationFileMapper;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.business.vo.TreeVo;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -40,6 +41,11 @@ import java.util.*;
 @Service
 public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageClassificationFileMapper, ImageClassificationFile> implements IImageClassificationFileService {
 
+	@Override
+	public Integer queryCurrentClassifyAllFileCount(String projectId, String contractId, Long classifyId) {
+		return this.baseMapper.queryCurrentClassifyAllFileCount(projectId, contractId, classifyId);
+	}
+
 	@Override
 	public List<TreeVo> getYearDateTree(String classifyId, String projectId, String contractId) {
 		//获取时间
@@ -67,7 +73,7 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 
 		//循环年
 		for(Map.Entry<String,List<String>> yearMaps : yearMap.entrySet()){
-			String year = yearMaps.getKey();
+			String year = yearMaps.getKey().replace("年", "");
 			List<String> monthList = yearMaps.getValue();
 
 			//月集合
@@ -89,14 +95,15 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 					monthMap = new TreeVo();
 				}
 				monthMap.setName(month + "月");
-				monthMap.getTreeList().add(new TreeVo(monthDays[1] + "日"));
+				monthMap.setHierarchy(year + "-" + month);
+				monthMap.getTreeList().add(new TreeVo(monthDays[1] + "日", new ArrayList<>(), year + "-" + month + "-" + monthDays[1]));
 				index ++;
 				if(index == monthList.size()){
 					monthResult.add(monthMap);
 				}
 			}
 			//年
-			TreeVo yearResult = new TreeVo(year, monthResult);
+			TreeVo yearResult = new TreeVo(year, monthResult, year);
 			result.add(yearResult);
 		}
 
@@ -110,7 +117,36 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 			//查询下级节点信息
 			imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
 		}
-		return page.setRecords(this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile));
+		//获取数据
+		List<ImageClassificationFile> fileVOS = this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile);
+		if(fileVOS != null && fileVOS.size() > 0){
+			//分组
+			List<List<ImageClassificationFile>> group = CommonUtil.getBatchSize(fileVOS, new Integer(String.valueOf(page.getSize())));
+
+			//获取数据并设置分页信息
+			List<ImageClassificationFile> result = group.get(new Integer(String.valueOf(page.getCurrent())) - 1);
+			//转换类型
+			List<ImageClassificationFileVO> resultVo = JSONArray.parseArray(JSONObject.toJSONString(result), ImageClassificationFileVO.class);
+
+			//处理文件大小单位
+			resultVo.forEach(vo -> {
+				//获取文件大小
+				String fileSize = vo.getFileSize();
+				if(StringUtils.isNotEmpty(fileSize) && CommonUtil.checkIsBigDecimal(fileSize)){
+					long size = new Long(fileSize);
+					if(size < 1024L){
+						vo.setFileSize(vo.getFileSize() + "B");
+					} else {
+						vo.setFileSize((size / 1024) + "K");
+					}
+				}
+			});
+
+			page.setTotal(fileVOS.size());
+			page.setRecords(resultVo);
+		}
+
+		return page;
 	}
 
 }

+ 30 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionCommentsServiceImpl.java

@@ -16,11 +16,17 @@
  */
 package org.springblade.business.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.UserOpinionComments;
 import org.springblade.business.vo.UserOpinionCommentsVO;
 import org.springblade.business.mapper.UserOpinionCommentsMapper;
 import org.springblade.business.service.IUserOpinionCommentsService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
@@ -35,11 +41,33 @@ import java.util.Map;
  * @since 2022-05-25
  */
 @Service
+@AllArgsConstructor
 public class UserOpinionCommentsServiceImpl extends BaseServiceImpl<UserOpinionCommentsMapper, UserOpinionComments> implements IUserOpinionCommentsService {
 
+	private final IUserClient userClient;
+
 	@Override
-	public List<UserOpinionComments> queryUserOpinionCommentsByUserOpinionId(String userOpinionId) {
-		return this.baseMapper.queryUserOpinionCommentsByUserOpinionId(userOpinionId);
+	public List<UserOpinionCommentsVO> queryUserOpinionCommentsByUserOpinionId(String userOpinionId) {
+		List<UserOpinionComments> result = this.baseMapper.queryUserOpinionCommentsByUserOpinionId(userOpinionId);
+		if(result != null && result.size() > 0){
+			List<UserOpinionCommentsVO> voResult = JSONArray.parseArray(JSONObject.toJSONString(result), UserOpinionCommentsVO.class);
+			voResult.forEach(vo -> {
+				try{
+					if(StringUtils.isNotEmpty(String.valueOf(vo.getCreateUser())) && !"null".equals(String.valueOf(vo.getCreateUser()))){
+						//获取用户信息
+						User user = this.userClient.userInfoById(vo.getCreateUser()).getData();
+						if(user != null){
+							vo.setAvatar(user.getAvatar());
+							vo.setUserName(user.getRealName());
+						}
+					}
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			});
+			return voResult;
+		}
+		return null;
 	}
 
 	@Override

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

@@ -37,6 +37,11 @@ import java.util.Map;
 @Service
 public class UserOpinionFileServiceImpl extends BaseServiceImpl<UserOpinionFileMapper, UserOpinionFile> implements IUserOpinionFileService {
 
+	@Override
+	public List<UserOpinionFile> selectUserOpinionFileByUserOpinionKeys(List<Long> userOpinionKeys) {
+		return this.baseMapper.selectUserOpinionFileByUserOpinionKeys(userOpinionKeys);
+	}
+
 	@Override
 	public List<UserOpinionFile> selectUserOpinionFileByUserOpinionKey(Long userOpinionKey) {
 		Map<String,Object> queryMap = new HashMap<>();

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

@@ -38,6 +38,11 @@ import java.util.List;
 @Service
 public class UserOpinionFlowServiceImpl extends BaseServiceImpl<UserOpinionFlowMapper, UserOpinionFlow> implements IUserOpinionFlowService {
 
+	@Override
+	public UserOpinionFlow queryLeftFlowManageUser(Integer number, String userOpinionId) {
+		return this.baseMapper.queryLeftFlowManageUser(number, userOpinionId);
+	}
+
 	@Override
 	public List<UserOpinionFlowVO> queryCurrentUserOpinionFlowByUserOpinionId(String userOpinionId, Integer number) {
 		List<UserOpinionFlow> result = this.baseMapper.queryCurrentUserOpinionFlowByUserOpinionId(userOpinionId, number);

+ 118 - 24
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java

@@ -1,21 +1,6 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.business.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
@@ -23,23 +8,26 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.http.client.utils.DateUtils;
 import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.entity.UserOpinionFile;
-import org.springblade.business.entity.UserOpinionFlow;
 import org.springblade.business.service.IUserOpinionCommentsService;
 import org.springblade.business.service.IUserOpinionFileService;
 import org.springblade.business.service.IUserOpinionFlowService;
+import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.UserOpinionFlowVO;
 import org.springblade.business.vo.UserOpinionVO;
 import org.springblade.business.mapper.UserOpinionMapper;
 import org.springblade.business.service.IUserOpinionService;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -60,6 +48,108 @@ public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, U
 
 	private final IUserClient userClient;
 
+	@Override
+	public IPage<BusinessUserOpinionVO> queryBusinessUserOpinionListAll(Query query) {
+		return this.queryBusinessUserOpinionList(null, query);
+	}
+
+	@Override
+	public IPage<BusinessUserOpinionVO> queryBusinessUserOpinionList(String currentUserId, Query query) {
+		//获取分配给当前用户的工单
+		List<BusinessUserOpinionVO> businessUserOpinionVOS = this.baseMapper.queryManageUserOpinionList(currentUserId);
+		if(businessUserOpinionVOS != null && businessUserOpinionVOS.size() > 0){
+			//先分组
+			List<List<BusinessUserOpinionVO>> resultList = CommonUtil.getBatchSize(businessUserOpinionVOS, query.getSize());
+			//获取具体页数下的数据
+			List<BusinessUserOpinionVO> finalResult = resultList.get(query.getCurrent() - 1);
+
+			//获取得到的工单所关联的所有附件
+			List<Long> userOpinionKeys = finalResult.stream().map(BusinessUserOpinionVO::getUserOpinionId).distinct().collect(Collectors.toList());
+			List<UserOpinionFile> allFile = this.userOpinionFileService.selectUserOpinionFileByUserOpinionKeys(userOpinionKeys);
+
+			//设置附件信息
+			finalResult.forEach(vo -> {
+				List<String> imageUrls = new ArrayList<>();
+				if(allFile != null && allFile.size() > 0){
+					//处理附件信息
+					Iterator<UserOpinionFile> iterator = allFile.iterator();
+					while (iterator.hasNext()){
+						UserOpinionFile nextFile = iterator.next();
+						if(nextFile.getUserOpinionId().equals(vo.getUserOpinionId())){
+							imageUrls.add(nextFile.getFileUrl());
+							iterator.remove();
+						}
+					}
+				}
+				//设置附件信息
+				vo.setImageUrl(imageUrls);
+
+				//获取当前工单最新状态
+				List<UserOpinionFlowVO> newFlow = this.userOpinionFlowService.queryCurrentUserOpinionFlowByUserOpinionId(String.valueOf(vo.getUserOpinionId()), vo.getNewNumber());
+				if(newFlow != null && newFlow.size() > 0){
+					//获取退后阶段
+					UserOpinionFlowVO flow = newFlow.get(3);
+					//设置最后的处理结果
+					vo.setNewIsCurrent(flow.getCurrentBol());
+					if(!vo.getNewIsCurrent()){
+						//如果有权限则获取当前正在进行的操作环节
+						for(UserOpinionFlowVO flowVo : newFlow){
+							//依次找到正在执行的环节
+							if(new Integer("2").equals(flowVo.getSort())){
+								//设置当前用户操作权限(如果当前用户的流程次数和主表次数一致,认为可以操作)
+								if(StringUtils.isNotEmpty(currentUserId)){
+									vo.setOperation(vo.getNumber().equals(vo.getNewNumber()));
+								} else {
+									Long userId = AuthUtil.getUser().getUserId();
+									vo.setOperation(StringUtils.isNotEmpty(String.valueOf(userId)) && flowVo.getManageUser().equals(userId));
+								}
+							}
+
+							if(new Integer("1").equals(flowVo.getIsCurrent())){
+								vo.setCurrentLinkId(flowVo.getId());
+								vo.setCurrentLink(flowVo.getSort());
+								break;
+							}
+						}
+					}
+				}
+
+				//获取当前时间以判断距离结束时间还剩多少分钟
+				try{
+					if(vo.getCurrentLinkId() == null || vo.getCurrentLink() == null || vo.getCurrentLinkId() == -1 || vo.getCurrentLink() == -1){
+						//说明已处理
+						vo.setTimeRemaining("已处理");
+					} else {
+						//未处理
+						Date manageDate = DateUtil.parseDate(vo.getManageTime()), nowDate = new Date();
+						long between = manageDate.getTime() - nowDate.getTime();
+						if(between > 0){
+							long day = between / (24 * 60 * 60 * 1000);
+							long hour = (between - (day * 24 * 60 * 60 * 1000)) / ( 60 * 60 * 1000);
+							long minute = (between - (day * 24 * 60 * 60 * 1000) - hour * 60 * 60 * 1000) / ( 60 * 1000);
+
+							vo.setTimeRemaining(day + "天" + hour + "小时" + minute + "分");
+						} else {
+							vo.setTimeRemaining("已超时");
+						}
+					}
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+
+			});
+
+			//设置分页信息及结果数据
+			IPage<BusinessUserOpinionVO> page = Condition.getPage(query);
+			page.setTotal(businessUserOpinionVOS.size());
+			page.setRecords(finalResult);
+
+			return page;
+		}
+
+		return null;
+	}
+
 	/**
 	 * 获取当前用户提交的工单信息
 	 * @param user 用户
@@ -126,12 +216,16 @@ public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, U
 				if(isSolve == 2){
 					vo.setIsSolve(1);
 				}
-				if(StringUtils.isNotEmpty(String.valueOf(vo.getCreateUser())) && !"null".equals(String.valueOf(vo.getCreateUser()))){
-					//获取用户信息
-					User user = this.userClient.userInfoById(vo.getCreateUser()).getData();
-					if(user != null){
-						vo.setAvatar(user.getAvatar());
+				try{
+					if(StringUtils.isNotEmpty(String.valueOf(vo.getCreateUser())) && !"null".equals(String.valueOf(vo.getCreateUser()))){
+						//获取用户信息
+						User user = this.userClient.userInfoById(vo.getCreateUser()).getData();
+						if(user != null){
+							vo.setAvatar(user.getAvatar());
+						}
 					}
+				}catch (Exception e){
+					e.printStackTrace();
 				}
 			});
 			return page.setRecords(resultVo);

+ 21 - 17
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.core.tool.utils.DateUtil;
@@ -8,6 +9,9 @@ import org.springblade.business.entity.WeatherInfo;
 import org.springblade.business.mapper.WeatherInfoMapper;
 import org.springblade.business.service.WeatherInfoService;
 //import org.springframework.scheduling.annotation.Scheduled;
+import org.springblade.manager.entity.ProjectContractArea;
+import org.springblade.manager.feign.ProjectContractAreaClient;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springblade.core.mp.support.Condition;
 
@@ -16,15 +20,16 @@ import java.util.*;
 
 @Slf4j
 @Service
+@AllArgsConstructor
 public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, WeatherInfo> implements WeatherInfoService {
 
+    private final ProjectContractAreaClient projectContractAreaClient;
+
     /**
      * 根据所选年份获取当年所有天气台账
      */
-    public List<Map<String,List<Map<String,Object>>>> queryWeatherAllByYear(String yearMonthDay){
-        //todo 先写死区域编码ID,之后根据当前登录账户的信息获取
-        String contractAreaId = "12332112345678";
-        //todo ======================================
+    public List<Map<String,List<Map<String,Object>>>> queryWeatherAllByYear(String yearMonthDay, String contractId){
+        ProjectContractArea area = this.projectContractAreaClient.queryContractAreaByContractId(contractId);
 
         //获取当前区域yearMonthDay的所有数据
         Map<String,Object> queryMap = new HashMap<>();
@@ -32,11 +37,11 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
         if(yearMonthDay.contains("~")){
             String[] yearMonthDays = yearMonthDay.split("~");
             //区间
-            queryMap.put("contractAreaId", contractAreaId);
+            queryMap.put("contractAreaId", area.getId());
             yearWeatherList = this.list(Condition.getQueryWrapper(queryMap, WeatherInfo.class).lambda().between(WeatherInfo::getRecordTime, yearMonthDays[0].trim(), yearMonthDays[1].trim()).orderByAsc(WeatherInfo::getRecordTime));
         } else {
             queryMap.put("recordTime", yearMonthDay);
-            queryMap.put("contractAreaId", contractAreaId);
+            queryMap.put("contractAreaId", area.getId());
             yearWeatherList = this.list(Condition.getQueryWrapper(queryMap, WeatherInfo.class).lambda().orderByAsc(WeatherInfo::getRecordTime));
         }
 
@@ -83,37 +88,36 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
     /**
      * 获取当前系统所有项目下所有合同段的当天天气
      */
-//    @Scheduled(cron = "0 0 7 * * ?")
+    @Scheduled(cron = "0 0 7 * * ?")
     public void syncWeatherInfo(){
-        //todo 目前缺少合同段所在区域的地图编号及ID,所以暂时写死区域数据ID,之后修改为接口获取
-        String cityCode = "450721";
-        String areaId = "12332112345678";
+        //获取所有合同段的定位信息
+        List<ProjectContractArea> areaList = this.projectContractAreaClient.queryAllContractArea();
 
         //todo 这里之后会换成批量
-        for(int i = 0; i < 1; i ++){
+        for(ProjectContractArea area : areaList){
             try{
                 //校验当前区域是否已经获取当天日期(手动补填或自动获取)
                 Map<String,Object> queryMap = new HashMap<>();
-                queryMap.put("contractAreaId", areaId);
+                queryMap.put("contractAreaId", area.getId());
                 queryMap.put("recordTime", DateUtil.format(new Date(), "yyyy-MM-dd"));
                 //查询
                 long count = this.count(Condition.getQueryWrapper(queryMap, WeatherInfo.class));
                 if(count > 0){
                     //存在,取消自动同步
-                    log.info("今日的天气已经同步完成!contractAreaId:" + areaId + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+                    log.info("今日的天气已经同步完成!contractAreaId:" + area.getId() + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                     continue;
                 }
 
                 //获取天气信息(百度天气)
-                Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(cityCode);
+                Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(area.getCity_code());
                 if(weatherMap != null){
                     //计算平均气温
                     BigDecimal aver = (new BigDecimal(weatherMap.get("high")).add(new BigDecimal(weatherMap.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
-                    WeatherInfo newWeather = new WeatherInfo(areaId, weatherMap.get("weather"), aver.toString(), weatherMap.get("high"), weatherMap.get("low"), weatherMap.get("windLevel"));
+                    WeatherInfo newWeather = new WeatherInfo(String.valueOf(area.getId()), weatherMap.get("weather"), aver.toString(), weatherMap.get("high"), weatherMap.get("low"), weatherMap.get("windLevel"));
                     this.save(newWeather);
-                    log.info("今日的天气已经同步完成!contractAreaId:" + areaId + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+                    log.info("今日的天气已经同步完成!contractAreaId:" + area.getId() + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                 } else {
-                    log.info("获取今日的天气失败!contractAreaId:" + areaId + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+                    log.info("获取今日的天气失败!contractAreaId:" + area.getId() + ",syncTime:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                 }
             }catch (Exception e){
                 e.printStackTrace();

+ 28 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClientImpl.java

@@ -0,0 +1,28 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.service.SaveUserInfoByProjectService;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+public class ProjectAssignmentUserClientImpl implements ProjectAssignmentUserClient {
+
+    private final SaveUserInfoByProjectService saveUserInfoByProjectService;
+
+    @Override
+    public List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(Long userId) {
+        return this.saveUserInfoByProjectService.queryCurrentUserDownAllContractAndProjectId(userId);
+    }
+
+    @Override
+    public List<SaveUserInfoByProjectDTO> queryCurrentProjectContractAssignmentUserList(Long projectId, Long contractId) {
+        return this.saveUserInfoByProjectService.queryProjectBusinessUser(projectId, contractId);
+    }
+}

+ 3 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java

@@ -13,8 +13,9 @@ public class ProjectClientImpl implements ProjectClient {
 
     private final IProjectInfoService projectInfoService;
 
+
     @Override
-    public List<ProjectInfo> queryProjectList() {
-        return projectInfoService.selectProjectList();
+    public List<ProjectInfo> queryProjectList(List<String> projectIds) {
+        return projectInfoService.selectProjectList(projectIds);
     }
 }

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectContractAreaClientImpl.java

@@ -5,12 +5,19 @@ import org.springblade.manager.entity.ProjectContractArea;
 import org.springblade.manager.service.ProjectContractAreaService;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @AllArgsConstructor
 public class ProjectContractAreaClientImpl implements ProjectContractAreaClient {
 
     private final ProjectContractAreaService projectContractAreaService;
 
+    @Override
+    public List<ProjectContractArea> queryAllContractArea() {
+        return this.projectContractAreaService.queryAllContractArea();
+    }
+
     @Override
     public ProjectContractArea queryContractAreaByContractId(String contractId) {
         return this.projectContractAreaService.queryContractAreaByContractId(contractId);

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.java

@@ -4,7 +4,11 @@ package org.springblade.manager.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.manager.entity.ProjectContractArea;
 
+import java.util.List;
+
 
 public interface ProjectContractAreaMapper extends BaseMapper<ProjectContractArea> {
 
+    List<ProjectContractArea> queryAllContractArea();
+
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectContractAreaMapper.xml

@@ -20,5 +20,8 @@
         <result column="county" property="county"/>
     </resultMap>
 
+    <select id="queryAllContractArea" resultMap="imageClassificationConfigResultMap">
+        select id, city_code from m_project_contract_area where is_deleted = 0
+    </select>
 
 </mapper>

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.mapper;
 
+import io.lettuce.core.dynamic.annotation.Param;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.vo.ProjectInfoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -30,7 +31,7 @@ import java.util.List;
  */
 public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
 
-	List<ProjectInfo> selectProjectList();
+	List<ProjectInfo> selectProjectList(@Param("projectIds") List<String> projectIds);
 
 	/**
 	 * 自定义分页

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

@@ -34,7 +34,10 @@
     </resultMap>
 
     <select id="selectProjectList" resultMap="projectInfoResultMap">
-        select id, project_name, project_alias, project_number from m_project_info where is_deleted = 0;
+        select id, project_name, project_alias, project_number from m_project_info where is_deleted = 0 and id in
+        <foreach collection="projectIds" item="projectId" open="(" separator="," close=")">
+            #{projectId}
+        </foreach>
     </select>
 
     <update id="updateTemplateIdById">

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java

@@ -1,8 +1,15 @@
 package org.springblade.manager.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.lettuce.core.dynamic.annotation.Param;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 
+import java.util.List;
+
 public interface SaveUserInfoByProjectMapper extends BaseMapper<SaveUserInfoByProjectDTO> {
 
+    List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(@Param("userid") Long userId);
+
+    List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(@Param("projectId") Long projectId,@Param("contractId") Long contractId);
+
 }

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml

@@ -20,4 +20,12 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
 
+    <select id="queryCurrentUserDownAllContractAndProjectId" resultMap="contractInfoResultMap">
+        select project_id, contract_id from m_project_assignment_user where is_deleted = 0 and user_id = #{userId}
+    </select>
+
+    <select id="queryProjectBusinessUser" resultMap="contractInfoResultMap">
+        select * from m_project_assignment_user where is_deleted = 0 and project_id = #{projectId} and contract_id is NULL
+    </select>
+
 </mapper>

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

@@ -37,7 +37,7 @@ public interface IProjectInfoService extends BaseService<ProjectInfo> {
 	 * 客户端首页获取项目列表
 	 * @return 结果集
 	 */
-	List<ProjectInfo> selectProjectList();
+	List<ProjectInfo> selectProjectList(List<String> projectIds);
 
 	/**
 	 * 自定义分页

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ProjectContractAreaService.java

@@ -2,8 +2,12 @@ package org.springblade.manager.service;
 
 import org.springblade.manager.entity.ProjectContractArea;
 
+import java.util.List;
+
 public interface ProjectContractAreaService {
 
+    List<ProjectContractArea> queryAllContractArea();
+
     ProjectContractArea queryContractAreaByContractId(String contractId);
 
 }

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java

@@ -3,6 +3,13 @@ package org.springblade.manager.service;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 
+import java.util.List;
+
 
 public interface SaveUserInfoByProjectService extends BaseService<SaveUserInfoByProjectDTO> {
+
+    List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(Long userId);
+
+    List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(Long projectId, Long contractId);
+
 }

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

@@ -13,6 +13,11 @@ import java.util.Map;
 @Service
 public class ProjectContractAreaServiceImpl extends BaseServiceImpl<ProjectContractAreaMapper, ProjectContractArea> implements ProjectContractAreaService {
 
+    @Override
+    public List<ProjectContractArea> queryAllContractArea() {
+        return this.baseMapper.queryAllContractArea();
+    }
+
     @Override
     public ProjectContractArea queryContractAreaByContractId(String contractId) {
         Map<String,Object> queryMap = new HashMap<>();

+ 12 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java

@@ -6,9 +6,21 @@ import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 
 @Service
 public class SaveUserInfoByProjectServiceImpl
         extends BaseServiceImpl<SaveUserInfoByProjectMapper, SaveUserInfoByProjectDTO>
         implements SaveUserInfoByProjectService {
+
+    @Override
+    public List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(Long userId) {
+        return this.baseMapper.queryCurrentUserDownAllContractAndProjectId(userId);
+    }
+
+    @Override
+    public List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(Long projectId, Long contractId) {
+        return this.baseMapper.queryProjectBusinessUser(projectId, contractId);
+    }
 }