From ad7cbfd8fd19fcce4345a4907c1f059a34c2869b Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 11 十二月 2025 15:49:15 +0800
Subject: [PATCH] 工作台
---
common/src/main/java/com/ycl/common/utils/DateUtils.java | 79 +++
business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java | 9
common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java | 3
business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java | 16
common/src/main/java/com/ycl/common/enums/business/AuditTypeEnum.java | 15
business/src/main/java/com/ycl/mapper/AuditHistoryMapper.java | 8
business/src/main/java/com/ycl/service/IndexHomeService.java | 22
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 37 +
business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java | 17
business/src/main/resources/mapper/WorkStationScheduleMapper.xml | 24
business/src/main/java/com/ycl/service/impl/AuditHistoryServiceImpl.java | 72 +++
business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java | 510 +++++++++++++++++-----
business/src/main/java/com/ycl/domain/query/AuditHistoryQuery.java | 24 +
common/src/main/java/com/ycl/common/enums/business/AuditHistoryEnum.java | 17
business/src/main/java/com/ycl/domain/vo/DailyStatVO.java | 27 +
business/src/main/java/com/ycl/domain/form/AuditHistoryForm.java | 65 ++
business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java | 10
business/src/main/java/com/ycl/service/AuditHistoryService.java | 6
business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java | 10
business/src/main/java/com/ycl/controller/WorkStationScheduleController.java | 42 +
business/src/main/resources/mapper/AuditHistoryMapper.xml | 31 +
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | 83 +++
business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java | 3
business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java | 102 ++++
business/src/main/java/com/ycl/domain/vo/AuditHistoryVO.java | 90 +++
business/src/main/java/com/ycl/domain/vo/TaskInfoVo.java | 2
business/src/main/java/com/ycl/service/WorkStationScheduleService.java | 17
27 files changed, 1,182 insertions(+), 159 deletions(-)
diff --git a/business/src/main/java/com/ycl/controller/WorkStationScheduleController.java b/business/src/main/java/com/ycl/controller/WorkStationScheduleController.java
index a753b82..48c177a 100644
--- a/business/src/main/java/com/ycl/controller/WorkStationScheduleController.java
+++ b/business/src/main/java/com/ycl/controller/WorkStationScheduleController.java
@@ -2,10 +2,18 @@
import com.ycl.common.group.Update;
import com.ycl.common.group.Add;
+import com.ycl.domain.form.ProjectInfoForm;
+import com.ycl.domain.query.AuditHistoryQuery;
+import com.ycl.domain.query.ProjectInfoQuery;
+import com.ycl.domain.query.WaitTodoQuery;
+import com.ycl.service.AuditHistoryService;
+import com.ycl.service.IndexHomeService;
+import com.ycl.system.domain.base.AbsQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
import java.util.List;
+import java.util.Map;
import javax.validation.constraints.NotEmpty;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -29,6 +37,15 @@
public class WorkStationScheduleController {
private final WorkStationScheduleService workStationScheduleService;
+
+ private final IndexHomeService indexHomeService;
+
+ private final AuditHistoryService auditHistoryService;
+ @GetMapping("/auditHistoryPage")
+ public Result page(AuditHistoryQuery query){
+ return auditHistoryService.page(query);
+ }
+
@PostMapping
@ApiOperation(value = "娣诲姞", notes = "娣诲姞")
@@ -54,10 +71,10 @@
return workStationScheduleService.remove(ids);
}
- @GetMapping("/page")
+ @GetMapping("/listByDate")
@ApiOperation(value = "鍒嗛〉", notes = "鍒嗛〉")
- public Result page(WorkStationScheduleQuery query) {
- return workStationScheduleService.page(query);
+ public Result getListByDate(WorkStationScheduleQuery query) {
+ return workStationScheduleService.listByDate(query);
}
@GetMapping("/{id}")
@@ -81,4 +98,23 @@
public Result countAchievements(){
return workStationScheduleService.countAchievements();
}
+
+ /**
+ * 鑾峰緱涓汉椤圭洰鍒楄〃
+ * @return
+ */
+ @GetMapping("/getProjectList")
+ public Result projectList(){
+ return indexHomeService.getProjectList();
+ }
+
+ @GetMapping("/getWaitTaskList")
+ public Result getWaitTaskList(WaitTodoQuery query){
+ return indexHomeService.getWaitTaskList(query);
+ }
+ @GetMapping("/countTodayTask")
+ Result countTodayTask(){
+ return workStationScheduleService.countTodayTask();
+ }
+
}
diff --git a/business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java b/business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java
index f9e3708..328f4f9 100644
--- a/business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java
+++ b/business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java
@@ -36,4 +36,7 @@
@TableField("completed_time")
private Date completedTime;
+ @TableField("project_id")
+ private Integer projectId;
+
}
diff --git a/business/src/main/java/com/ycl/domain/form/AuditHistoryForm.java b/business/src/main/java/com/ycl/domain/form/AuditHistoryForm.java
new file mode 100644
index 0000000..7eae288
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/form/AuditHistoryForm.java
@@ -0,0 +1,65 @@
+package com.ycl.domain.form;
+
+
+import com.ycl.domain.entity.AuditHistory;
+import com.ycl.domain.entity.WorkStationSchedule;
+import com.ycl.system.domain.base.AbsForm;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.NonNull;
+
+/**
+ * nongtou-project-java
+ *
+ * @author : zxl
+ * @date : 2025-12-11 10:19
+ **/
+@Data
+public class AuditHistoryForm extends AbsForm {
+
+ /**
+ * 浠诲姟id
+ */
+ private String taskId;
+ /**
+ * 浠诲姟key
+ */
+ private String taskDefinitionKey;
+ /**
+ * 鏌ョ湅浜篿d
+ */
+ private String viewer;
+ /**
+ * 鎻愪氦浜洪儴闂�
+ */
+ private String commitDept;
+ /**
+ * 1:鎻愪氦锛�2:瀹℃牳锛�3:椹冲洖锛�4:杞氦
+ * @see com.ycl.common.enums.business.AuditTypeEnum
+ */
+ private String auditType;
+ /**
+ * 鏄惁闃呰(0:鏈锛�1:宸茶)
+ */
+ private String isRead;
+ /**
+ * 涓氬姟id
+ */
+ private String businessKey;
+ /**
+ * 涓氬姟琛�
+ */
+ private String businessTable;
+ /**
+ * 鍐呭锛堣妭鐐瑰悕绉帮級
+ */
+ private String content;
+
+ public static AuditHistory getEntityByForm(@NonNull AuditHistoryForm form, AuditHistory entity) {
+ if(entity == null) {
+ entity = new AuditHistory();
+ }
+ BeanUtils.copyProperties(form, entity);
+ return entity;
+ }
+}
diff --git a/business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java b/business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java
index 9410ed8..54f9a0e 100644
--- a/business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java
+++ b/business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java
@@ -1,5 +1,6 @@
package com.ycl.domain.form;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.common.group.Update;
import com.ycl.common.group.Add;
import com.ycl.system.domain.base.AbsForm;
@@ -23,25 +24,15 @@
@ApiModel(value = "WorkStationSchedule琛ㄥ崟", description = "琛ㄥ崟")
public class WorkStationScheduleForm extends AbsForm {
- @NotNull(message = "鎵�灞炵敤鎴穒d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
- @ApiModelProperty("鎵�灞炵敤鎴穒d")
- private Long userId;
-
@NotBlank(message = "宸ヤ綔鍐呭涓嶈兘涓虹┖", groups = {Add.class, Update.class})
@ApiModelProperty("宸ヤ綔鍐呭")
private String content;
- @NotBlank(message = "鐘舵�佷笉鑳戒负绌�", groups = {Add.class, Update.class})
- @ApiModelProperty("鐘舵��")
- private String status;
-
@NotNull(message = "涓嶈兘涓虹┖", groups = {Add.class, Update.class})
- @ApiModelProperty("")
- private Date gmtcreate;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date completedTime;
- @NotNull(message = "涓嶈兘涓虹┖", groups = {Add.class, Update.class})
- @ApiModelProperty("")
- private Date gmtupdate;
+ private Integer projectId;
public static WorkStationSchedule getEntityByForm(@NonNull WorkStationScheduleForm form, WorkStationSchedule entity) {
if(entity == null) {
diff --git a/business/src/main/java/com/ycl/domain/query/AuditHistoryQuery.java b/business/src/main/java/com/ycl/domain/query/AuditHistoryQuery.java
new file mode 100644
index 0000000..ecc0fa5
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/query/AuditHistoryQuery.java
@@ -0,0 +1,24 @@
+package com.ycl.domain.query;
+
+
+import com.ycl.system.domain.base.AbsQuery;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * nongtou-project-java
+ *
+ * @author : zxl
+ * @date : 2025-12-11 11:59
+ **/
+@Data
+public class AuditHistoryQuery extends AbsQuery {
+
+ private String projectId;
+
+ private Long deptId;
+
+ private List<Long> projectIds;
+
+}
diff --git a/business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java b/business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java
new file mode 100644
index 0000000..6aa63b0
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java
@@ -0,0 +1,16 @@
+package com.ycl.domain.query;
+
+
+import com.ycl.system.domain.base.AbsQuery;
+import lombok.Data;
+
+/**
+ * nongtou-project-java
+ *
+ * @author : zxl
+ * @date : 2025-12-09 10:15
+ **/
+@Data
+public class WaitTodoQuery extends AbsQuery {
+ private String id; //all鏌ヨ鍏ㄩ儴
+}
diff --git a/business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java b/business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java
index 1b16450..1c99aa0 100644
--- a/business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java
+++ b/business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java
@@ -1,8 +1,12 @@
package com.ycl.domain.query;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.system.domain.base.AbsQuery;
import io.swagger.annotations.ApiModel;
import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
/**
* 鏌ヨ
@@ -13,5 +17,10 @@
@Data
@ApiModel(value = "WorkStationSchedule鏌ヨ鍙傛暟", description = "鏌ヨ鍙傛暟")
public class WorkStationScheduleQuery extends AbsQuery {
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date completedTime;
+
+ private String projectId; //鏌ヨ 鍏ㄩ儴 浼犲叆鐨勫瓧绗︿覆 "all"
+
}
diff --git a/business/src/main/java/com/ycl/domain/vo/AuditHistoryVO.java b/business/src/main/java/com/ycl/domain/vo/AuditHistoryVO.java
new file mode 100644
index 0000000..4fefe2a
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/vo/AuditHistoryVO.java
@@ -0,0 +1,90 @@
+package com.ycl.domain.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * nongtou-project-java
+ *
+ * @author : zxl
+ * @date : 2025-12-11 14:00
+ **/
+@Data
+public class AuditHistoryVO {
+
+
+ /**
+ * 娴佺▼浠诲姟ID
+ */
+ @ApiModelProperty(value = "娴佺▼浠诲姟ID")
+ private String taskId;
+
+ /**
+ * 浠诲姟key
+ */
+ @ApiModelProperty(value = "浠诲姟key")
+ private String taskDefinitionKey;
+
+ /**
+ * 鏌ョ湅浜篒D
+ */
+ @ApiModelProperty(value = "鏌ョ湅浜篒D")
+ private String viewer;
+
+ /**
+ * 鎻愪氦浜洪儴闂�
+ */
+ @ApiModelProperty(value = "鎻愪氦浜洪儴闂�")
+ private String commitDept;
+
+ /**
+ * 瀹℃牳绫诲瀷(1:鎻愪氦锛�2:瀹℃牳锛�3:椹冲洖锛�4:杞氦)
+ */
+ @ApiModelProperty(value = "瀹℃牳绫诲瀷(1:鎻愪氦锛�2:瀹℃牳锛�3:椹冲洖锛�4:杞氦)")
+ private String auditType;
+
+ /**
+ * 鏄惁闃呰(0:鏈锛�1:宸茶)
+ */
+ @ApiModelProperty(value = "鏄惁闃呰(0:鏈锛�1:宸茶)")
+ private String isRead;
+
+ /**
+ * 涓氬姟ID锛堝叧鑱旈」鐩甀D锛�
+ */
+ @ApiModelProperty(value = "涓氬姟ID锛堝叧鑱旈」鐩甀D锛�")
+ private String businessKey;
+
+ /**
+ * 涓氬姟琛ㄥ悕绉�
+ */
+ @ApiModelProperty(value = "涓氬姟琛ㄥ悕绉�")
+ private String businessTable;
+
+ /**
+ * 鍐呭锛堣妭鐐瑰悕绉帮級
+ */
+ @ApiModelProperty(value = "鍐呭锛堣妭鐐瑰悕绉帮級")
+ private String content;
+
+ /**
+ * 鍏宠仈鐨勯」鐩悕绉帮紙浠巘_project_info琛ㄥ叧鑱旓級
+ */
+ @ApiModelProperty(value = "椤圭洰鍚嶇О")
+ private String projectName;
+
+ // ========== 鍙�夋墿灞曞瓧娈碉紙鏍规嵁涓氬姟闇�姹傛坊鍔狅級 ==========
+
+ /**
+ * 瀹℃牳绫诲瀷涓枃鎻忚堪锛堝墠绔睍绀虹敤锛屽锛氭彁浜�/瀹℃牳/椹冲洖/杞氦锛�
+ */
+ @ApiModelProperty(value = "瀹℃牳绫诲瀷涓枃鎻忚堪")
+ private String auditTypeDesc;
+
+ /**
+ * 鏄惁闃呰涓枃鎻忚堪锛堝墠绔睍绀虹敤锛屽锛氭湭璇�/宸茶锛�
+ */
+ @ApiModelProperty(value = "鏄惁闃呰涓枃鎻忚堪")
+ private String isReadDesc;
+}
diff --git a/business/src/main/java/com/ycl/domain/vo/DailyStatVO.java b/business/src/main/java/com/ycl/domain/vo/DailyStatVO.java
new file mode 100644
index 0000000..236cccb
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/vo/DailyStatVO.java
@@ -0,0 +1,27 @@
+package com.ycl.domain.vo;
+
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * nongtou-project-java
+ * 姣忔棩缁熻缁撴灉灏佽绫�
+ * @author : zxl
+ * @date : 2025-12-10 13:57
+ **/
+@Data
+public class DailyStatVO {
+ // 褰撴棩鏁版嵁鍒楄〃
+ private Long id;
+ private String date;
+ private String time;
+ private String title;
+ private String project;
+
+ private Date completedTime;
+
+ private Integer projectId;
+}
\ No newline at end of file
diff --git a/business/src/main/java/com/ycl/domain/vo/TaskInfoVo.java b/business/src/main/java/com/ycl/domain/vo/TaskInfoVo.java
index 87b5520..72253e7 100644
--- a/business/src/main/java/com/ycl/domain/vo/TaskInfoVo.java
+++ b/business/src/main/java/com/ycl/domain/vo/TaskInfoVo.java
@@ -22,5 +22,7 @@
private Long overTimeCount;//瓒呮椂娆℃暟
private CheckPointVO checkPointInfo;
+ private String status;
+
private CustomerTaskVO customerTaskInfo;
}
diff --git a/business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java b/business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java
index af34e60..5ec26b7 100644
--- a/business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java
+++ b/business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java
@@ -31,13 +31,11 @@
@ApiModelProperty("鐘舵��")
private String status;
- /** */
- @ApiModelProperty("")
- private Date gmtcreate;
+ private Date completedTime;
- /** */
- @ApiModelProperty("")
- private Date gmtupdate;
+ private Integer projectId;
+
+ private String projectName;
public static WorkStationScheduleVO getVoByEntity(@NonNull WorkStationSchedule entity, WorkStationScheduleVO vo) {
if(vo == null) {
diff --git a/business/src/main/java/com/ycl/mapper/AuditHistoryMapper.java b/business/src/main/java/com/ycl/mapper/AuditHistoryMapper.java
index a696551..a4d778a 100644
--- a/business/src/main/java/com/ycl/mapper/AuditHistoryMapper.java
+++ b/business/src/main/java/com/ycl/mapper/AuditHistoryMapper.java
@@ -1,9 +1,13 @@
package com.ycl.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.domain.entity.AuditHistory;
import com.ycl.domain.entity.File;
+import com.ycl.domain.query.AuditHistoryQuery;
+import com.ycl.domain.query.WorkStationScheduleQuery;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* 瀹℃牳璁板綍 Mapper 鎺ュ彛
@@ -12,5 +16,9 @@
@Mapper
public interface AuditHistoryMapper extends BaseMapper<AuditHistory> {
+ /**
+ * 鍒嗛〉
+ */
+ IPage getPage(IPage page, @Param("query") AuditHistoryQuery query);
}
diff --git a/business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java b/business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java
index 4119d28..9c92ce5 100644
--- a/business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java
+++ b/business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java
@@ -5,8 +5,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.domain.vo.WorkStationScheduleVO;
import com.ycl.domain.query.WorkStationScheduleQuery;
+import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
/**
* Mapper 鎺ュ彛
@@ -29,4 +34,9 @@
*/
IPage getPage(IPage page, @Param("query") WorkStationScheduleQuery query);
+ List<WorkStationScheduleVO> groupByProjectAndDate(
+ @Param("userId") Long userId,
+ @Param("projectId") Integer projectId,
+ @Param("startTime") Date startTime,
+ @Param("endTime") Date endTime);
}
diff --git a/business/src/main/java/com/ycl/service/AuditHistoryService.java b/business/src/main/java/com/ycl/service/AuditHistoryService.java
index 8f64b4c..504081c 100644
--- a/business/src/main/java/com/ycl/service/AuditHistoryService.java
+++ b/business/src/main/java/com/ycl/service/AuditHistoryService.java
@@ -1,12 +1,18 @@
package com.ycl.service;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.ycl.common.base.Result;
import com.ycl.domain.entity.AuditHistory;
+import com.ycl.domain.form.AuditHistoryForm;
+import com.ycl.domain.query.AuditHistoryQuery;
/**
* 瀹℃牳璁板綍 鏈嶅姟绫�
*/
public interface AuditHistoryService extends IService<AuditHistory> {
+ public Result add(AuditHistoryForm auditHistory);
+
+ public Result page(AuditHistoryQuery query);
}
diff --git a/business/src/main/java/com/ycl/service/IndexHomeService.java b/business/src/main/java/com/ycl/service/IndexHomeService.java
index 41d9aba..6b96ace 100644
--- a/business/src/main/java/com/ycl/service/IndexHomeService.java
+++ b/business/src/main/java/com/ycl/service/IndexHomeService.java
@@ -2,7 +2,12 @@
import com.ycl.common.base.Result;
+import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.form.ProjectProgressStatisticsForm;
+import com.ycl.domain.query.WaitTodoQuery;
+import com.ycl.system.domain.base.AbsQuery;
+
+import java.util.List;
/**
* 棣栭〉 鏈嶅姟绫�
@@ -21,6 +26,8 @@
*/
Result projectStageCount();
+ List<ProjectInfo> getLoginUserOwnProjectInfo();
+
/**
* 椤圭洰杩涘害缁熻
* @return
@@ -33,6 +40,11 @@
*/
Result projectFundingStatus();
+ /**
+ * 鑾峰緱寰呭鐞嗕换鍔�
+ * @return
+ */
+ int countWaitTask();
/**
* 椤圭洰鎺ㄨ繘鍗$偣
@@ -40,5 +52,15 @@
*/
Result projectAdvanceCheckPoint();
+ Result getWaitTaskList(WaitTodoQuery query);
+
+ /**
+ * 鑾峰緱椤圭洰鍒楄〃
+ * @return
+ */
+ Result getProjectList();
+
Result getProjectSelectList();
+
+
}
diff --git a/business/src/main/java/com/ycl/service/WorkStationScheduleService.java b/business/src/main/java/com/ycl/service/WorkStationScheduleService.java
index 0d93bdd..1eefce2 100644
--- a/business/src/main/java/com/ycl/service/WorkStationScheduleService.java
+++ b/business/src/main/java/com/ycl/service/WorkStationScheduleService.java
@@ -51,6 +51,12 @@
Result page(WorkStationScheduleQuery query);
/**
+ * 鏌ヨ浼犲叆鏃堕棿鏈堜唤鍐呮瘡澶╂棩绋�
+ * @param query
+ * @return
+ */
+ Result listByDate(WorkStationScheduleQuery query);
+ /**
* 鏍规嵁id鏌ユ壘
* @param id
* @return
@@ -64,6 +70,15 @@
Result all();
Result completedAchievements(Integer id);
-
+ /**
+ * 鑾峰緱浠婃垚灏辩粺璁�
+ * @return
+ */
Result countAchievements();
+
+ /**
+ * 鑾峰緱浠婃棩浠诲姟缁熻
+ * @return
+ */
+ Result countTodayTask();
}
diff --git a/business/src/main/java/com/ycl/service/impl/AuditHistoryServiceImpl.java b/business/src/main/java/com/ycl/service/impl/AuditHistoryServiceImpl.java
index 8a830de..f05342b 100644
--- a/business/src/main/java/com/ycl/service/impl/AuditHistoryServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/AuditHistoryServiceImpl.java
@@ -1,15 +1,30 @@
package com.ycl.service.impl;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.common.base.Result;
+import com.ycl.common.utils.SecurityUtils;
import com.ycl.domain.entity.AuditHistory;
+import com.ycl.domain.entity.ProjectInfo;
+import com.ycl.domain.form.AuditHistoryForm;
+import com.ycl.domain.query.AuditHistoryQuery;
+import com.ycl.domain.vo.AuditHistoryVO;
+import com.ycl.framework.utils.PageUtil;
import com.ycl.mapper.AuditHistoryMapper;
+import com.ycl.mapper.ProjectInfoMapper;
import com.ycl.service.AuditHistoryService;
+import com.ycl.service.IndexHomeService;
+import com.ycl.system.mapper.SysDeptMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
/**
* 瀹℃牳璁板綍 鏈嶅姟瀹炵幇绫�
@@ -19,4 +34,61 @@
@RequiredArgsConstructor
public class AuditHistoryServiceImpl extends ServiceImpl<AuditHistoryMapper, AuditHistory> implements AuditHistoryService {
+
+ private final AuditHistoryMapper auditHistoryMapper;
+ private final ProjectInfoMapper projectInfoMapper;
+ private final SysDeptMapper sysDeptMapper;
+ @Override
+ public Result add(AuditHistoryForm auditHistoryForm) {
+ AuditHistory entity = AuditHistoryForm.getEntityByForm(auditHistoryForm, null);
+ baseMapper.insert(entity);
+ return Result.ok("娣诲姞鎴愬姛");
+ }
+ public List<ProjectInfo> getLoginUserOwnProjectInfo(){
+ //鏉冮檺鎺у埗
+ Long userId = SecurityUtils.getUserId();
+ List<ProjectInfo> list;
+ if (SecurityUtils.isAdmin(userId)){
+ //鏌ヨ鍏ㄩ儴
+ list = new LambdaQueryChainWrapper<>(projectInfoMapper)
+ .eq(ProjectInfo::getDeleted, Boolean.FALSE)
+ .eq(ProjectInfo::getUsedStatus, 2)//瀹℃牳閫氳繃
+ .orderBy(true, true, ProjectInfo::getId)
+ .list();
+ }else{
+ String ancestors = sysDeptMapper.selectAncestors(userId);
+ String[] ancestorArr = ancestors.split(",");
+ List<String> ancestorList = Arrays.stream(ancestorArr).collect(Collectors.toList());
+ ancestorList.add(SecurityUtils.getDeptId() + "");
+ //鑾峰緱鏈崟浣嶄互鍙婂叾瀛愬崟浣峝eptId;
+ list = new LambdaQueryChainWrapper<>(projectInfoMapper)
+ .eq(ProjectInfo::getDeleted, Boolean.FALSE)
+ .eq(ProjectInfo::getUsedStatus, 2) //瀹℃牳閫氳繃
+ .in(ProjectInfo::getProjectOwnerUnit, ancestorList)
+ .orderBy(true, true, ProjectInfo::getId)
+ .list();
+ }
+ return list;
+ }
+ @Override
+ public Result page(AuditHistoryQuery query) {
+ //闇�瑕佹煡璇㈠埌鎸囧畾椤圭洰鐨勬棩蹇�
+ List<Long> ids = new ArrayList<>();
+ if ("all".equals(query.getProjectId())){
+ List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
+ if (CollectionUtils.isEmpty(loginUserOwnProjectInfo)) {
+ //杩斿洖榛樿鍊�
+ return Result.ok().data(null).total(0);
+ }
+ ids = loginUserOwnProjectInfo.stream().map(ProjectInfo::getId).collect(Collectors.toList());
+ }else{
+ ids.add(Long.valueOf(query.getProjectId()));
+ }
+
+ query.setProjectIds(ids);
+ query.setDeptId(SecurityUtils.getDeptId());
+ IPage<AuditHistoryVO> page = PageUtil.getPage(query, AuditHistoryVO.class);
+ baseMapper.getPage(page, query);
+ return Result.ok().data(page.getRecords()).total(page.getTotal());
+ }
}
diff --git a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
index 9514a39..4cfafc5 100644
--- a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -16,6 +16,8 @@
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
+import com.ycl.common.enums.business.AuditHistoryEnum;
+import com.ycl.common.enums.business.AuditTypeEnum;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.exception.CustomException;
@@ -29,6 +31,7 @@
import com.ycl.domain.entity.ProcessLog;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.entity.SysForm;
+import com.ycl.domain.form.AuditHistoryForm;
import com.ycl.domain.form.EditFinishedTaskForm;
import com.ycl.domain.json.RejectData;
import com.ycl.domain.query.ProcessLogQuery;
@@ -111,7 +114,7 @@
private final ProcessLogService processLogService;
private final ApplicationEventPublisher publisher;
private final ProjectProcessMapper projectProcessMapper;
-
+ private final AuditHistoryService auditHistoryService;
@Value("${targetIp}")
private String targetIp;
@@ -136,6 +139,21 @@
taskService.setAssignee(taskVo.getTaskId(), userId.toString());
taskService.complete(taskVo.getTaskId(), taskVo.getVariables());
}
+ ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper)
+ .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId())
+ .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId())
+ .one();
+ AuditHistoryForm auditHistoryForm =
+ buildForm(task.getId(),
+ task.getTaskDefinitionKey(),
+ null,
+ SecurityUtils.getDeptId() + "",
+ AuditTypeEnum.Review.name(),
+ projectProcess.getProjectId(),
+ "t_project_info",
+ task.getName()
+ );
+ auditHistoryService.add(auditHistoryForm);
return AjaxResult.success();
}
@@ -195,9 +213,45 @@
ProcessLogEventTypeEnum.FINISHED,
null));
}
+ //淇濆瓨鏃ュ織
+ AuditHistoryForm auditHistoryForm =
+ buildForm(taskId,
+ task.getTaskDefinitionKey(),
+ null,
+ SecurityUtils.getDeptId() + "",
+ AuditTypeEnum.Submit.name(),
+ projectProcess.getProjectId(),
+ "t_project_info",
+ task.getName()
+ );
+ auditHistoryService.add(auditHistoryForm);
+
return AjaxResult.success("鎻愪氦鎴愬姛");
}
+ public AuditHistoryForm buildForm(
+ String taskId,
+ String taskDefinitionKey,
+ String viewer,
+ String commitDept,
+ String auditType,
+ String businessKey,
+ String businessTable,
+ String content) {
+ AuditHistoryForm auditHistoryForm = new AuditHistoryForm();
+ auditHistoryForm.setTaskId(taskId);
+ auditHistoryForm.setTaskDefinitionKey(taskDefinitionKey);
+ auditHistoryForm.setViewer(viewer);
+ auditHistoryForm.setCommitDept(commitDept);
+ auditHistoryForm.setAuditType(auditType);
+ auditHistoryForm.setBusinessKey(businessKey);
+ auditHistoryForm.setBusinessTable(businessTable);
+ auditHistoryForm.setContent(content);
+ // 5. 鐗规畩瀛楁榛樿鍊硷細isRead 榛樿涓� 锛堟湭璇伙級
+ auditHistoryForm.setIsRead(AuditHistoryEnum.UN_READ.name());
+
+ return auditHistoryForm;
+ }
/**
* 瀹圭己琛ヤ氦
@@ -499,6 +553,21 @@
task.getName(),
ProcessLogEventTypeEnum.REJECT,
new RejectData(flowTaskVo.getComment())));
+
+ //淇濆瓨鏃ュ織
+ AuditHistoryForm auditHistoryForm =
+ buildForm(task.getId(),
+ task.getTaskDefinitionKey(),
+ null,
+ SecurityUtils.getDeptId() + "",
+ AuditTypeEnum.Submit.name(),
+ projectProcess.getProjectId(),
+ "t_project_info",
+ task.getName()
+ );
+ auditHistoryService.add(auditHistoryForm);
+
+
}
/**
@@ -688,6 +757,7 @@
@Transactional(rollbackFor = Exception.class)
public void assignTask(FlowTaskVo flowTaskVo) {
// 鐩存帴杞淳灏卞彲浠ヨ鐩栨帀涔嬪墠鐨�
+ log.info("flowTaskVo:{}",flowTaskVo);
taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee());
// // 鍒犻櫎鎸囨淳浜洪噸鏂版寚娲�
// taskService.deleteCandidateUser(flowTaskVo.getTaskId(),flowTaskVo.getAssignee());
@@ -695,6 +765,17 @@
// // 濡傛灉瑕佹煡璇㈣浆缁欎粬浜哄鐞嗙殑浠诲姟锛屽彲浠ュ悓鏃跺皢OWNER杩涜璁剧疆锛�
// taskService.setOwner(flowTaskVo.getTaskId(), flowTaskVo.getAssignee());
+// AuditHistoryForm auditHistoryForm =
+// buildForm(flowTaskVo.getTaskId(),
+// task.getTaskDefinitionKey(),
+// null,
+// SecurityUtils.getDeptId() + "",
+// AuditTypeEnum.Submit.name(),
+// projectProcess.getProjectId(),
+// "t_project_info",
+// task.getName()
+// );
+
}
/**
diff --git a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
index d348364..629823e 100644
--- a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
@@ -1,9 +1,7 @@
package com.ycl.service.impl;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import com.ycl.common.annotation.DataScope;
import com.ycl.common.base.Result;
import com.ycl.common.constant.ProcessOverTimeConstants;
import com.ycl.common.core.domain.BaseEntity;
@@ -17,14 +15,15 @@
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.form.ProjectProgressStatisticsForm;
+import com.ycl.domain.query.WaitTodoQuery;
import com.ycl.domain.vo.*;
import com.ycl.factory.FlowServiceFactory;
import com.ycl.mapper.ProcessCodingMapper;
import com.ycl.mapper.ProcessLogMapper;
import com.ycl.mapper.ProjectInfoMapper;
-import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.IndexHomeService;
import com.ycl.service.ProjectProcessService;
+import com.ycl.service.common.TaskCommonService;
import com.ycl.system.mapper.SysDeptMapper;
import com.ycl.system.service.ISysDeptService;
import com.ycl.system.service.ISysRoleService;
@@ -39,8 +38,8 @@
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.identitylink.api.IdentityLinkInfo;
-import org.flowable.identitylink.api.IdentityLinkType;
import org.flowable.task.api.Task;
+import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -78,13 +77,14 @@
private final ISysDeptService sysDeptService;
private final ISysRoleService sysRoleService;
+
+ private final TaskCommonService taskCommonService;
+
+
@Override
public Result projectCodingStatusCount() {
//鏉冮檺鎺у埗
List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
-
-
-
Map<String,Integer> map = new HashMap<>();
map.put(ProcessOverTimeConstants.GREEN,0);
@@ -151,6 +151,7 @@
return Result.ok().data(map);
}
+ @Override
public List<ProjectInfo> getLoginUserOwnProjectInfo(){
//鏉冮檺鎺у埗
Long userId = SecurityUtils.getUserId();
@@ -389,6 +390,58 @@
return Result.ok().data(projectInfoAndFunding);
}
+ @Override
+ public int countWaitTask() {
+ Long userId = SecurityUtils.getUserId();
+ List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
+ if (CollectionUtils.isEmpty(loginUserOwnProjectInfo)) {
+ return 0;
+ }
+ List<Long> ids = loginUserOwnProjectInfo.stream()
+ .filter(Objects::nonNull)
+ .map(ProjectInfo::getId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(ids)) {
+ return 0;
+ }
+ List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
+ .eq(ProjectProcess::getDeleted, Boolean.FALSE)
+ .in(ProjectProcess::getProjectId, ids)
+ .list();
+ if (CollectionUtils.isEmpty(projectProcessList)) {
+ return 0;
+ }
+ List<String> targetProcessInsIds = projectProcessList.stream()
+ .filter(Objects::nonNull) // 杩囨护null鐨凱rojectProcess瀵硅薄
+ .map(ProjectProcess::getProcessInsId)
+ .filter(defId -> defId != null && !defId.trim().isEmpty()) // 鍏堝垽null鍐峵rim锛屼慨澶嶉闄�3
+ .distinct()
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(targetProcessInsIds)) {
+ return 0;
+ }
+
+ List<Task> allRunningTasks = taskService.createTaskQuery().active().list();
+ if (CollectionUtils.isEmpty(allRunningTasks)) {
+ return 0;
+ }
+ List<Task> targetRunningTasks = allRunningTasks.stream()
+ .filter(Objects::nonNull)
+ .filter(task -> {
+ // 鍏堝垽null锛屽啀鍖归厤锛屼慨澶嶉闄�1
+ String processInsId = task.getProcessInstanceId();
+ return processInsId != null && targetProcessInsIds.contains(processInsId);
+ })
+ .filter(task -> {
+ String assignee = task.getAssignee();
+ return assignee == null || userId.toString().equals(assignee);//鎺掗櫎棰嗗彇浜�
+ })
+ .collect(Collectors.toList());
+
+
+ return targetRunningTasks.size();
+ }
@Override
public Result projectAdvanceCheckPoint() {
@@ -401,7 +454,7 @@
List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
.eq(ProjectProcess::getDeleted, Boolean.FALSE)
.in(ProjectProcess::getProjectId, ids).list();
-
+ Long userId = SecurityUtils.getUserId();
//娴佺▼瀹炰緥id闆嗗悎
List<String> targetProcessInsIds = projectProcessList.stream()
.map(ProjectProcess::getProcessInsId)
@@ -454,11 +507,16 @@
List<Task> allRunningTasks = taskService.createTaskQuery().active().list();
+
List<Task> targetRunningTasks = allRunningTasks.stream()
// 鍏抽敭鍖归厤锛氫换鍔$殑娴佺▼瀹氫箟ID 瀛樺湪浜� projectProcessList 鐨勬祦绋嬪畾涔塈D鍒楄〃涓�
.filter(task -> targetProcessInsIds.contains(task.getProcessInstanceId()))
+ .filter(task -> {
+ String assignee = task.getAssignee();
+ log.info("assignee:{}",assignee);
+ return assignee == null || userId.toString().equals(assignee);
+ })
.collect(Collectors.toList());
-
List<TaskInfoVo> list = new ArrayList<>();
// 鎸夋祦绋嬪疄渚媔d鍒嗙粍
@@ -471,9 +529,11 @@
.eq(ProcessCoding::getDeleted, Boolean.FALSE)
.in(ProcessCoding::getTaskId, taskIds)
.list();
+ log.info("processCodingList.size():{}", processCodingList.size()); // 鐪嬫棩蹇楁槸鍚︿负0
+ Map<String, ProcessCoding> processCodingMap = new HashMap<>();
//鎸塼askId杞崲涓簃ap鏂归潰涓嬮潰鑾峰彇
if (!CollectionUtils.isEmpty(processCodingList)){
- Map<String, ProcessCoding> processCodingMap = processCodingList.stream()
+ processCodingMap = processCodingList.stream()
.filter(Objects::nonNull) // 閬垮厤null鍏冪礌瀵艰嚧NPE锛堝彲閫変繚鐣欙級
.filter(vo -> vo.getTaskId() != null) // 杩囨护taskId涓簄ull鐨勬棤鏁堟暟鎹�
.collect(Collectors.toMap(
@@ -493,128 +553,126 @@
return newCreateTime.getTime() > oldCreateTime.getTime() ? newVal : oldVal;
}
));
+ }
+ for (Task task : targetRunningTasks) {
- for (Task task : targetRunningTasks) {
+ TaskInfoVo taskVo = new TaskInfoVo();
- TaskInfoVo taskVo = new TaskInfoVo();
-
- taskVo.setId(task.getId());
- taskVo.setTaskName(task.getName());
- taskVo.setStartTime(task.getCreateTime());
- taskVo.setEndTime(task.getDueDate());
+ taskVo.setId(task.getId());
+ taskVo.setTaskName(task.getName());
+ taskVo.setStartTime(task.getCreateTime());
+ taskVo.setEndTime(task.getDueDate());
// taskVo.setTaskType();
- List<Long> handlerIds = new ArrayList<>(2);
- List<String> handlerNames = new ArrayList<>(2);
- List<Long> handlerUnitIds = new ArrayList<>(2);
- List<String> handlerUnitNames = new ArrayList<>(2);
- List<String> promoterNames = new ArrayList<>(2);
- List<String> promoterUnitNames = new ArrayList<>(2);
- CustomerTaskVO customerTaskVO = new CustomerTaskVO();
- customerTaskVO.setHandlerId(handlerIds);
- customerTaskVO.setHandlerName(handlerNames);
- customerTaskVO.setHandlerUnitId(handlerUnitIds);
- customerTaskVO.setHandlerUnitName(handlerUnitNames);
- customerTaskVO.setPromoterName(promoterNames);
- customerTaskVO.setPromoterUnitName(promoterUnitNames);
+ List<Long> handlerIds = new ArrayList<>(2);
+ List<String> handlerNames = new ArrayList<>(2);
+ List<Long> handlerUnitIds = new ArrayList<>(2);
+ List<String> handlerUnitNames = new ArrayList<>(2);
+ List<String> promoterNames = new ArrayList<>(2);
+ List<String> promoterUnitNames = new ArrayList<>(2);
+ CustomerTaskVO customerTaskVO = new CustomerTaskVO();
+ customerTaskVO.setHandlerId(handlerIds);
+ customerTaskVO.setHandlerName(handlerNames);
+ customerTaskVO.setHandlerUnitId(handlerUnitIds);
+ customerTaskVO.setHandlerUnitName(handlerUnitNames);
+ customerTaskVO.setPromoterName(promoterNames);
+ customerTaskVO.setPromoterUnitName(promoterUnitNames);
- // 娴佺▼澶勭悊浜轰俊鎭�
- List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
- for (IdentityLinkInfo identityLink : identityLinksForTask) {
- // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
- if (StringUtils.isNotBlank(identityLink.getUserId())) {
- // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝杩愯涓殑浠诲姟鏃犻渶鍐嶅鐞嗚〃杈惧紡浜嗭紝flowable宸茬粡鑷姩鏍规嵁鍙橀噺璁剧疆浜�
- customerTaskVO.setHandlerType(HandlerTypeEnum.USER);
- SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
- if (Objects.nonNull(sysUser)) {
- customerTaskVO.getHandlerId().add(sysUser.getUserId());
- customerTaskVO.getHandlerName().add(this.getUserShowName(sysUser));
- if (Objects.nonNull(sysUser.getDept())) {
- customerTaskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
- customerTaskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
- customerTaskVO.getPromoterName().add(this.getUserShowName(sysUser));
- String[] str = sysUser.getDept().getAncestors().split(",");
- if (str.length >= 4){
- customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName());
- }else {
- customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
- }
-
+ // 娴佺▼澶勭悊浜轰俊鎭�
+ List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
+ for (IdentityLinkInfo identityLink : identityLinksForTask) {
+ // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
+ if (StringUtils.isNotBlank(identityLink.getUserId())) {
+ // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝杩愯涓殑浠诲姟鏃犻渶鍐嶅鐞嗚〃杈惧紡浜嗭紝flowable宸茬粡鑷姩鏍规嵁鍙橀噺璁剧疆浜�
+ customerTaskVO.setHandlerType(HandlerTypeEnum.USER);
+ SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
+ if (Objects.nonNull(sysUser)) {
+ customerTaskVO.getHandlerId().add(sysUser.getUserId());
+ customerTaskVO.getHandlerName().add(this.getUserShowName(sysUser));
+ if (Objects.nonNull(sysUser.getDept())) {
+ customerTaskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
+ customerTaskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
+ customerTaskVO.getPromoterName().add(this.getUserShowName(sysUser));
+ String[] str = sysUser.getDept().getAncestors().split(",");
+ if (str.length >= 4){
+ customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName());
+ }else {
+ customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
}
- }
- // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂�
- } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
- if (identityLink.getGroupId().startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1
- customerTaskVO.setHandlerType(HandlerTypeEnum.DEPT);
- String[] split = identityLink.getGroupId().split(":");
- if (split.length > 1) {
- // 閮ㄩ棬
- SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
- if (Objects.nonNull(dept)) {
- customerTaskVO.getHandlerUnitId().add(dept.getDeptId());
- customerTaskVO.getHandlerUnitName().add(dept.getDeptName());
- customerTaskVO.getPromoterName().add(this.getDeptLeaderShowName(dept));
- customerTaskVO.getPromoterUnitName().add(this.setDeptNameWithParentName(dept));
- }
- }
- } else {
- customerTaskVO.setHandlerType(HandlerTypeEnum.ROLE);
- SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
- if (Objects.nonNull(role)) {
- customerTaskVO.getHandlerUnitId().add(Long.parseLong(identityLink.getGroupId()));
- customerTaskVO.getHandlerUnitName().add(role.getRoleName());
- }
- }
- }
- this.distinctVo(customerTaskVO);
- }
- taskVo.setCustomerTaskInfo(customerTaskVO);
-
- //缁勮浠诲姟淇℃伅
- CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
- if (checkPointVO != null) {
- taskVo.setCheckPointInfo(checkPointVO);
- }
- //瓒呮椂鏃堕棿鍜屾鏁板湪 processCodingList涓� 杩欓噷闇�瑕佹洿鍏穞askId鏉ヨ幏寰楀搴斾俊鎭�
- ProcessCoding processCoding = processCodingMap.get(task.getId());
- //璁剧疆瓒呮椂淇℃伅
- if (processCoding != null) {
-
- String overTimeTotalStr = processCoding.getOverTimeTotal();
- long overTimeTotal = 0L;
- if (StringUtils.isNotBlank(overTimeTotalStr)) {
- try {
- overTimeTotal = Long.parseLong(overTimeTotalStr.trim());
- } catch (NumberFormatException e) {
}
}
- String overTimeDesc = convertHoursToDayHourStr(overTimeTotal);
- taskVo.setTotalOverTime(overTimeDesc);
-
- // 2. 鎻愬彇绾㈢爜闃堝�� 濡傦細 0-22 澶�-灏忔椂 骞惰浆鎹负灏忔椂
- String redTimeStr = processCoding.getRedTime();
- Long redTimeSec = getTime(redTimeStr);
- Double redTimeHour = null;
- if (redTimeSec != null && redTimeSec > 0) {
- redTimeHour = redTimeSec / 3600.0;
+ // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂�
+ } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
+ if (identityLink.getGroupId().startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1
+ customerTaskVO.setHandlerType(HandlerTypeEnum.DEPT);
+ String[] split = identityLink.getGroupId().split(":");
+ if (split.length > 1) {
+ // 閮ㄩ棬
+ SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
+ if (Objects.nonNull(dept)) {
+ customerTaskVO.getHandlerUnitId().add(dept.getDeptId());
+ customerTaskVO.getHandlerUnitName().add(dept.getDeptName());
+ customerTaskVO.getPromoterName().add(this.getDeptLeaderShowName(dept));
+ customerTaskVO.getPromoterUnitName().add(this.setDeptNameWithParentName(dept));
+ }
+ }
+ } else {
+ customerTaskVO.setHandlerType(HandlerTypeEnum.ROLE);
+ SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
+ if (Objects.nonNull(role)) {
+ customerTaskVO.getHandlerUnitId().add(Long.parseLong(identityLink.getGroupId()));
+ customerTaskVO.getHandlerUnitName().add(role.getRoleName());
+ }
}
- long overTimeCount = 0L;
- // 鍒ゆ柇瓒呮椂娆℃暟
- if (overTimeTotal > 0 && redTimeHour != null && redTimeHour > 0) {
- overTimeCount = (long) (overTimeTotal / redTimeHour);
- }
-
-
- taskVo.setOverTimeCount(overTimeCount);
- }else {
- //涓簄ull 璇存槑鏈厤缃秴鏃舵椂闂� 榛樿鏈秴鏃�
- taskVo.setOverTimeCount(0L);
- taskVo.setTotalOverTime("0灏忔椂");
}
- list.add(taskVo);
+ this.distinctVo(customerTaskVO);
}
+ taskVo.setCustomerTaskInfo(customerTaskVO);
+ //缁勮浠诲姟淇℃伅
+ CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
+ if (checkPointVO != null) {
+ taskVo.setCheckPointInfo(checkPointVO);
+ }
+ //瓒呮椂鏃堕棿鍜屾鏁板湪 processCodingList涓� 杩欓噷闇�瑕佹洿鍏穞askId鏉ヨ幏寰楀搴斾俊鎭�
+ ProcessCoding processCoding = processCodingMap.get(task.getId());
+ //璁剧疆瓒呮椂淇℃伅
+ if (processCoding != null) {
+
+ String overTimeTotalStr = processCoding.getOverTimeTotal();
+ long overTimeTotal = 0L;
+ if (StringUtils.isNotBlank(overTimeTotalStr)) {
+ try {
+ overTimeTotal = Long.parseLong(overTimeTotalStr.trim());
+ } catch (NumberFormatException e) {
+
+ }
+ }
+ String overTimeDesc = convertHoursToDayHourStr(overTimeTotal);
+ taskVo.setTotalOverTime(overTimeDesc);
+
+ // 2. 鎻愬彇绾㈢爜闃堝�� 濡傦細 0-22 澶�-灏忔椂 骞惰浆鎹负灏忔椂
+ String redTimeStr = processCoding.getRedTime();
+ Long redTimeSec = getTime(redTimeStr);
+ Double redTimeHour = null;
+ if (redTimeSec != null && redTimeSec > 0) {
+ redTimeHour = redTimeSec / 3600.0;
+ }
+ long overTimeCount = 0L;
+ // 鍒ゆ柇瓒呮椂娆℃暟
+ if (overTimeTotal > 0 && redTimeHour != null && redTimeHour > 0) {
+ overTimeCount = (long) (overTimeTotal / redTimeHour);
+ }
+
+
+ taskVo.setOverTimeCount(overTimeCount);
+ }else {
+ //涓簄ull 璇存槑鏈厤缃秴鏃舵椂闂� 榛樿鏈秴鏃�
+ taskVo.setOverTimeCount(0L);
+ taskVo.setTotalOverTime("0灏忔椂");
+ }
+ list.add(taskVo);
}
@@ -622,6 +680,211 @@
return Result.ok().data(list);
}
+
+ public HashMap<String,Object> buildEmptyResultMap(){
+ HashMap<String,Object> map = new HashMap<>();
+ map.put("data", new ArrayList<>());
+ map.put("total", 0L);
+ return map;
+ }
+ @Override
+ public Result getWaitTaskList(WaitTodoQuery baseQuery) {
+ int pageNum = (int) baseQuery.getCurrentPage();
+ int pageSize = (int) baseQuery.getPageSize();
+ Long userId = SecurityUtils.getUserId(); // 褰撳墠鐢ㄦ埛ID
+ boolean isAdmin = SecurityUtils.getLoginUser().getUser().isAdmin(); // 鏄惁绠$悊鍛�
+ List<String> userGroups = taskCommonService.getCurrentUserGroups(); // 褰撳墠鐢ㄦ埛鎵�灞炵粍
+ List<ProjectInfo> targetProjectList = new ArrayList<>();
+ String queryProjectId = baseQuery.getId();
+
+
+ if ("all".equals(queryProjectId) || StringUtils.isBlank(queryProjectId)){
+ // 鏌ヨ鍏ㄩ儴
+ targetProjectList = getLoginUserOwnProjectInfo();
+ }else{
+ try {
+ Long projectId = Long.parseLong(queryProjectId);
+ // 鈶� 鏌ヨ璇ラ」鐩熀纭�淇℃伅锛堟浛鎹负瀹為檯鏌ヨ鏂规硶锛�
+ ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
+ if (projectInfo == null) {
+ // 椤圭洰涓嶅瓨鍦紝杩斿洖绌烘暟鎹�
+ return Result.ok().data(buildEmptyResultMap());
+ }
+ //
+ targetProjectList.add(projectInfo);
+ } catch (NumberFormatException e) {
+ // 椤圭洰ID鏍煎紡閿欒锛岃繑鍥炵┖鏁版嵁
+ return Result.ok().data(buildEmptyResultMap());
+ }
+ }
+
+ List<Long> projectIds = targetProjectList.stream().map(ProjectInfo::getId).collect(Collectors.toList());
+
+ List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
+ .eq(ProjectProcess::getDeleted, Boolean.FALSE)
+ .in(ProjectProcess::getProjectId, projectIds).list();
+ // 4. 鎻愬彇鏈夋晥鐨勬祦绋嬪疄渚婭D锛堝幓閲�+闈炵┖杩囨护锛�
+ List<String> targetProcessInsIds = projectProcessList.stream()
+ .map(ProjectProcess::getProcessInsId)
+ .distinct()
+ .filter(defId -> defId != null && !defId.trim().isEmpty())
+ .collect(Collectors.toList());
+
+ if (CollectionUtils.isEmpty(targetProcessInsIds)) {
+ return Result.ok().data(new HashMap<String, Object>() {{
+ put("data", new ArrayList<>());
+ put("total", 0L);
+ }});
+ }
+
+ // 5. 鏋勫缓processInfoMap锛堟牳蹇冿細椤圭洰ID鈫扖heckPointVO锛屽啀鍏宠仈娴佺▼淇℃伅锛�
+ Map<String, CheckPointVO> map = new HashMap<>();
+ // 鍏堝~鍏呴」鐩熀纭�淇℃伅
+ for (ProjectInfo projectInfo : targetProjectList) {
+ CheckPointVO checkPointVO = new CheckPointVO();
+ checkPointVO.setId(projectInfo.getId());
+ checkPointVO.setProjectName(projectInfo.getProjectName());
+ map.put(String.valueOf(projectInfo.getId()), checkPointVO);
+ }
+ // 鍐嶅~鍏呮祦绋嬩俊鎭紙閮ㄧ讲ID銆佹祦绋嬪悕绉扮瓑锛�
+ for (ProjectProcess projectProcess : projectProcessList) {
+ CheckPointVO checkPointVO = map.get(projectProcess.getProjectId());
+ if (checkPointVO == null) {
+ continue; // 鏃犲尮閰嶉」鐩紝璺宠繃
+ }
+ checkPointVO.setProcessDefinitionId(projectProcess.getProcessDefId());
+ checkPointVO.setProcessInstanceId(projectProcess.getProcessInsId());
+
+ // 鑾峰緱娴佺▼閮ㄧ讲id鍜屾祦绋嬪悕绉帮紙鍏煎杩愯涓�/宸茬粨鏉熸祦绋嬶級
+ ProcessInstance process = runtimeService.createProcessInstanceQuery()
+ .processInstanceId(projectProcess.getProcessInsId()).singleResult();
+ if (Objects.nonNull(process)) {
+ checkPointVO.setDeployId(process.getDeploymentId());
+ checkPointVO.setProcessName(process.getProcessDefinitionName());
+ } else {
+ HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery()
+ .processInstanceId(projectProcess.getProcessInsId()).singleResult();
+ if (Objects.nonNull(hisProcess)) { // 閬垮厤鍘嗗彶娴佺▼涓簄ull鐨凬PE
+ checkPointVO.setDeployId(hisProcess.getDeploymentId());
+ checkPointVO.setProcessName(hisProcess.getProcessDefinitionName());
+ }
+ }
+ map.put(projectProcess.getProjectId(), checkPointVO);
+ }
+ Map<String, CheckPointVO> processInfoMap = map.values().stream()
+ .filter(Objects::nonNull)
+ .filter(vo -> vo.getProcessInstanceId() != null)
+ .collect(Collectors.toMap(
+ CheckPointVO::getProcessInstanceId,
+ vo -> vo,
+ (oldVal, newVal) -> newVal // 閲嶅娴佺▼瀹炰緥ID淇濈暀鍚庤��
+ ));
+
+ TaskQuery query = getTaskService().createTaskQuery()
+ .active() // 鏈畬鎴愩�佹湭鎸傝捣鐨勬椿璺冧换鍔�
+ .processInstanceIdIn(targetProcessInsIds); // 浠呮煡椤圭洰鍏宠仈鐨勬祦绋嬪疄渚嬩换鍔�
+
+ // 鏉冮檺杩囨护锛氶潪绠$悊鍛樹粎鏌ヨ嚜宸辨湁鏉冮檺鐨勪换鍔★紙宸查鍙�+鍊欓�夛級
+ if (!isAdmin) {
+ query.or()
+ .taskAssignee(userId+"") // 鑷繁宸查鍙栫殑浠诲姟
+ .taskCandidateUser(userId+"") // 鑷繁鏄�欓�夌敤鎴风殑浠诲姟
+ .taskCandidateGroupIn(userGroups) // 鑷繁鍦ㄥ�欓�夌粍鐨勪换鍔�
+ .endOr();
+ }
+
+ query.orderByTaskCreateTime().desc();
+ List<Task> allTaskList = query.list();
+ // 鎺掗櫎棰嗗彇浜洪棶棰�
+ allTaskList = allTaskList.stream()
+ .filter(Objects::nonNull) // 绌轰换鍔¢槻鎶�
+ .filter(task -> {
+ String assignee = task.getAssignee();
+ return assignee == null || userId.toString().equals(assignee);
+ })
+ .collect(Collectors.toList());
+ Set<String> taskIdSet = new HashSet<>();
+ List<Task> distinctAllTaskList = new ArrayList<>();
+ for (Task task : allTaskList) {
+ if (!taskIdSet.contains(task.getId())) {
+ taskIdSet.add(task.getId());
+ distinctAllTaskList.add(task);
+ //
+ }
+ }
+
+ long distinctTotal = distinctAllTaskList.size();
+ System.out.println("鍘婚噸鍚庢�绘暟锛�" + distinctTotal);
+
+
+ int startIndex = (pageNum - 1) * pageSize;
+ List<Task> pageTaskList = new ArrayList<>();
+ if (startIndex < distinctAllTaskList.size()) {
+ int endIndex = Math.min(startIndex + pageSize, distinctAllTaskList.size());
+ pageTaskList = distinctAllTaskList.subList(startIndex, endIndex);
+ }
+
+
+ List<TaskInfoVo> taskInfoVoList = new ArrayList<>();
+ //鏌ヨ浠诲姟鐘舵��
+ List<String> taskIds = pageTaskList.stream().map(Task::getId).collect(Collectors.toList());
+ HashMap<String,ProcessLog> taskInfoMap = new HashMap<>();
+ if (!CollectionUtils.isEmpty(taskIds)) {
+ taskInfoMap = new LambdaQueryChainWrapper<>(processLogMapper)
+ .eq(ProcessLog::getDeleted, Boolean.FALSE)
+ .in(ProcessLog::getTaskId, taskIds).list()
+ .stream()
+ .filter(processLog -> processLog.getTaskId() != null && processLog.getGmtCreate() != null)
+ .collect(Collectors.toMap(
+ // Key锛歵askId杞瓧绗︿覆
+ ProcessLog::getTaskId,
+ // Value锛歅rocessLog瀵硅薄鏈韩
+ processLog -> processLog,
+ // 鍐茬獊绛栫暐锛氫繚鐣檊mtCreate鏇存柊鐨勯偅鏉¤褰�
+ (existing, replacement) -> {
+ return replacement.getGmtCreate().after(existing.getGmtCreate())
+ ? replacement : existing;
+ },
+ HashMap::new
+ ));
+ }
+
+
+ for (Task task : pageTaskList) {
+ TaskInfoVo taskVo = new TaskInfoVo();
+ taskVo.setId(task.getId());
+ taskVo.setTaskName(task.getName());
+ taskVo.setStartTime(task.getCreateTime());
+ taskVo.setEndTime(task.getDueDate());
+ // 濉厖浠诲姟鐘舵�佸瓧娈�
+ taskVo.setTaskType("寰呭畬鎴�");
+ ProcessLog processLog = taskInfoMap.get(task.getId());
+ if (Objects.nonNull(processLog)) {
+ taskVo.setTaskType(processLog.getEventType().getDesc());
+ }
+
+ CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
+ if (checkPointVO != null) {
+ taskVo.setCheckPointInfo(checkPointVO);
+ }
+
+ taskInfoVoList.add(taskVo);
+ }
+ //鎺掗櫎 宸插畬鎴愮殑
+ taskInfoVoList = taskInfoVoList.stream().filter(taskInfoVo -> {
+ if (ProcessLogEventTypeEnum.FINISHED.getDesc().equals(taskInfoVo.getTaskType())){
+ return false;
+ }
+ return true;
+ }).collect(Collectors.toList());
+ HashMap<String, Object> resultMap = new HashMap<>();
+ resultMap.put("data", taskInfoVoList);
+ resultMap.put("total", distinctTotal);
+ return Result.ok().data(resultMap);
+ }
+
+
+
private String convertHoursToDayHourStr(long totalHours) {
if (totalHours < 0) {
return "0灏忔椂"; // 闃插尽鎬у鐞嗚礋鏁板満鏅�
@@ -681,11 +944,18 @@
}
@Override
+ public Result getProjectList(){
+ List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
+ return Result.ok().data(loginUserOwnProjectInfo);
+ }
+
+ @Override
public Result getProjectSelectList() {
List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
if (CollectionUtils.isEmpty(loginUserOwnProjectInfo)) {
return Result.ok().data(loginUserOwnProjectInfo);
}
+
Map<String, String> projectMap = loginUserOwnProjectInfo.stream()
.collect(Collectors.toMap(
projectInfo -> String.valueOf(projectInfo.getId()), // key: 椤圭洰ID
@@ -695,4 +965,6 @@
));
return Result.ok().data(projectMap);
}
+
+
}
diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
index 84aa178..a20d918 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -95,7 +95,7 @@
private final ProcessLogService processLogService;
private final ISysDictTypeService dictTypeService;
private final ProcessConfigInfoService processConfigInfoService;
-
+ private final AuditHistoryService auditHistoryService;
/**
* 鍒嗛〉鏌ヨ
*
@@ -815,9 +815,44 @@
// 鍙戝竷杞姙浜嬩欢
publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getTaskDefinitionKey(), task.getName(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
+
+ AuditHistoryForm auditHistoryForm =
+ buildForm(task.getId(),
+ task.getTaskDefinitionKey(),
+ null,
+ SecurityUtils.getDeptId() + "",
+ AuditTypeEnum.Submit.name(),
+ form.getProjectId(),
+ "t_project_info",
+ task.getName()
+ );
+ auditHistoryService.add(auditHistoryForm);
return Result.ok("杞姙鎴愬姛");
}
+ public AuditHistoryForm buildForm(
+ String taskId,
+ String taskDefinitionKey,
+ String viewer,
+ String commitDept,
+ String auditType,
+ String businessKey,
+ String businessTable,
+ String content) {
+ AuditHistoryForm auditHistoryForm = new AuditHistoryForm();
+ auditHistoryForm.setTaskId(taskId);
+ auditHistoryForm.setTaskDefinitionKey(taskDefinitionKey);
+ auditHistoryForm.setViewer(viewer);
+ auditHistoryForm.setCommitDept(commitDept);
+ auditHistoryForm.setAuditType(auditType);
+ auditHistoryForm.setBusinessKey(businessKey);
+ auditHistoryForm.setBusinessTable(businessTable);
+ auditHistoryForm.setContent(content);
+ // 5. 鐗规畩瀛楁榛樿鍊硷細isRead 榛樿涓� 锛堟湭璇伙級
+ auditHistoryForm.setIsRead(AuditHistoryEnum.UN_READ.name());
+
+ return auditHistoryForm;
+ }
@Override
@Transactional(rollbackFor = Exception.class)
public Result taskJump(TaskJumpForm form) {
diff --git a/business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java b/business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java
index 7d20cd7..2939a71 100644
--- a/business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java
@@ -3,8 +3,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ycl.common.enums.business.WorkStationEnum;
+import com.ycl.common.utils.DateUtils;
import com.ycl.common.utils.SecurityUtils;
+import com.ycl.common.utils.StringUtils;
+import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.WorkStationSchedule;
+import com.ycl.domain.vo.DailyStatVO;
import com.ycl.factory.FlowServiceFactory;
import com.ycl.mapper.WorkStationScheduleMapper;
import com.ycl.service.WorkStationScheduleService;
@@ -13,6 +17,9 @@
import com.ycl.domain.form.WorkStationScheduleForm;
import com.ycl.domain.vo.WorkStationScheduleVO;
import com.ycl.domain.query.WorkStationScheduleQuery;
+import com.ycl.service.common.TaskCommonService;
+import org.flowable.task.api.Task;
+import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.stereotype.Service;
@@ -22,8 +29,9 @@
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
-import java.util.HashMap;
-import java.util.List;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -39,6 +47,10 @@
private final WorkStationScheduleMapper workStationScheduleMapper;
private final FlowServiceFactory flowServiceFactory;
+
+ private final TaskCommonService taskCommonService;
+ private final IndexHomeServiceImpl indexHomeServiceImpl;
+
/**
* 娣诲姞
* @param form
@@ -47,6 +59,9 @@
@Override
public Result add(WorkStationScheduleForm form) {
WorkStationSchedule entity = WorkStationScheduleForm.getEntityByForm(form, null);
+ Long userId = SecurityUtils.getUserId();
+ entity.setUserId(userId);
+ entity.setStatus(WorkStationEnum.Incomplete.name());
baseMapper.insert(entity);
return Result.ok("娣诲姞鎴愬姛");
}
@@ -101,6 +116,39 @@
return Result.ok().data(page.getRecords()).total(page.getTotal());
}
+ @Override
+ public Result listByDate(WorkStationScheduleQuery query) {
+
+ Integer projectId = null;
+ if (!"all".equals(query.getProjectId())){
+ projectId = Integer.valueOf(query.getProjectId());
+ }
+ Long userId = SecurityUtils.getUserId();
+ //鏌ヨ鍑烘寚瀹氭椂闂存鍐呯殑鏁版嵁
+ List<WorkStationScheduleVO> list = baseMapper.groupByProjectAndDate(userId,projectId, DateUtils.getMonthStartTime(query.getCompletedTime()), DateUtils.getMonthEndTime(query.getCompletedTime()));
+
+ List<DailyStatVO> dailyStatVOList = new ArrayList<>();
+ for (WorkStationScheduleVO vo : list) {
+ if (vo == null) {
+ continue;
+ }
+ DailyStatVO statVO = new DailyStatVO();
+ statVO.setId(vo.getId() == null ? -1 : vo.getId());
+ statVO.setTitle(StringUtils.isBlank(vo.getContent()) ? "鏃犲唴瀹�" : vo.getContent());
+ Map<String, String> stringTimeMap = DateUtils.splitDateToDateAndTime(vo.getCompletedTime());
+ String date = StringUtils.defaultIfBlank(stringTimeMap.get("date"), "");
+ String time = StringUtils.defaultIfBlank(stringTimeMap.get("time"), "");
+ statVO.setDate(date);
+ statVO.setTime(time);
+ statVO.setProject(StringUtils.isBlank(vo.getProjectName()) ? "鏈叧鑱旈」鐩�" : vo.getProjectName());
+ statVO.setProjectId(vo.getProjectId());
+ statVO.setCompletedTime(vo.getCompletedTime());
+ dailyStatVOList.add(statVO);
+ }
+
+ return Result.ok().data(dailyStatVOList);
+ }
+
/**
* 鏍规嵁id鏌ユ壘
* @param id
@@ -123,6 +171,7 @@
List<WorkStationScheduleVO> vos = entities.stream()
.map(entity -> WorkStationScheduleVO.getVoByEntity(entity, null))
.collect(Collectors.toList());
+
return Result.ok().data(vos);
}
@@ -142,9 +191,18 @@
HistoricTaskInstanceQuery query = flowServiceFactory.getHistoryService()
.createHistoricTaskInstanceQuery()
.finished()
- .taskAssignee(userId.toString())
+ .taskAssignee(SecurityUtils.getUserId() + "")
.orderByHistoricTaskInstanceEndTime()
.desc();
+ if (!SecurityUtils.getLoginUser().getUser().isAdmin()) {
+ query
+ .or()
+ .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups())
+ .taskCandidateUser(SecurityUtils.getUserId() + "")
+ .taskAssignee(SecurityUtils.getUserId() + "")
+ .endOr();
+ }
+
List<HistoricTaskInstance> taskList = query.list();
long totalDuration = 0L;
int taskCount = 0;
@@ -163,7 +221,8 @@
double avgDurationMs = (double) totalDuration / taskCount; // 骞冲潎鑰楁椂锛堟绉掞級
double avgDurationSec = avgDurationMs / 1000; // 杞崲涓虹
double avgDurationMin = avgDurationSec / 60; // 杞崲涓哄垎閽�
- double avgDurationHour = avgDurationMin / 60; // 杞崲涓哄垎閽�
+ BigDecimal avgDurationHour = new BigDecimal(avgDurationMin / 60).setScale(2, RoundingMode.HALF_UP); // 杞崲涓哄垎閽�
+
System.out.println("鐢ㄦ埛瀹屾垚浠诲姟鎬绘暟锛�" + taskCount);
System.out.println("骞冲潎鑰楁椂锛堢锛夛細" + avgDurationSec);
System.out.println("骞冲潎鑰楁椂锛堝垎閽燂級锛�" + avgDurationMin);
@@ -183,10 +242,37 @@
}
HashMap<String,Object> map = new HashMap<>();
- map.put("totalDuration",totalDuration);
- map.put("avgDurationHour",avgDurationHour);
- map.put("scheduleCount",list.size());
- map.put("completedCount",count);
+ map.put("totalSchedules",list.size());
+ map.put("completedSchedules",count);
+ map.put("avgDuration",avgDurationHour.doubleValue());
+ map.put("completedTasks",taskCount);
return Result.ok().data(map);
}
+
+ @Override
+ public Result countTodayTask() {
+ Long userId = SecurityUtils.getUserId();
+ Date now = new Date();
+ Date dayStart = DateUtils.getDayStart(now);
+ Date dayEnd = DateUtils.getDayEnd(now);
+ List<WorkStationSchedule> list = new LambdaQueryChainWrapper<>(baseMapper)
+ .eq(WorkStationSchedule::getUserId, SecurityUtils.getUserId())
+ .eq(WorkStationSchedule::getDeleted, Boolean.FALSE)
+ .between(WorkStationSchedule::getCompletedTime, dayStart, dayEnd)
+ .list();
+ HashMap<String,Object> map = new HashMap<>();
+ map.put("todaySchedules",list.size());
+ //鏌ヨ浠婃棩澶勭悊鐨� 鐨勪换鍔�
+ long claimedAndCompletedCount = flowServiceFactory.getHistoryService().createHistoricTaskInstanceQuery()
+ .finished()
+ .taskAssignee(userId+"") // 浠诲姟鐢卞綋鍓嶇敤鎴疯棰嗭紙澶勭悊浜烘槸璇ョ敤鎴凤級
+ .taskCompletedAfter(dayStart)
+ .taskCompletedBefore(dayEnd)
+ .count();
+ map.put("totalActiveTasks",claimedAndCompletedCount);
+ int distinctTotal = indexHomeServiceImpl.countWaitTask();
+ map.put("todayTasks",distinctTotal);
+ return Result.ok().data(map);
+ }
+
}
diff --git a/business/src/main/resources/mapper/AuditHistoryMapper.xml b/business/src/main/resources/mapper/AuditHistoryMapper.xml
index 7bb92f3..5c94d1e 100644
--- a/business/src/main/resources/mapper/AuditHistoryMapper.xml
+++ b/business/src/main/resources/mapper/AuditHistoryMapper.xml
@@ -3,7 +3,7 @@
<mapper namespace="com.ycl.mapper.AuditHistoryMapper">
<!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
- <resultMap id="BaseResultMap" type="com.ycl.domain.entity.AuditHistory">
+ <resultMap id="BaseResultMap" type="com.ycl.domain.vo.AuditHistoryVO">
<result column="task_id" property="taskId" />
<result column="task_definition_key" property="taskDefinitionKey" />
<result column="viewer" property="viewer" />
@@ -13,7 +13,36 @@
<result column="business_key" property="businessKey" />
<result column="business_table" property="businessTable" />
<result column="content" property="content" />
+ <result column="project_name" property="projectName" />
</resultMap>
+ <select id="getPage" resultMap="BaseResultMap">
+ SELECT
+ ah.task_id,
+ ah.task_definition_key,
+ ah.viewer,
+ ah.commit_dept,
+ ah.audit_type,
+ ah.is_read,
+ ah.business_key,
+ ah.business_table,
+ ah.content,
+ pi.project_name
+ FROM t_audit_history ah
+ LEFT JOIN t_project_info pi ON ah.business_key = pi.id
+ WHERE ah.deleted = 0
+ AND pi.deleted = 0
+ <if test="query.projectIds != null and query.projectIds.size() > 0">
+ AND ah.business_key IN
+ <foreach collection="query.projectIds" item="id" open="(" separator="," close=")">
+ #{id}
+ </foreach>
+ </if>
+ <if test="query.deptId != null">
+ AND
+ ah.commit_dept = #{query.deptId}
+ </if>
+ ORDER BY ah.gmt_create DESC
+ </select>
diff --git a/business/src/main/resources/mapper/WorkStationScheduleMapper.xml b/business/src/main/resources/mapper/WorkStationScheduleMapper.xml
index 07be4e1..eb1d570 100644
--- a/business/src/main/resources/mapper/WorkStationScheduleMapper.xml
+++ b/business/src/main/resources/mapper/WorkStationScheduleMapper.xml
@@ -7,8 +7,8 @@
<result column="user_id" property="userId" />
<result column="content" property="content" />
<result column="status" property="status" />
- <result column="gmtCreate" property="gmtcreate" />
- <result column="gmtUpdate" property="gmtupdate" />
+ <result column="gmt_create" property="gmtCreate" />
+ <result column="gmt_update" property="gmtUpdate" />
</resultMap>
@@ -41,4 +41,24 @@
TWSS.deleted = 0
</select>
+ <select id="groupByProjectAndDate" resultType="com.ycl.domain.vo.WorkStationScheduleVO">
+ SELECT
+ TWSS.id,
+ TWSS.user_id,
+ TWSS.content,
+ TWSS.status,
+ TWSS.project_id,
+ TWSS.completed_time,
+ TPI.project_name
+ FROM t_work_station_schedule TWSS
+ LEFT JOIN t_project_info TPI on TWSS.project_id = TPI.id
+ WHERE TWSS.deleted = 0
+ AND TWSS.user_id = #{userId}
+ AND TWSS.completed_time BETWEEN #{startTime} AND #{endTime}
+ <if test="projectId != null">
+ AND TWSS.project_id = #{projectId}
+ </if>;
+ </select>
+
+
</mapper>
diff --git a/common/src/main/java/com/ycl/common/enums/business/AuditHistoryEnum.java b/common/src/main/java/com/ycl/common/enums/business/AuditHistoryEnum.java
new file mode 100644
index 0000000..48325f4
--- /dev/null
+++ b/common/src/main/java/com/ycl/common/enums/business/AuditHistoryEnum.java
@@ -0,0 +1,17 @@
+package com.ycl.common.enums.business;
+
+import lombok.Getter;
+
+@Getter
+public enum AuditHistoryEnum {
+ UN_READ("鏈"),
+ READ("宸茶");
+
+
+
+
+ private String desc;
+ AuditHistoryEnum(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/common/src/main/java/com/ycl/common/enums/business/AuditTypeEnum.java b/common/src/main/java/com/ycl/common/enums/business/AuditTypeEnum.java
new file mode 100644
index 0000000..6e9429c
--- /dev/null
+++ b/common/src/main/java/com/ycl/common/enums/business/AuditTypeEnum.java
@@ -0,0 +1,15 @@
+package com.ycl.common.enums.business;
+
+import lombok.Getter;
+
+@Getter
+public enum AuditTypeEnum {
+ Submit("鎻愪氦"),
+ Review("瀹℃牳"),
+ Reject("椹冲洖"),
+ Forward("杞氦");
+ private String desc;
+ AuditTypeEnum(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java b/common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java
index 41d430a..3a40beb 100644
--- a/common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java
+++ b/common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java
@@ -1,12 +1,15 @@
package com.ycl.common.enums.business;
+import lombok.Getter;
+
/**
* nongtou-project-java
*
* @author : zxl
* @date : 2025-12-05 10:50
**/
+@Getter
public enum WorkStationEnum {
COMPLETED("瀹屾垚"),
diff --git a/common/src/main/java/com/ycl/common/utils/DateUtils.java b/common/src/main/java/com/ycl/common/utils/DateUtils.java
index e6de789..8426dd7 100644
--- a/common/src/main/java/com/ycl/common/utils/DateUtils.java
+++ b/common/src/main/java/com/ycl/common/utils/DateUtils.java
@@ -5,10 +5,8 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.lang.Nullable;
@@ -38,6 +36,10 @@
private static String isHoliday = "1-1,1-28,1-29,1-30,1-31,2-1,2-2,2-3,2-4,"
+"4-4,4-5,4-6,5-1,5-2,5-3,5-4,5-5,5-31,6-1,6-2,10-1,10-2,10-3,"
+"10-4,10-5,10-6,10-7,10-8";
+
+ // 绾跨▼瀹夊叏鐨勬牸寮忓寲鍣紙鍏ㄥ眬闈欐�侊級
+ private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
/**
* 鑾峰彇涓や釜鏃堕棿鍐咃紝闄ゅ幓鍛ㄦ湯鍛ㄦ棩浠ュ強娉曞畾鑺傚亣鏃ョ殑 灏忔椂鎬绘暟銆�
@@ -309,4 +311,73 @@
LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59);
return Timestamp.valueOf(of);
}
+ /**
+ * 鑾峰彇鎸囧畾鏃堕棿鎵�鍦ㄦ湀浠界殑寮�濮嬫椂闂达紙褰撴湀1鏃� 00:00:00锛�
+ * @param date 浠绘剰鏃堕棿锛堝彲涓簄ull锛岄粯璁ゅ彇褰撳墠鏃堕棿锛�
+ * @return 褰撴湀寮�濮嬫椂闂�
+ */
+ public static Date getMonthStartTime(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ // 鑻ヤ紶鍏ユ椂闂翠负null锛屼娇鐢ㄥ綋鍓嶆椂闂�
+ if (date != null) {
+ calendar.setTime(date);
+ }
+ // 璁剧疆涓哄綋鏈�1鏃�
+ calendar.set(Calendar.DAY_OF_MONTH, 1);
+ // 璁剧疆涓�00:00:00
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0); // 姣缃�0锛岄伩鍏嶆椂闂村亸宸�
+ return calendar.getTime();
+ }
+
+ /**
+ * 鑾峰彇鎸囧畾鏃堕棿鎵�鍦ㄦ湀浠界殑缁撴潫鏃堕棿锛堝綋鏈堟渶鍚庝竴鏃� 23:59:59锛�
+ * @param date 浠绘剰鏃堕棿锛堝彲涓簄ull锛岄粯璁ゅ彇褰撳墠鏃堕棿锛�
+ * @return 褰撴湀缁撴潫鏃堕棿
+ */
+ public static Date getMonthEndTime(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ if (date != null) {
+ calendar.setTime(date);
+ }
+ // 璁剧疆涓哄綋鏈堟渶鍚庝竴澶�
+ calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+ // 璁剧疆涓�23:59:59
+ calendar.set(Calendar.HOUR_OF_DAY, 23);
+ calendar.set(Calendar.MINUTE, 59);
+ calendar.set(Calendar.SECOND, 59);
+ calendar.set(Calendar.MILLISECOND, 999); // 姣缃�999锛岃鐩栨墍鏈夋绉掓暟
+ return calendar.getTime();
+ }
+
+
+ /**
+ * 鎷嗗垎Date涓哄勾鏈堟棩鍜屾椂鍒嗗瓧绗︿覆
+ * @param date 寰呮媶鍒嗙殑Date锛堝彲涓簄ull锛�
+ * @return Map锛歬ey=date锛堝勾鏈堟棩锛夈�乼ime锛堟椂鍒嗭級锛屽�间负瀵瑰簲瀛楃涓诧紱null杩斿洖绌哄瓧绗︿覆
+ */
+ public static Map<String, String> splitDateToDateAndTime(Date date) {
+ Map<String, String> result = new HashMap<>();
+ if (date == null) {
+ result.put("date", "");
+ result.put("time", "");
+ return result;
+ }
+
+ // Date杞琇ocalDateTime锛堝鐞嗘椂鍖猴級
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(
+ date.toInstant(),
+ ZoneId.systemDefault() // 鐢ㄧ郴缁熼粯璁ゆ椂鍖猴紝閬垮厤鏃跺樊
+ );
+
+ // 鎷嗗垎骞存湀鏃ュ拰鏃跺垎
+ String dateStr = DATE_FORMATTER.format(localDateTime);
+ String timeStr = TIME_FORMATTER.format(localDateTime);
+
+ result.put("date", dateStr);
+ result.put("time", timeStr);
+ return result;
+ }
}
--
Gitblit v1.8.0