批量优化
This commit is contained in:
1 parent
438145cae7
commit
c925b198d1
50 files changed
+5716
-291
No files matched your search
@@ -122,12 +122,23 @@ func tenantFlowToView(f models.TenantApprovalFlow) approvalFlowView {
|
||||
}
|
||||
edgeNodes := make([]flowEdgeNode, 0, len(nodes))
|
||||
for _, n := range nodes {
|
||||
approverIDs := parseIDSlice(n.ApproverIDs)
|
||||
// 通知节点多类型格式:"类型:ID" CSV,原样下发给前端回显
|
||||
var notifyTargets []string
|
||||
if n.NodeType == models.ApprovalNodeNotify && strings.Contains(n.ApproverIDs, ":") {
|
||||
for _, part := range strings.Split(n.ApproverIDs, ",") {
|
||||
if trimmed := strings.TrimSpace(part); trimmed != "" {
|
||||
notifyTargets = append(notifyTargets, trimmed)
|
||||
}
|
||||
}
|
||||
}
|
||||
view.Nodes = append(view.Nodes, approvalNodePayload{
|
||||
NodeKey: n.NodeKey,
|
||||
NodeName: n.NodeName,
|
||||
NodeType: n.NodeType,
|
||||
ApproverType: n.ApproverType,
|
||||
ApproverIDs: parseIDSlice(n.ApproverIDs),
|
||||
ApproverIDs: approverIDs,
|
||||
NotifyTargets: notifyTargets,
|
||||
MultiMode: n.MultiMode,
|
||||
AllowReturn: n.AllowReturn,
|
||||
TimeoutHours: n.TimeoutHours,
|
||||
@@ -273,6 +284,11 @@ func (c *BackendApprovalController) FlowSave() {
|
||||
if timeout <= 0 {
|
||||
timeout = 48
|
||||
}
|
||||
// 通知节点多类型:以 "类型:ID" CSV 落库到 approver_ids,引擎按类型分组解析
|
||||
approverCSV := joinIDs(nd.ApproverIDs)
|
||||
if nodeType == models.ApprovalNodeNotify && len(nd.NotifyTargets) > 0 {
|
||||
approverCSV = strings.Join(nd.NotifyTargets, ",")
|
||||
}
|
||||
node := models.TenantApprovalNode{
|
||||
FlowID: flowID,
|
||||
Tid: tid,
|
||||
@@ -280,7 +296,7 @@ func (c *BackendApprovalController) FlowSave() {
|
||||
NodeName: strings.TrimSpace(nd.NodeName),
|
||||
NodeType: nodeType,
|
||||
ApproverType: nd.ApproverType,
|
||||
ApproverIDs: joinIDs(nd.ApproverIDs),
|
||||
ApproverIDs: approverCSV,
|
||||
MultiMode: multi,
|
||||
AllowReturn: nd.AllowReturn,
|
||||
TimeoutHours: timeout,
|
||||
@@ -505,6 +521,26 @@ func validateTenantApprovalNodes(nodes []approvalNodePayload) error {
|
||||
if strings.TrimSpace(nd.NodeName) == "" {
|
||||
return fmt.Errorf("第 %d 个节点名称不能为空", i+1)
|
||||
}
|
||||
// 通知节点多类型格式:校验每条 "类型:ID",自动定位类型(5/6)无需对象
|
||||
if nd.NodeType == models.ApprovalNodeNotify && len(nd.NotifyTargets) > 0 {
|
||||
for _, tg := range nd.NotifyTargets {
|
||||
kv := strings.SplitN(strings.TrimSpace(tg), ":", 2)
|
||||
if len(kv) != 2 {
|
||||
return fmt.Errorf("节点「%s」通知对象格式非法", nd.NodeName)
|
||||
}
|
||||
t, err := strconv.Atoi(strings.TrimSpace(kv[0]))
|
||||
if err != nil || t < int(models.ApprovalApproverUser) || t > int(models.ApprovalApproverInitLeader) {
|
||||
return fmt.Errorf("节点「%s」通知类型非法", nd.NodeName)
|
||||
}
|
||||
if t != int(models.ApprovalApproverInitiator) && t != int(models.ApprovalApproverInitLeader) {
|
||||
id, err := strconv.ParseUint(strings.TrimSpace(kv[1]), 10, 64)
|
||||
if err != nil || id == 0 {
|
||||
return fmt.Errorf("节点「%s」未选择通知对象", nd.NodeName)
|
||||
}
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
if nd.ApproverType < models.ApprovalApproverUser || nd.ApproverType > models.ApprovalApproverInitLeader {
|
||||
return fmt.Errorf("节点「%s」审批人类型非法", nd.NodeName)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user