批量优化
This commit is contained in:
1 parent
438145cae7
commit
c925b198d1
50 files changed
+5716
-291
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user