diff --git a/ZENTAO_INTEGRATION.md b/ZENTAO_INTEGRATION.md
new file mode 100644
index 0000000..0cbd0d7
--- /dev/null
+++ b/ZENTAO_INTEGRATION.md
@@ -0,0 +1,133 @@
+# 禅道集成功能说明
+
+## 功能概述
+
+本系统已集成禅道开源版20.8的API,可以自动查询项目中的未完成任务,并通过企业微信发送详细的任务提醒,支持@相关负责人。
+
+## 配置说明
+
+### 1. 禅道配置
+
+在 `application.yml` 中配置禅道相关信息:
+
+```yaml
+task:
+ reminder:
+ groups:
+ - id: "zentao-team"
+ name: "禅道开发团队"
+ webhook:
+ url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-webhook-key"
+ task-system: "zentao" # 必须设置为 zentao
+ # 禅道配置
+ zentao:
+ api-url: "https://zentao.iscmtech.com" # 禅道地址
+ username: "your-username" # 禅道用户名
+ password: "your-password" # 禅道密码
+ project-id: 26 # 项目ID
+ # 用户映射:禅道邮箱 -> 企业微信手机号
+ user-mapping:
+ "liguiling@iscmtech.com": "13800138000"
+ "zhongweiyue@iscmtech.com": "13900139000"
+ "meya@iscmtech.com": "13700137000"
+ schedules:
+ morning:
+ time: "0 0 9 * * MON-FRI"
+ message: "早上好!请及时更新禅道任务状态"
+ evening:
+ time: "0 30 17 * * MON-FRI"
+ message: "下班前提醒:请更新今日任务完成情况"
+ enabled: true
+```
+
+### 2. 用户映射配置
+
+用户映射支持两种方式:
+
+#### 方式一:邮箱映射(推荐)
+```yaml
+user-mapping:
+ "user@iscmtech.com": "13800138000" # 禅道用户邮箱 -> 手机号
+```
+
+#### 方式二:用户名映射
+```yaml
+user-mapping:
+ "zhangsan": "13900139000" # 禅道用户名 -> 手机号
+```
+
+### 3. 企业微信@人格式
+
+- 手机号:`13800138000`(系统会自动添加@前缀)
+- @所有人:`all`(系统会转换为@all)
+
+## API接口
+
+### 测试禅道连接
+```
+GET /api/reminder/zentao/test/{groupId}
+```
+
+### 手动触发禅道任务提醒
+```
+POST /api/reminder/zentao/reminder/{groupId}
+```
+
+### 手动触发指定群组提醒
+```
+POST /api/reminder/groups/{groupId}/morning
+POST /api/reminder/groups/{groupId}/evening
+```
+
+## 消息格式
+
+系统会发送包含以下信息的详细任务提醒:
+
+- 📊 任务统计(总数、过期数、涉及人员)
+- 👥 按人员分组的任务列表
+- 🔴 过期任务标识
+- 🟡 进行中任务标识
+- ⚪ 其他状态任务标识
+- 📋 任务优先级和截止日期
+- 🔗 禅道系统访问链接
+
+## 使用步骤
+
+1. **配置禅道信息**:在配置文件中填入正确的禅道地址、用户名、密码和项目ID
+2. **配置用户映射**:将团队成员的禅道邮箱映射到企业微信手机号
+3. **测试连接**:调用测试API确认禅道连接正常
+4. **启用定时任务**:系统会按配置的时间自动发送提醒
+
+## 注意事项
+
+1. **禅道版本**:目前支持禅道开源版20.8
+2. **API认证**:使用用户名密码方式认证
+3. **项目权限**:配置的禅道用户需要有项目访问权限
+4. **网络连接**:确保服务器能访问禅道系统
+5. **手机号格式**:必须是11位中国大陆手机号
+
+## 故障排查
+
+### 1. 禅道连接失败
+- 检查禅道地址是否正确
+- 检查用户名密码是否正确
+- 检查网络连接是否正常
+
+### 2. 无法获取任务
+- 检查项目ID是否正确
+- 检查用户是否有项目访问权限
+- 查看日志中的详细错误信息
+
+### 3. @人不生效
+- 检查用户映射配置是否正确
+- 确认手机号格式是否正确
+- 确认企业微信群中是否有对应用户
+
+## 开发说明
+
+相关代码文件:
+- `ZentaoApiService.java` - 禅道API调用服务
+- `ZentaoTaskReminderService.java` - 禅道任务提醒服务
+- `UserMappingService.java` - 用户映射服务
+- `ZentaoTask.java` - 禅道任务实体类
+- `ZentaoUser.java` - 禅道用户实体类
diff --git a/pom.xml b/pom.xml
index 150c335..70f52c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,6 +65,14 @@
org.springframework.boot
spring-boot-starter-logging
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+ true
+
diff --git a/src/main/java/com/zeodao/reminder/config/TaskReminderConfig.java b/src/main/java/com/zeodao/reminder/config/TaskReminderConfig.java
index e991e3b..e7b5a37 100644
--- a/src/main/java/com/zeodao/reminder/config/TaskReminderConfig.java
+++ b/src/main/java/com/zeodao/reminder/config/TaskReminderConfig.java
@@ -10,7 +10,7 @@ import java.util.Map;
/**
* 多群任务提醒配置类
- *
+ *
* @author Zeodao
* @version 2.0.0
*/
@@ -75,6 +75,8 @@ public class TaskReminderConfig {
private String taskSystem;
private Map schedules = new HashMap<>();
private boolean enabled = true;
+ private Zentao zentao = new Zentao();
+ private Map userMapping = new HashMap<>();
public String getId() {
return id;
@@ -123,6 +125,22 @@ public class TaskReminderConfig {
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
+
+ public Zentao getZentao() {
+ return zentao;
+ }
+
+ public void setZentao(Zentao zentao) {
+ this.zentao = zentao;
+ }
+
+ public Map getUserMapping() {
+ return userMapping;
+ }
+
+ public void setUserMapping(Map userMapping) {
+ this.userMapping = userMapping;
+ }
}
public static class Webhook {
@@ -157,4 +175,61 @@ public class TaskReminderConfig {
this.message = message;
}
}
+
+ public static class Zentao {
+ private String apiUrl;
+ private String token;
+ private String username;
+ private String password;
+ private Integer projectId;
+ private Integer kanbanId;
+
+ public String getApiUrl() {
+ return apiUrl;
+ }
+
+ public void setApiUrl(String apiUrl) {
+ this.apiUrl = apiUrl;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Integer getProjectId() {
+ return projectId;
+ }
+
+ public void setProjectId(Integer projectId) {
+ this.projectId = projectId;
+ }
+
+ public Integer getKanbanId() {
+ return kanbanId;
+ }
+
+ public void setKanbanId(Integer kanbanId) {
+ this.kanbanId = kanbanId;
+ }
+ }
}
diff --git a/src/main/java/com/zeodao/reminder/controller/TaskReminderController.java b/src/main/java/com/zeodao/reminder/controller/TaskReminderController.java
index 12720f4..329e84f 100644
--- a/src/main/java/com/zeodao/reminder/controller/TaskReminderController.java
+++ b/src/main/java/com/zeodao/reminder/controller/TaskReminderController.java
@@ -1,8 +1,10 @@
package com.zeodao.reminder.controller;
import com.zeodao.reminder.config.TaskReminderConfig;
+import com.zeodao.reminder.model.ZentaoTask;
import com.zeodao.reminder.scheduler.DynamicTaskScheduler;
import com.zeodao.reminder.service.TaskReminderService;
+import com.zeodao.reminder.service.ZentaoTaskReminderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +37,9 @@ public class TaskReminderController {
@Autowired
private DynamicTaskScheduler dynamicTaskScheduler;
+ @Autowired
+ private ZentaoTaskReminderService zentaoTaskReminderService;
+
/**
* 系统健康检查
*/
@@ -197,4 +202,72 @@ public class TaskReminderController {
return ResponseEntity.ok(response);
}
+
+ /**
+ * 测试禅道API连接
+ */
+ @GetMapping("/zentao/test/{groupId}")
+ public ResponseEntity