批量优化

This commit is contained in:
hero920103 committed 2026-10-08 15:30:37 +08:00
1 parent 438145cae7
commit c925b198d1
50 files changed
+5716 -291

No files matched your search

+56 -1
View File
@@ -386,6 +386,61 @@ func resolveApprovers(scope int8, node Node, in SubmitInput) ([]Approver, error)
return nil, nil
}
// resolveNotifyTargets 解析通知节点的通知对象(支持多类型)。
// approver_ids 兼容两种存储格式:
// 1. 旧格式:纯数字 CSV —— 单类型,配合 node.ApproverType(历史数据);
// 2. 多选格式:"类型:ID" CSV(如 "1:52,5:0")—— 类型取值同 approver_type,
// 自动定位类型(5发起人本人 / 6发起人主管)无需指定对象,ID 占位 0。
// 各类型的解析结果按 ID 去重合并。
func resolveNotifyTargets(scope int8, node Node, in SubmitInput) ([]Approver, error) {
if !strings.Contains(node.ApproverIDs, ":") {
return resolveApprovers(scope, node, in)
}
typeOrder := make([]int8, 0, 4)
idsByType := make(map[int8][]uint64)
for _, part := range strings.Split(node.ApproverIDs, ",") {
part = strings.TrimSpace(part)
if part == "" {
continue
}
kv := strings.SplitN(part, ":", 2)
t, err := strconv.Atoi(strings.TrimSpace(kv[0]))
if err != nil || t < int(models.ApprovalApproverUser) || t > int(models.ApprovalApproverInitLeader) {
continue
}
at := int8(t)
if _, ok := idsByType[at]; !ok {
typeOrder = append(typeOrder, at)
}
if len(kv) == 2 {
if id, err := strconv.ParseUint(strings.TrimSpace(kv[1]), 10, 64); err == nil && id > 0 {
idsByType[at] = append(idsByType[at], id)
}
}
}
merged := make([]Approver, 0, 8)
for _, t := range typeOrder {
sub := Node{ApproverType: t, ApproverIDs: joinApproverIDs(idsByType[t])}
approvers, err := resolveApprovers(scope, sub, in)
if err != nil {
return nil, err
}
merged = append(merged, approvers...)
}
return dedupeApprovers(merged), nil
}
// joinApproverIDs 把 ID 列表拼成 CSV(与 parseIDs 互逆)
func joinApproverIDs(ids []uint64) string {
parts := make([]string, 0, len(ids))
for _, id := range ids {
if id > 0 {
parts = append(parts, strconv.FormatUint(id, 10))
}
}
return strings.Join(parts, ",")
}
// tenantUsers 按 uid 取租户用户
func tenantUsers(tid uint64, uids []uint64) []Approver {
if len(uids) == 0 {
@@ -895,7 +950,7 @@ func createTasks(instID uint64, in SubmitInput, node Node, approvers []Approver)
// fireNotifyTasks 为通知节点创建已读通知任务(不阻塞流程)
func fireNotifyTasks(instID uint64, in SubmitInput, notifyNode *Node) {
recipients, _ := resolveApprovers(in.Scope, *notifyNode, in)
recipients, _ := resolveNotifyTargets(in.Scope, *notifyNode, in)
recipients = dedupeApprovers(recipients)
if len(recipients) == 0 {
return