247 lines
7.8 KiB
Go
247 lines
7.8 KiB
Go
|
package todo
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"strings"
|
|||
|
|
|||
|
"github.com/google/uuid"
|
|||
|
"github.com/samber/lo"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/model/do"
|
|||
|
"github.com/tiger1103/gfast/v3/third/reminders"
|
|||
|
|
|||
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
|
|||
|
"github.com/tiger1103/gfast/v3/library/liberr"
|
|||
|
)
|
|||
|
|
|||
|
type TaskGroup struct {
|
|||
|
Role int // 0 管理员 1 施工人员
|
|||
|
TsakType int // 补卡提醒
|
|||
|
ProjectID int // 项目 ID
|
|||
|
UserID string // sys.user.id 或 wx.openid
|
|||
|
MissingCardTime string // 缺卡时间
|
|||
|
}
|
|||
|
|
|||
|
// 考勤审批 struct
|
|||
|
type ReissueReminder struct {
|
|||
|
UserID string // sys.user.id 或 wx.openid
|
|||
|
Role int // 0 管理员 1 施工人员
|
|||
|
ProjectID int // 项目 ID
|
|||
|
CreatorID string // 创建人 ID
|
|||
|
TargetID int // 对应跳转的主键ID
|
|||
|
}
|
|||
|
|
|||
|
func CreateCardReminderTasks(todoList []TaskGroup) error {
|
|||
|
// 获取 OpenID 对应的 sys_user.id
|
|||
|
openIDToUserIDMap := reminders.GetUserIDByOpenIDs( // 2. 获取所有的 openid 对应的 sys_user.id
|
|||
|
lo.FilterMap(todoList, func(item TaskGroup, _ int) (string, bool) { // 1. 筛选出所有的 openid
|
|||
|
if reminders.HasLetter(item.UserID) {
|
|||
|
return item.UserID, true
|
|||
|
}
|
|||
|
return item.UserID, false
|
|||
|
}),
|
|||
|
)
|
|||
|
|
|||
|
// 替换 todoList 中的 userID
|
|||
|
for i := range todoList {
|
|||
|
if newUserID, ok := openIDToUserIDMap[todoList[i].UserID]; ok {
|
|||
|
todoList[i].UserID = newUserID
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 同一组的消息拥有相同的 UUID
|
|||
|
groupUUID := uuid.New().String()
|
|||
|
todoTasks := lo.Map(todoList, func(item TaskGroup, _ int) do.TodoTasks {
|
|||
|
return do.TodoTasks{
|
|||
|
TaskType: item.TsakType, // 补卡提醒
|
|||
|
ProjectId: item.ProjectID, // 项目 ID
|
|||
|
UserId: item.UserID, // 消息接收者的 sys_User.Id
|
|||
|
Role: item.Role,
|
|||
|
MissingCardTime: item.MissingCardTime, // 缺卡时间 示例:`03月14日 08:30上班卡;18:00下班卡`
|
|||
|
Uuid: groupUUID,
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
_, err := dao.TodoTasks.Ctx(context.Background()).Insert(todoTasks)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// CreateMissingCardReminder 创建并发布一个补卡提醒
|
|||
|
// userID: 消息接收者的 sys_user.id
|
|||
|
// role: 0:普通员工 1:管理员
|
|||
|
// projectID: 项目 ID
|
|||
|
// missingCardTime: 缺卡时间见设计图
|
|||
|
func CreateMissingCardReminder(userID string, role int, projectID int, missingCardTime string, orderId int64) error {
|
|||
|
if reminders.HasLetter(userID) {
|
|||
|
userID = reminders.GetUserIDByOpenID(userID)
|
|||
|
if userID == "" {
|
|||
|
return fmt.Errorf("未找到对应的用户")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if strings.Contains(userID, "_") {
|
|||
|
return fmt.Errorf("未找到对应的用户")
|
|||
|
}
|
|||
|
|
|||
|
// 构建消息模板
|
|||
|
task := do.TodoTasks{
|
|||
|
TaskType: Reissue, // 补卡提醒
|
|||
|
ProjectId: projectID, // 项目 ID
|
|||
|
UserId: userID, // 消息接收者的 sys_User.Id
|
|||
|
Role: role,
|
|||
|
OrderId: orderId,
|
|||
|
MissingCardTime: missingCardTime, // 缺卡时间 示例:`03月14日 08:30上班卡;18:00下班卡`
|
|||
|
}
|
|||
|
|
|||
|
// 发布提醒
|
|||
|
_, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// CreateAttendanceApprovalReminder 发布一条考勤审批提醒
|
|||
|
// projectID: 项目 ID
|
|||
|
// userID: 消息接收者的 sys_user.id
|
|||
|
// creatorID:创建人 ID
|
|||
|
// targetID: 对应跳转的主键ID
|
|||
|
func CreateAttendanceApprovalReminder(userID string, projectID int, creatorID string, targetID int) error {
|
|||
|
if reminders.HasLetter(creatorID) || reminders.HasLetter(userID) {
|
|||
|
if creatorID == userID {
|
|||
|
creatorID = reminders.GetUserIDByOpenID(creatorID)
|
|||
|
userID = creatorID
|
|||
|
} else {
|
|||
|
if reminders.HasLetter(creatorID) {
|
|||
|
creatorID = reminders.GetUserIDByOpenID(creatorID)
|
|||
|
}
|
|||
|
if reminders.HasLetter(userID) {
|
|||
|
userID = reminders.GetUserIDByOpenID(userID)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if creatorID == "" || userID == "" {
|
|||
|
return fmt.Errorf("未找到对应的用户")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 构建消息模板
|
|||
|
task := do.TodoTasks{
|
|||
|
TaskType: AttendanceApproval, // 考勤审批提醒
|
|||
|
ProjectId: projectID, // 项目 ID
|
|||
|
UserId: userID, // 消息接收者的 sys_User.Id
|
|||
|
Applicant: creatorID, // 创建人ID
|
|||
|
OrderId: targetID, // 对应跳转的主键ID
|
|||
|
Status: 0,
|
|||
|
}
|
|||
|
|
|||
|
// 发布提醒
|
|||
|
_, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// CreateAskForLeaveReminder 发布一条请假审批提醒
|
|||
|
// userID: 消息接收者的 sys_user.id
|
|||
|
// projectID: 项目 ID
|
|||
|
// creatorID:创建人 ID
|
|||
|
// targetID: 对应跳转的主键ID
|
|||
|
func CreateAskForLeaveReminder(userID string, projectID int, creatorID string, targetID int) error {
|
|||
|
if reminders.HasLetter(creatorID) || reminders.HasLetter(userID) {
|
|||
|
if creatorID == userID {
|
|||
|
creatorID = reminders.GetUserIDByOpenID(creatorID)
|
|||
|
userID = creatorID
|
|||
|
} else {
|
|||
|
if reminders.HasLetter(creatorID) {
|
|||
|
creatorID = reminders.GetUserIDByOpenID(creatorID)
|
|||
|
}
|
|||
|
if reminders.HasLetter(userID) {
|
|||
|
userID = reminders.GetUserIDByOpenID(userID)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if creatorID == "" || userID == "" {
|
|||
|
return fmt.Errorf("未找到对应的用户")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 构建消息模板
|
|||
|
task := do.TodoTasks{
|
|||
|
TaskType: ApprovalReminder, // 请假审批提醒
|
|||
|
UserId: userID, // 消息接收者的 sys_User.Id
|
|||
|
ProjectId: projectID, // 项目 ID
|
|||
|
Applicant: creatorID, // 创建人ID
|
|||
|
OrderId: targetID, // 对应跳转的主键ID
|
|||
|
Status: 0, // 未处理
|
|||
|
Role: "1", // 发送给施工人员
|
|||
|
}
|
|||
|
|
|||
|
// 发布提醒
|
|||
|
_, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
func CreateAttendanceApprovalGroup(list []ReissueReminder, num int) error {
|
|||
|
UserIDs := lo.FilterMap(list, func(item ReissueReminder, _ int) (string, bool) {
|
|||
|
if reminders.HasLetter(item.UserID) {
|
|||
|
return item.UserID, true
|
|||
|
}
|
|||
|
return item.UserID, false
|
|||
|
})
|
|||
|
|
|||
|
CreatorIDs := lo.FilterMap(list, func(item ReissueReminder, _ int) (string, bool) {
|
|||
|
if reminders.HasLetter(item.CreatorID) {
|
|||
|
return item.CreatorID, true
|
|||
|
}
|
|||
|
|
|||
|
return item.CreatorID, false
|
|||
|
})
|
|||
|
|
|||
|
// 获取 OpenID 对应的 sys_user.id
|
|||
|
openIDToUserIDMap := reminders.GetUserIDByOpenIDs(append(UserIDs, CreatorIDs...))
|
|||
|
// 替换 todoList 中的 userID
|
|||
|
for i := range list {
|
|||
|
if newUserID, ok := openIDToUserIDMap[list[i].UserID]; ok {
|
|||
|
list[i].UserID = newUserID
|
|||
|
}
|
|||
|
|
|||
|
if newUserID, ok := openIDToUserIDMap[list[i].CreatorID]; ok {
|
|||
|
list[i].CreatorID = newUserID
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 同一组的消息拥有相同的 UUID
|
|||
|
groupUUID := uuid.New().String()
|
|||
|
todoTasks := lo.Map(list, func(item ReissueReminder, _ int) do.TodoTasks {
|
|||
|
return do.TodoTasks{
|
|||
|
TaskType: num, // 考勤审批提醒
|
|||
|
ProjectId: item.ProjectID, // 项目 ID
|
|||
|
UserId: item.UserID, // 消息接收者的 sys_User.Id
|
|||
|
Applicant: item.CreatorID, // 创建人ID
|
|||
|
OrderId: item.TargetID, // 对应跳转的主键ID
|
|||
|
Role: item.Role,
|
|||
|
Uuid: groupUUID,
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
_, err := dao.TodoTasks.Ctx(context.Background()).Insert(todoTasks)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// MarkTaskAsProcessed 标记特定的待办任务为已处理
|
|||
|
// 每个待办任务都与一个 OrderID 关联,可以通过 OrderID 查找任务详情
|
|||
|
// 用户完成补卡或审批操作后,应将相应的待办任务标记为已处理
|
|||
|
func MarkTaskAsProcessed(taskID int) error {
|
|||
|
return g.Try(context.Background(), func(ctx context.Context) {
|
|||
|
_, err := dao.TodoTasks.Ctx(ctx).Where("order_id", taskID).Update(g.Map{"status": 1})
|
|||
|
liberr.ErrIsNil(ctx, err, "标记代办任务为已处理失败")
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// 根据 uuid 将一组待办任务标记为已处理
|
|||
|
func MarkTasksAsProcessedByUUID(id int64) error {
|
|||
|
return g.Try(context.Background(), func(ctx context.Context) {
|
|||
|
value, err2 := dao.TodoTasks.Ctx(ctx).Where("order_id", id).Where("status", 0).Limit(1).Fields("uuid").Value()
|
|||
|
liberr.ErrIsNil(ctx, err2)
|
|||
|
_, err := dao.TodoTasks.Ctx(ctx).Where("uuid", value.String()).Update(g.Map{"status": 1})
|
|||
|
liberr.ErrIsNil(ctx, err, "标记代办任务为已处理失败")
|
|||
|
})
|
|||
|
}
|