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