Browse Source

feat: index page schedule

Blizzard 1 year ago
parent
commit
32cd602cb0
26 changed files with 815 additions and 68 deletions
  1. 13 3
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ContactDept.java
  2. 27 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexProjectAndTaskSummaryVO.java
  3. 24 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexTaskScheduleVO.java
  4. 23 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyIndexTaskStatistics.java
  5. 27 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ScheduleUserVO.java
  6. 2 0
      blade-service/wt-okr/src/main/java/com/wtkj/config/MagicValue.java
  7. 1 34
      blade-service/wt-okr/src/main/java/com/wtkj/controller/CommonController.java
  8. 63 0
      blade-service/wt-okr/src/main/java/com/wtkj/controller/ContactController.java
  9. 97 1
      blade-service/wt-okr/src/main/java/com/wtkj/controller/IndexController.java
  10. 12 2
      blade-service/wt-okr/src/main/java/com/wtkj/controller/ProjectController.java
  11. 22 1
      blade-service/wt-okr/src/main/java/com/wtkj/controller/TaskController.java
  12. 4 4
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactDeptMapper.java
  13. 3 3
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactDeptMapper.xml
  14. 3 0
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/ProjectMapper.java
  15. 9 0
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/ProjectMapper.xml
  16. 18 0
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/TaskMapper.java
  17. 48 0
      blade-service/wt-okr/src/main/java/com/wtkj/mapper/TaskMapper.xml
  18. 2 3
      blade-service/wt-okr/src/main/java/com/wtkj/service/IContactDeptService.java
  19. 35 0
      blade-service/wt-okr/src/main/java/com/wtkj/service/IIndexService.java
  20. 3 0
      blade-service/wt-okr/src/main/java/com/wtkj/service/IProjectService.java
  21. 32 0
      blade-service/wt-okr/src/main/java/com/wtkj/service/ITaskService.java
  22. 6 10
      blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ContactDeptServiceImpl.java
  23. 236 0
      blade-service/wt-okr/src/main/java/com/wtkj/service/impl/IndexServiceImpl.java
  24. 6 1
      blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ProjectServiceImpl.java
  25. 48 6
      blade-service/wt-okr/src/main/java/com/wtkj/service/impl/TaskServiceImpl.java
  26. 51 0
      blade-service/wt-okr/src/main/java/com/wtkj/wrapper/IndexTaskScheduleWrapper.java

+ 13 - 3
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Contacts.java → blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ContactDept.java

@@ -17,17 +17,27 @@ import org.springblade.core.mp.base.BaseEntity;
 @EqualsAndHashCode(callSuper = true)
 @TableName("blade_contacts")
 @Data
-public class Contacts extends BaseEntity {
+public class ContactDept extends BaseEntity {
 
 	private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty(value = "顶级机构id")
+	@ApiModelProperty(value = "本机构顶级机构id")
 	@TableField("top_dept")
 	@JsonSerialize(using = ToStringSerializer.class)
 	private Long topDept;
 
-	@ApiModelProperty(value = "关联机构的顶级机构id")
+	@ApiModelProperty(value = "联系人顶级机构id")
 	@TableField("related_top_dept")
 	@JsonSerialize(using = ToStringSerializer.class)
 	private Long relatedTopDept;
+
+	@ApiModelProperty(value = "联系人deptId")
+	@TableField("dept_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long deptId;
+
+	@ApiModelProperty(value = "联系人deptId")
+	@TableField("dept_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userId;
 }

+ 27 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexProjectAndTaskSummaryVO.java

@@ -0,0 +1,27 @@
+package com.wtkj.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 14:54
+ * @describe
+ */
+@Data
+public class IndexProjectAndTaskSummaryVO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+
+	private Integer projectCount = 0;
+
+	private Integer myProjectCount = 0;
+
+	private Integer taskCount = 0;
+
+	private Integer myTaskCount = 0;
+
+	private Integer todayTask = 0;
+}

+ 24 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexTaskScheduleVO.java

@@ -0,0 +1,24 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.Task;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 16:31
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class IndexTaskScheduleVO extends Task {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "项目名称")
+	private String projectName;
+
+	@ApiModelProperty(value = "项目经理")
+	private String projectManagerUser;
+}

+ 23 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyIndexTaskStatistics.java

@@ -0,0 +1,23 @@
+package com.wtkj.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-21 10:20
+ * @describe
+ */
+@Data
+public class MyIndexTaskStatistics implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Integer all;
+
+	private Integer todayTodo = 0;
+
+	private Integer expire;
+
+}

+ 27 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ScheduleUserVO.java

@@ -0,0 +1,27 @@
+package com.wtkj.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.system.user.entity.User;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 22:02
+ * @describe
+ */
+@Data
+public class ScheduleUserVO implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "用户")
+	private User user;
+
+	@ApiModelProperty(value = "今日待完成")
+	private Integer todayTodo = 0;
+
+	@ApiModelProperty(value = "逾期任务")
+	private Integer todayExpire = 0;
+
+}

+ 2 - 0
blade-service/wt-okr/src/main/java/com/wtkj/config/MagicValue.java

@@ -22,6 +22,8 @@ public interface MagicValue {
 	 */
 	String STAFF_SECOND_ADMIN = "staff_second_admin";
 
+	String STAFF_USER = "staff_user";
+
 	Integer ZERO = 0;
 
 	Integer ONE = 1;

+ 1 - 34
blade-service/wt-okr/src/main/java/com/wtkj/controller/CommonController.java

@@ -1,22 +1,17 @@
 package com.wtkj.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.wtkj.entity.DeptToDept;
-import com.wtkj.service.IContactsService;
 import com.wtkj.service.IDeptToDeptService;
 import com.wtkj.vo.AuthUserInfo;
 import com.wtkj.wrapper.UserListWrapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.system.entity.Dept;
-import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
-import org.springblade.system.vo.DeptVO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -35,9 +30,7 @@ import java.util.List;
 public class CommonController {
 
 	private final IDeptToDeptService deptToDeptService;
-	private final ISysClient sysClient;
 	private final IUserClient userClient;
-	private final IContactsService contactsService;
 
 	/**
 	 * 当前登录用户信息
@@ -69,38 +62,12 @@ public class CommonController {
 		return R.data(deptToDeptService.getDept(topDept, areaCode, name, category));
 	}
 
-	/**
-	 * 本机构下的机构
-	 */
-	@GetMapping("/dept-by-parentId")
-	@ApiOperation(value = "内部通讯录or懒加载树形结构", notes = "传入上级机构id")
-	@ApiOperationSupport(order = 4)
-	public R<List<DeptVO>> deptList(@RequestParam Long parentId) {
-		List<DeptVO> res = new ArrayList<>();
-		R<List<DeptVO>> rpc = sysClient.getDeptLazyList(parentId);
-		if (rpc.isSuccess()) {
-			res = rpc.getData();
-		}
-		return R.data(res);
-	}
-
-
-	/**
-	 * 外部联系人
-	 */
-	@GetMapping("/outer-dept")
-	@ApiOperation(value = "外部联系人", notes = "传入登录用户的topDept,分页参数")
-	@ApiOperationSupport(order = 5)
-	public R address(@RequestParam Long topDept, Query query) {
-		IPage<DeptVO> page = contactsService.deptPage(topDept, query);
-		return R.data(page);
-	}
 
 	/**
 	 * 搜索用户
 	 */
 	@GetMapping("/get-user-list")
-	@ApiOperationSupport(order = 6)
+	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "搜索用户", notes = "")
 	public R getUserList(@RequestParam Long deptId, @RequestParam String name) {
 		List<User> list = new ArrayList<>();

+ 63 - 0
blade-service/wt-okr/src/main/java/com/wtkj/controller/ContactController.java

@@ -0,0 +1,63 @@
+package com.wtkj.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.service.IContactDeptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.vo.DeptVO;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 11:58
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/contact")
+@Api(value = "联系人模块", tags = "联系人模块")
+public class ContactController {
+
+	private final ISysClient sysClient;
+	private final IContactDeptService contactsService;
+
+	/**
+	 * 本机构下的机构
+	 */
+	@GetMapping("/dept-by-parentId")
+	@ApiOperation(value = "内部通讯录or懒加载树形结构", notes = "传入上级机构id")
+	@ApiOperationSupport(order = 1)
+	public R<List<DeptVO>> deptList(@RequestParam Long parentId) {
+		List<DeptVO> res = new ArrayList<>();
+		R<List<DeptVO>> rpc = sysClient.getDeptLazyList(parentId);
+		if (rpc.isSuccess()) {
+			res = rpc.getData();
+		}
+		return R.data(res);
+	}
+
+
+	/**
+	 * 外部联系人
+	 */
+	@GetMapping("/outer-dept")
+	@ApiOperation(value = "外部联系人", notes = "传入登录用户的topDept,分页参数")
+	@ApiOperationSupport(order = 2)
+	public R address(@RequestParam Long topDept, Query query) {
+		IPage<DeptVO> page = contactsService.deptPage(topDept, query);
+		return R.data(page);
+	}
+
+
+}

+ 97 - 1
blade-service/wt-okr/src/main/java/com/wtkj/controller/IndexController.java

@@ -1,15 +1,26 @@
 package com.wtkj.controller;
 
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.entity.Task;
+import com.wtkj.service.IIndexService;
 import com.wtkj.service.IWorkStatusService;
+import com.wtkj.wrapper.IndexTaskScheduleWrapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
+import static com.wtkj.config.MagicValue.*;
+
 /**
  * @author Blizzard
  * @create at 2023-09-15 23:58
@@ -22,14 +33,99 @@ import org.springframework.web.bind.annotation.RestController;
 public class IndexController {
 
 	private final IWorkStatusService workStatus;
+	private final IIndexService indexService;
 
 	/**
 	 * 用户工作状态
 	 */
 	@GetMapping("/work-status")
-	@ApiOperationSupport(order = 2)
+	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "我的状态", notes = "")
 	public R wordStatus() {
 		return R.data(workStatus.workStatus());
 	}
+
+
+	/**
+	 * 首页统计
+	 */
+	@GetMapping("/project-and-task")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "项目和任务统计", notes = "")
+	public R projectAndTask(@RequestParam Long topDept) {
+		return R.data(indexService.projectAndTaskSummary(topDept));
+	}
+
+	/**
+	 * 待办事项
+	 */
+	@GetMapping("/todo-list")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "待办事项", notes = "传入isRead查看状态 0:全部 1:已读 2: 未读 默认未读,分页参数")
+	public R todoList(@RequestParam(defaultValue = "2") Integer isRead, Query query) {
+		return R.data(indexService.todoList(isRead, Condition.getPage(query)));
+	}
+
+	/**
+	 * 学习资料
+	 */
+	@GetMapping("/study-list")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "学习资料", notes = "")
+	public R noticeList(Query query) {
+		return R.data(indexService.studyList(Condition.getPage(query)));
+	}
+
+	/**
+	 * 阅读消息
+	 */
+	@GetMapping("/message-detail")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "阅读消息", notes = "传入id")
+	public R messageDetail(@RequestParam Long id) {
+		return R.data(indexService.messageDetail(id));
+	}
+
+	/**
+	 * 工作日程
+	 */
+	@GetMapping("/user-schedule")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "用户工作日程", notes = "传入登录用户的顶级机构id,日期字符串")
+	public R schedule(@RequestParam Long topDept, String date) {
+		return R.data(indexService.schedule(topDept, date));
+	}
+
+	/**
+	 * 工作日程展开
+	 */
+	@GetMapping("/user-schedule-expand")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "用户工作日程展开", notes = "传入用户id,日期字符串")
+	public R scheduleExpand(@RequestParam Long userId, String date) {
+		List<Task> taskList = indexService.scheduleExpand(userId, date);
+		return R.data(IndexTaskScheduleWrapper.build().listVO(taskList));
+	}
+
+
+	/**
+	 * 任务分布
+	 */
+	@GetMapping("/task-statistics")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "任务分布统计", notes = "传入日期")
+	public R taskTaskStatistics(@RequestParam Long topDept, @RequestParam String date) {
+		String userRole = AuthUtil.getUserRole();
+		if (userRole != null) {
+			if (userRole.contains(STAFF_ADMIN)) {
+				return R.data(indexService.mapStatistics(topDept, date));
+			} else if (userRole.contains(STAFF_SECOND_ADMIN)) {
+				return R.data(indexService.myStatistics(date));
+			} else if (userRole.contains(STAFF_USER)) {
+				return R.data(null);
+			}
+		}
+		return R.fail("获取用户角色失败");
+	}
+
 }

+ 12 - 2
blade-service/wt-okr/src/main/java/com/wtkj/controller/ProjectController.java

@@ -91,13 +91,23 @@ public class ProjectController {
 		return R.data(stageService.listByProjectId(projectId));
 	}
 
+	/**
+	 * 修改阶段
+	 */
+	@GetMapping("/submit-stage")
+	@ApiOperation(value = "修改项目阶段", notes = "")
+	@ApiOperationSupport(order = 5)
+	public R submitStage(@RequestBody ProjectStage stage) {
+		return R.status(stageService.saveOrUpdate(stage));
+	}
+
 
 	/**
 	 * 工作台任务统计
 	 */
 	@GetMapping("/task-summary")
 	@ApiOperation(value = "项目任务统计", notes = "传入projectId")
-	@ApiOperationSupport(order = 5)
+	@ApiOperationSupport(order = 6)
 	public R<MyTaskStatistics> taskStatistics(@RequestParam Long projectId) {
 		return R.data(taskService.TaskStatistics(projectId, null, null));
 	}
@@ -108,7 +118,7 @@ public class ProjectController {
 	 */
 	@GetMapping("/project-group-mem")
 	@ApiOperation(value = "项目组成员", notes = "传入projectId,competentUnit:主管单位")
-	@ApiOperationSupport(order = 6)
+	@ApiOperationSupport(order = 7)
 	public R groupMem(@RequestParam Long projectId, @RequestParam Long competentUnit) {
 		List<ProjectGroup> list = projectGroupService.getGroupByProjectId(projectId, competentUnit);
 		return R.data(ProjectGroupWrapper.build().listVO(list));

+ 22 - 1
blade-service/wt-okr/src/main/java/com/wtkj/controller/TaskController.java

@@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
@@ -245,11 +246,31 @@ public class TaskController {
 	 */
 	@GetMapping("/task-cost-statistics")
 	@ApiOperationSupport(order = 19)
-	@ApiOperation(value = "任务成本统计", notes = "传入taskId")
+	@ApiOperation(value = "任务成本统计", notes = "传入taskId")
 	public R<JSONObject> costStatistics(@RequestParam Long taskId) {
 		return R.data(taskCostService.costStatistics(taskId));
 	}
 
+	/**
+	 * 今日待完成
+	 */
+	@GetMapping("/today-todo-task")
+	@ApiOperationSupport(order = 20)
+	@ApiOperation(value = "登录用户指定日期待完成任务", notes = "")
+	public R<List<Task>> todayTodo(@RequestParam String date) {
+		return R.data(taskService.todayTodo(AuthUtil.getUserId(), date));
+	}
+
+	/**
+	 * 今日逾期
+	 */
+	@GetMapping("/today-expire-task")
+	@ApiOperationSupport(order = 21)
+	@ApiOperation(value = "登录用户指定日期逾期任务", notes = "")
+	public R<List<Task>> todayExpire(@RequestParam String date) {
+		return R.data(taskService.todayExpire(AuthUtil.getUserId(), date));
+	}
+
 
 }
 

+ 4 - 4
blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactsMapper.java → blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactDeptMapper.java

@@ -2,7 +2,7 @@ package com.wtkj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.wtkj.entity.Contacts;
+import com.wtkj.entity.ContactDept;
 
 import java.util.List;
 
@@ -11,9 +11,9 @@ import java.util.List;
  * @create at 2023-09-19 11:02
  * @describe
  */
-public interface ContactsMapper extends BaseMapper<Contacts> {
-	List<Contacts> pageByTopDept(Long topDept, IPage<Contacts> page);
+public interface ContactDeptMapper extends BaseMapper<ContactDept> {
+	List<ContactDept> pageByTopDept(Long topDept, IPage<ContactDept> page);
 
-	List<Contacts> selectByTopDept(Long topDept);
+	List<ContactDept> selectByTopDept(Long topDept);
 
 }

+ 3 - 3
blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactsMapper.xml → blade-service/wt-okr/src/main/java/com/wtkj/mapper/ContactDeptMapper.xml

@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.wtkj.mapper.ContactsMapper">
+<mapper namespace="com.wtkj.mapper.ContactDeptMapper">
 
 
-    <select id="pageByTopDept" resultType="com.wtkj.entity.Contacts">
+    <select id="pageByTopDept" resultType="com.wtkj.entity.ContactDept">
         select * from blade_contacts where is_deleted = 0 and top_dept = #{param}
     </select>
 
-    <select id="selectByTopDept" resultType="com.wtkj.entity.Contacts">
+    <select id="selectByTopDept" resultType="com.wtkj.entity.ContactDept">
         select * from blade_contacts where is_deleted = 0 and top_dept = #{param}
     </select>
 </mapper>

+ 3 - 0
blade-service/wt-okr/src/main/java/com/wtkj/mapper/ProjectMapper.java

@@ -3,10 +3,13 @@ package com.wtkj.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.wtkj.entity.Project;
 
+import java.util.Set;
+
 /**
  * @author Blizzard
  * @create at 2023-09-13 16:01
  * @describe
  */
 public interface ProjectMapper extends BaseMapper<Project> {
+	Set<Long> selectByCreate(Long createDept, Long createUser);
 }

+ 9 - 0
blade-service/wt-okr/src/main/java/com/wtkj/mapper/ProjectMapper.xml

@@ -3,4 +3,13 @@
 <mapper namespace="com.wtkj.mapper.ProjectMapper">
 
 
+    <select id="selectByCreate" resultType="java.lang.Long">
+        select distinct id from blade_project where is_deleted = 0
+        <if test="param1 != null">
+            and create_dept = #{pram1}
+        </if>
+        <if test="param2 != null">
+            and create_user = #{pram2}
+        </if>
+    </select>
 </mapper>

+ 18 - 0
blade-service/wt-okr/src/main/java/com/wtkj/mapper/TaskMapper.java

@@ -3,10 +3,28 @@ package com.wtkj.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.wtkj.entity.Task;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * @author Blizzard
  * @create at 2023-09-15 15:17
  * @describe
  */
 public interface TaskMapper extends BaseMapper<Task> {
+	Set<Long> selectByExecute(Long deptId, String userId);
+
+	Set<Long> selectByUser(String userId);
+
+	Set<Long> selectTodayTask(Long userId, String now);
+
+	List<Task> todayTo(String userId, String date);
+
+	List<Task> todayExpire(String userId, String date);
+
+	List<Task> getTodoAndExpireByUserId(String userId, String date);
+
+	List<Task> getByOrgDeptId(Long topDept, String date);
+
+	List<Task> getTodayTodoByOrgDeptId(Long topDept, String date);
 }

+ 48 - 0
blade-service/wt-okr/src/main/java/com/wtkj/mapper/TaskMapper.xml

@@ -2,4 +2,52 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.wtkj.mapper.TaskMapper">
 
+    <select id="selectByExecute" resultType="java.lang.Long">
+        select distinct id from blade_task where is_deleted = 0
+        <if test="param1 != null">
+            and org_dept_id = #{param1}
+        </if>
+        <if test="param2 != null">
+            and execute_user like concat(concat('%',#{param2}),'%')
+        </if>
+    </select>
+
+    <select id="selectByUser" resultType="java.lang.Long">
+        select distinct id from blade_task where is_deleted = 0
+        and (execute_user like concat(concat('%',#{param}),'%') or create_user =#{param})
+    </select>
+
+    <select id="selectTodayTask" resultType="java.lang.Long">
+        select distinct id from blade_task where is_deleted = 0 and execute_user like concat(concat('%',#{param1}),'%')
+        and
+        DATE_FORMAT(end_time,'%Y-%m-%d') = DATE_FORMAT(#{param2},'%Y-%m-%d') and is_confirmed = 0
+    </select>
+
+    <select id="todayTo" resultType="com.wtkj.entity.Task">
+        select * from blade_task where is_deleted = 0 and execute_user like concat(concat('%',#{param1}),'%')
+        and
+        DATE_FORMAT(end_time,'%Y-%m-%d') = DATE_FORMAT(#{param2},'%Y-%m-%d') and is_confirmed = 0 order_by create_time
+    </select>
+
+    <select id="todayExpire" resultType="com.wtkj.entity.Task">
+        select * from blade_task where is_deleted = 0 and execute_user like concat(concat('%',#{param1}),'%')
+        and
+        DATE_FORMAT(#{param2},'%Y-%m-%d') > DATE_FORMAT(end_time,'%Y-%m-%d') and is_confirmed = 0 order_by create_time
+    </select>
+
+    <select id="getByOrgDeptId" resultType="com.wtkj.entity.Task">
+        select * from blade_task where is_deleted = 0 and org_dept_id = #{param1} and
+        DATE_FORMAT(#{param2},'%Y-%m-%d') >= DATE_FORMAT(end_time,'%Y-%m-%d') and is_confirmed = 0 order by create_time
+    </select>
+
+    <select id="getTodoAndExpireByUserId" resultType="com.wtkj.entity.Task">
+        select * from blade_task where is_deleted = 0 and execute_user like concat(concat('%',#{param1}),'%')
+        and
+        DATE_FORMAT(#{param2},'%Y-%m-%d') >= DATE_FORMAT(end_time,'%Y-%m-%d') and is_confirmed = 0 order_by create_time
+    </select>
+
+    <select id="getTodayTodoByOrgDeptId" resultType="com.wtkj.entity.Task">
+        select * from blade_task where is_deleted = 0 and org_dept_id = #{param1} and
+        DATE_FORMAT(#{param2},'%Y-%m-%d') = DATE_FORMAT(end_time,'%Y-%m-%d') and is_confirmed = 0 order by create_time
+    </select>
 </mapper>

+ 2 - 3
blade-service/wt-okr/src/main/java/com/wtkj/service/IContactsService.java → blade-service/wt-okr/src/main/java/com/wtkj/service/IContactDeptService.java

@@ -1,7 +1,7 @@
 package com.wtkj.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.wtkj.entity.Contacts;
+import com.wtkj.entity.ContactDept;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.vo.DeptVO;
@@ -11,8 +11,7 @@ import org.springblade.system.vo.DeptVO;
  * @create at 2023-09-19 11:01
  * @describe
  */
-public interface IContactsService extends BaseService<Contacts> {
-	IPage<Contacts> pageByTopDept(Long topDept, IPage<Contacts> page);
+public interface IContactDeptService extends BaseService<ContactDept> {
 
 	IPage<DeptVO> deptPage(Long topDept, Query query);
 }

+ 35 - 0
blade-service/wt-okr/src/main/java/com/wtkj/service/IIndexService.java

@@ -0,0 +1,35 @@
+package com.wtkj.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.wtkj.entity.IndexMessage;
+import com.wtkj.entity.Task;
+import com.wtkj.vo.IndexProjectAndTaskSummaryVO;
+import com.wtkj.vo.MyIndexTaskStatistics;
+import com.wtkj.vo.ScheduleUserVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 14:51
+ * @describe
+ */
+public interface IIndexService {
+	IndexProjectAndTaskSummaryVO projectAndTaskSummary(Long topDept);
+
+
+	IPage<IndexMessage> todoList(Integer isRead, IPage<IndexMessage> page);
+
+	Object studyList(IPage<Object> page);
+
+	IndexMessage messageDetail(Long id);
+
+	List<ScheduleUserVO> schedule(Long topDept, String date);
+
+	List<Task> scheduleExpand(Long userId, String date);
+
+	List<Map<String, Integer>> mapStatistics(Long topDept, String date);
+
+	MyIndexTaskStatistics myStatistics(String date);
+}

+ 3 - 0
blade-service/wt-okr/src/main/java/com/wtkj/service/IProjectService.java

@@ -5,6 +5,8 @@ import com.wtkj.dto.ProjectPageDTO;
 import com.wtkj.entity.Project;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.Set;
+
 /**
  * @author Blizzard
  * @create at 2023-09-13 16:00
@@ -15,4 +17,5 @@ public interface IProjectService extends BaseService<Project> {
 
 	IPage<Project> getPage(ProjectPageDTO dto, IPage<Project> page);
 
+	Set<Long> getByCreate(Long createDept, Long createUser);
 }

+ 32 - 0
blade-service/wt-okr/src/main/java/com/wtkj/service/ITaskService.java

@@ -7,6 +7,7 @@ import com.wtkj.vo.MyTaskStatistics;
 import org.springblade.core.mp.base.BaseService;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author Blizzard
@@ -37,4 +38,35 @@ public interface ITaskService extends BaseService<Task> {
 	boolean deleteTask(List<Long> taskIds);
 
 	List<Task> listByProjectId(Long projectId);
+
+	Set<Long> getByExecute(Long deptId, String userId);
+
+	Set<Long> getByUser(String userId);
+
+	Set<Long> todayTask(Long deptId);
+
+	/**
+	 * 用户当日待完成任务
+	 */
+	List<Task> todayTodo(Long userId, String date);
+
+	/**
+	 * 用户当日逾期任务
+	 */
+	List<Task> todayExpire(Long userId, String date);
+
+	/**
+	 * 机构下当日待完成的任务和逾期任务列表
+	 */
+	List<Task> getByOrgDeptId(Long topDept, String date);
+
+	/**
+	 * 用户当日待完成和逾期的任务
+	 */
+	List<Task> getTodoAndExpireByUserId(Long userId, String date);
+
+	/**
+	 * 机构下当日待完成的任务
+	 */
+	List<Task> getTodayTodoByOrgDeptId(Long topDept, String date);
 }

+ 6 - 10
blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ContactsServiceImpl.java → blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ContactDeptServiceImpl.java

@@ -2,9 +2,9 @@ package com.wtkj.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.wtkj.entity.Contacts;
-import com.wtkj.mapper.ContactsMapper;
-import com.wtkj.service.IContactsService;
+import com.wtkj.entity.ContactDept;
+import com.wtkj.mapper.ContactDeptMapper;
+import com.wtkj.service.IContactDeptService;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
@@ -27,21 +27,17 @@ import java.util.stream.Collectors;
  */
 @Service
 @AllArgsConstructor
-public class ContactsServiceImpl extends BaseServiceImpl<ContactsMapper, Contacts> implements IContactsService {
+public class ContactDeptServiceImpl extends BaseServiceImpl<ContactDeptMapper, ContactDept> implements IContactDeptService {
 
 	private final ISysClient sysClient;
 
-	@Override
-	public IPage<Contacts> pageByTopDept(Long topDept, IPage<Contacts> page) {
-		return page.setRecords(baseMapper.pageByTopDept(topDept, page));
-	}
 
 	@Override
 	public IPage<DeptVO> deptPage(Long topDept, Query query) {
 		IPage<DeptVO> page = new Page<>();
-		List<Contacts> contacts = baseMapper.selectByTopDept(topDept);
+		List<ContactDept> contacts = baseMapper.selectByTopDept(topDept);
 		if (!CollectionUtils.isEmpty(contacts)) {
-			Set<Long> collect = contacts.stream().map(Contacts::getRelatedTopDept).filter(Objects::nonNull).collect(Collectors.toSet());
+			Set<Long> collect = contacts.stream().map(ContactDept::getRelatedTopDept).filter(Objects::nonNull).collect(Collectors.toSet());
 			String ids = Func.join(collect);
 			R<IPage<DeptVO>> rpc = sysClient.getDeptPage(ids, query);
 			if (rpc.isSuccess()) {

+ 236 - 0
blade-service/wt-okr/src/main/java/com/wtkj/service/impl/IndexServiceImpl.java

@@ -0,0 +1,236 @@
+package com.wtkj.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.wtkj.entity.IndexMessage;
+import com.wtkj.entity.Task;
+import com.wtkj.service.IIndexMessageService;
+import com.wtkj.service.IIndexService;
+import com.wtkj.service.IProjectService;
+import com.wtkj.service.ITaskService;
+import com.wtkj.vo.IndexProjectAndTaskSummaryVO;
+import com.wtkj.vo.MyIndexTaskStatistics;
+import com.wtkj.vo.ScheduleUserVO;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+import static com.wtkj.config.MagicValue.*;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 14:51
+ * @describe
+ */
+@Service
+@AllArgsConstructor
+public class IndexServiceImpl implements IIndexService {
+
+	private final ITaskService taskService;
+	private final IProjectService projectService;
+	private final IIndexMessageService indexMessageService;
+	private final IUserClient userClient;
+
+	@Override
+	public IndexProjectAndTaskSummaryVO projectAndTaskSummary(Long topDept) {
+		IndexProjectAndTaskSummaryVO vo = new IndexProjectAndTaskSummaryVO();
+		Long userId = AuthUtil.getUserId();
+		//1.全部项目 ---> 机构自己建的,任务执行机构是机构
+		Set<Long> allIds = new HashSet<>();
+		Set<Long> createIds = projectService.getByCreate(topDept, null);
+		if (!CollectionUtils.isEmpty(createIds)) {
+			allIds.addAll(createIds);
+		}
+		//任务执行机构是机构 也是任务数
+		Set<Long> executeIds = taskService.getByExecute(topDept, null);
+		if (!CollectionUtils.isEmpty(executeIds)) {
+			allIds.addAll(executeIds);
+			//3.项目任务总数  --->执行机构是我的顶级id
+			vo.setTaskCount(executeIds.size());
+		}
+		if (!CollectionUtils.isEmpty(allIds)) {
+			vo.setProjectCount(allIds.size());
+		}
+		//2.我参与的项目 ---> 我建的,任务我执行的或者任务我建的
+		Set<Long> myIds = new HashSet<>();
+		Set<Long> myCreate = projectService.getByCreate(null, userId);
+		if (!CollectionUtils.isEmpty(myCreate)) {
+			myIds.addAll(myCreate);
+		}
+		Set<Long> myExecute = taskService.getByUser(String.valueOf(userId));
+		if (!CollectionUtils.isEmpty(myExecute)) {
+			myIds.addAll(myExecute);
+		}
+		if (!CollectionUtils.isEmpty(myIds)) {
+			vo.setMyProjectCount(myIds.size());
+		}
+		//4.我的任务数  我执行的
+		Set<Long> myTask = taskService.getByExecute(null, String.valueOf(userId));
+		if (!CollectionUtils.isEmpty(myTask)) {
+			vo.setMyTaskCount(myTask.size());
+		}
+		//5.今日任务数
+		Set<Long> todayTask = taskService.todayTask(userId);
+		if (!CollectionUtils.isEmpty(todayTask)) {
+			vo.setTodayTask(todayTask.size());
+		}
+		return vo;
+	}
+
+	@Override
+	public IPage<IndexMessage> todoList(Integer isRead, IPage<IndexMessage> page) {
+		LambdaQueryWrapper<IndexMessage> lqw = new LambdaQueryWrapper<>();
+		lqw.eq(IndexMessage::getCategory, 1);
+		lqw.eq(IndexMessage::getToUser, AuthUtil.getUserId());
+		if (isRead == 1) {
+			lqw.eq(IndexMessage::getIsRead, 1);
+			lqw.orderByDesc(IndexMessage::getCreateTime);
+		} else if (isRead == 2) {
+			lqw.eq(IndexMessage::getIsRead, 0);
+			lqw.orderByDesc(IndexMessage::getCreateTime);
+		} else if (isRead == 0) {
+			lqw.orderByAsc(IndexMessage::getIsRead);
+			lqw.orderByDesc(IndexMessage::getCreateTime);
+		}
+		return indexMessageService.page(page, lqw);
+	}
+
+	@Override
+	public Object studyList(IPage<Object> page) {
+		return null;
+	}
+
+	@Override
+	public IndexMessage messageDetail(Long id) {
+		IndexMessage byId = indexMessageService.getById(id);
+		if (byId != null) {
+			byId.setIsRead(1);
+			indexMessageService.updateById(byId);
+		}
+		return byId;
+	}
+
+	@Override
+	public List<ScheduleUserVO> schedule(Long topDept, String date) {
+		List<ScheduleUserVO> result = new ArrayList<>();
+		Set<Long> res = new HashSet<>();
+		String roleName = AuthUtil.getUserRole();
+		String deptId = AuthUtil.getDeptId();
+		Long userId = AuthUtil.getUserId();
+		if (roleName != null) {
+			if (roleName.contains(STAFF_ADMIN)) {
+				//如果是机构管理员 ---> 可以查看机构下的待完成的和逾期的任务
+				List<Task> list = taskService.getByOrgDeptId(topDept, date);
+				if (!CollectionUtils.isEmpty(list)) {
+					for (Task task : list) {
+						String executeUser = task.getExecuteUser();
+						if (StringUtil.isNotBlank(executeUser)) {
+							List<Long> userIds = Func.toLongList(executeUser);
+							res.addAll(userIds);
+						}
+					}
+				}
+			} else if (roleName.contains(STAFF_SECOND_ADMIN)) {
+				//todo  二级管理员处理
+				//如果是二级管理员 ---> 可以查看二级部门下的人的所有任务
+				/*List<Task> list = taskService.getByExecuteDept(deptId,date);
+				if (!CollectionUtils.isEmpty(list)){
+					for (Task task : list){
+						String executeUser = task.getExecuteUser();
+						if (StringUtil.isNotBlank(executeUser)){
+							List<Long> userIds = Func.toLongList(executeUser);
+							res.addAll(userIds);
+						}
+					}
+				}*/
+			} else if (roleName.contains(STAFF_USER)) {
+				res.add(userId);
+			}
+		}
+		if (!CollectionUtils.isEmpty(res)) {
+			for (Long id : res) {
+				R<User> rpc = userClient.userInfoById(id);
+				if (rpc.isSuccess()) {
+					ScheduleUserVO vo = new ScheduleUserVO();
+					vo.setUser(rpc.getData());
+					List<Task> tasks = taskService.todayTodo(userId, date);
+					if (!CollectionUtils.isEmpty(tasks)) {
+						vo.setTodayTodo(tasks.size());
+					}
+					List<Task> tasks1 = taskService.todayExpire(userId, date);
+					if (!CollectionUtils.isEmpty(tasks1)) {
+						vo.setTodayExpire(tasks1.size());
+					}
+					result.add(vo);
+				}
+			}
+		}
+		return result;
+	}
+
+	@Override
+	public List<Task> scheduleExpand(Long userId, String date) {
+		return taskService.getTodoAndExpireByUserId(userId, date);
+	}
+
+	@Override
+	public List<Map<String, Integer>> mapStatistics(Long topDept, String date) {
+		List<Map<String, Integer>> res = new ArrayList<>();
+		//1.机构下有今日待完成的任务的用户
+		List<Task> tasks = taskService.getTodayTodoByOrgDeptId(topDept, date);
+		Set<Long> userIds = new HashSet<>();
+		if (!CollectionUtils.isEmpty(tasks)) {
+			for (Task task : tasks) {
+				String executeUser = task.getExecuteUser();
+				if (StringUtil.isNotBlank(executeUser)) {
+					List<Long> ids = Func.toLongList(executeUser);
+					userIds.addAll(ids);
+				}
+			}
+		}
+		if (!CollectionUtils.isEmpty(userIds)) {
+			userIds.forEach(userId -> {
+				Map<String, Integer> map = new HashMap<>();
+				R<User> userR = userClient.userInfoById(userId);
+				if (userR.isSuccess()) {
+					List<Task> tasks1 = taskService.todayTodo(userId, date);
+					if (!CollectionUtils.isEmpty(tasks1)) {
+						map.put(userR.getData().getName(), tasks1.size());
+						res.add(map);
+					}
+				}
+			});
+		}
+		return res;
+	}
+
+	@Override
+	public MyIndexTaskStatistics myStatistics(String date) {
+		Long userId = AuthUtil.getUserId();
+		MyIndexTaskStatistics statistics = new MyIndexTaskStatistics();
+		//1.任务总数
+		List<Task> tasks = taskService.listByUser(userId, null, null);
+		if (!CollectionUtils.isEmpty(tasks)) {
+			statistics.setAll(tasks.size());
+			//2.当日待完成 即今日逾期
+			List<Task> todo = taskService.todayTodo(userId, date);
+			if (!CollectionUtils.isEmpty(todo)) {
+				statistics.setTodayTodo(todo.size());
+			}
+			//3.逾期任务数
+			List<Task> expires = taskService.todayExpire(userId, date);
+			if (!CollectionUtils.isEmpty(expires)) {
+				statistics.setExpire(expires.size());
+			}
+		}
+		return statistics;
+	}
+}

+ 6 - 1
blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ProjectServiceImpl.java

@@ -82,7 +82,7 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectMapper, Project>
 				}
 				//如果不是业主 ---> 判断是否是服务商的管理员  服务商管理员可以查看所有的项目
 				String userRole = AuthUtil.getUserRole();
-				if (userRole != null && userRole.equals(STAFF_ADMIN)) {
+				if (userRole != null && userRole.contains(STAFF_ADMIN)) {
 					List<ProjectAuth> auths = projectAuthService.getByTopDept(dto.getTopDept(), null);
 					if (!CollectionUtils.isEmpty(auths)) {
 						Set<Long> projectIds = auths.stream().map(ProjectAuth::getProjectId).collect(Collectors.toSet());
@@ -113,4 +113,9 @@ public class ProjectServiceImpl extends BaseServiceImpl<ProjectMapper, Project>
 		return this.page(page, lqw);
 	}
 
+	@Override
+	public Set<Long> getByCreate(Long createDept, Long createUser) {
+		return baseMapper.selectByCreate(createDept, createUser);
+	}
+
 }

+ 48 - 6
blade-service/wt-okr/src/main/java/com/wtkj/service/impl/TaskServiceImpl.java

@@ -27,6 +27,7 @@ import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author Blizzard
@@ -243,12 +244,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 	@Override
 	public List<Task> listByUser(Long userId, Integer year, Integer month) {
 		LambdaQueryWrapper<Task> lqw = new LambdaQueryWrapper<>();
-		//当前年 当前月
-		LocalDate currentDate = LocalDate.now();
-		int currentYear = currentDate.getYear();
-		int currentMonth = currentDate.getMonthValue();
-		lqw.eq(Task::getYear, year == null ? currentYear : year);
-		lqw.eq(Task::getMonth, month == null ? currentMonth : month);
+		if (year != null) {
+			lqw.eq(Task::getYear, year);
+		}
+		if (month != null) {
+			lqw.eq(Task::getMonth, month);
+		}
 		lqw.and(wq -> {
 			wq.eq(Task::getCreateUser, userId);
 			wq.or().like(Task::getExecuteUser, String.valueOf(userId));
@@ -270,4 +271,45 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 		lqw.orderByAsc(Task::getEndTime);
 		return this.list(lqw);
 	}
+
+	@Override
+	public Set<Long> getByExecute(Long deptId, String userId) {
+		return baseMapper.selectByExecute(deptId, userId);
+	}
+
+	@Override
+	public Set<Long> getByUser(String userId) {
+		return baseMapper.selectByUser(userId);
+	}
+
+	@Override
+	public Set<Long> todayTask(Long userId) {
+		String now = DateUtil.format(new Date(), "yyyy-MM-dd");
+		return baseMapper.selectTodayTask(userId, now);
+	}
+
+	@Override
+	public List<Task> todayTodo(Long userId, String date) {
+		return baseMapper.todayTo(String.valueOf(userId), date);
+	}
+
+	@Override
+	public List<Task> todayExpire(Long userId, String date) {
+		return baseMapper.todayExpire(String.valueOf(userId), date);
+	}
+
+	@Override
+	public List<Task> getByOrgDeptId(Long topDept, String date) {
+		return baseMapper.getByOrgDeptId(topDept, date);
+	}
+
+	@Override
+	public List<Task> getTodoAndExpireByUserId(Long userId, String date) {
+		return baseMapper.getTodoAndExpireByUserId(String.valueOf(userId), date);
+	}
+
+	@Override
+	public List<Task> getTodayTodoByOrgDeptId(Long topDept, String date) {
+		return baseMapper.getTodayTodoByOrgDeptId(topDept, date);
+	}
 }

+ 51 - 0
blade-service/wt-okr/src/main/java/com/wtkj/wrapper/IndexTaskScheduleWrapper.java

@@ -0,0 +1,51 @@
+package com.wtkj.wrapper;
+
+import com.wtkj.entity.Project;
+import com.wtkj.entity.Task;
+import com.wtkj.service.IProjectService;
+import com.wtkj.vo.IndexTaskScheduleVO;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+
+import java.util.Objects;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 16:33
+ * @describe
+ */
+public class IndexTaskScheduleWrapper extends BaseEntityWrapper<Task, IndexTaskScheduleVO> {
+
+	private static IProjectService projectService;
+	private static IUserClient userClient;
+
+	public static IndexTaskScheduleWrapper build() {
+		projectService = SpringUtil.getBean(IProjectService.class);
+		userClient = SpringUtil.getBean(IUserClient.class);
+		return new IndexTaskScheduleWrapper();
+	}
+
+	@Override
+	public IndexTaskScheduleVO entityVO(Task entity) {
+		IndexTaskScheduleVO vo = Objects.requireNonNull(BeanUtil.copy(entity, IndexTaskScheduleVO.class));
+		Long projectId = entity.getProjectId();
+		if (projectId != null) {
+			Project byId = projectService.getById(projectId);
+			if (byId != null) {
+				vo.setProjectName(byId.getName());
+			}
+		}
+		Long projectManager = entity.getProjectManager();
+		if (projectManager != null) {
+			R<User> userR = userClient.userInfoById(projectManager);
+			if (userR.isSuccess()) {
+				vo.setProjectManagerUser(userR.getData().getName());
+			}
+		}
+		return vo;
+	}
+}