初始
This commit is contained in:
246
third/todo/todo.go
Normal file
246
third/todo/todo.go
Normal file
@ -0,0 +1,246 @@
|
||||
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, "标记代办任务为已处理失败")
|
||||
})
|
||||
}
|
9
third/todo/todo_var.go
Normal file
9
third/todo/todo_var.go
Normal file
@ -0,0 +1,9 @@
|
||||
package todo
|
||||
|
||||
type TodoType = int
|
||||
|
||||
const (
|
||||
Reissue TodoType = iota // 补卡
|
||||
AttendanceApproval // 考勤审批
|
||||
ApprovalReminder // 请假审批
|
||||
)
|
Reference in New Issue
Block a user