init: 条件流引擎初始提交
This commit is contained in:
@@ -0,0 +1,591 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.fsdpf.net/go/condflow"
|
||||
"git.fsdpf.net/go/condflow/tests/fixtures"
|
||||
"git.fsdpf.net/go/condition"
|
||||
"git.fsdpf.net/go/contracts/base"
|
||||
"git.fsdpf.net/go/reflux"
|
||||
"git.fsdpf.net/go/reflux/fieldx"
|
||||
"git.fsdpf.net/go/req"
|
||||
"git.fsdpf.net/go/req/resx"
|
||||
"github.com/samber/do/v2"
|
||||
)
|
||||
|
||||
// setupExampleExecutor 创建并注册示例 executor
|
||||
func setupExampleExecutor(app do.Injector) {
|
||||
// 创建 resource
|
||||
exampleRes := resx.New(app, "Example", "examples",
|
||||
resx.WithUuid("660e8400-e29b-41d4-a716-446655440002"),
|
||||
resx.WithName("示例"),
|
||||
resx.WithFields(
|
||||
resx.NewResField("id", "", resx.FieldWithName("ID"), resx.FieldWithDataType(req.ResInteger)),
|
||||
resx.NewResField("created_user", "", resx.FieldWithName("创建者"), resx.FieldWithDefault("00000000-0000-0000-0000-000000000000"), resx.FieldWithDataType(req.ResString)),
|
||||
resx.NewResField("owned_user", "", resx.FieldWithName("拥有者"), resx.FieldWithDefault("00000000-0000-0000-0000-000000000000"), resx.FieldWithDataType(req.ResString)),
|
||||
resx.NewResField("created_at", "", resx.FieldWithName("创建时间"), resx.FieldWithDefault("sql:CURRENT_TIMESTAMP"), resx.FieldWithDataType(req.ResTimestamp)),
|
||||
resx.NewResField("updated_at", "", resx.FieldWithName("更新时间"), resx.FieldWithDefault("sql:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), resx.FieldWithDataType(req.ResTimestamp)),
|
||||
resx.NewResField("uuid", "", resx.FieldWithName("UUID"), resx.FieldWithDefault("sql:uuid()"), resx.FieldWithDataType(req.ResString)),
|
||||
resx.NewResField("status", "", resx.FieldWithName("状态"), resx.FieldWithDefault("pending"), resx.FieldWithDataType(req.ResString)),
|
||||
resx.NewResField("type", "", resx.FieldWithName("类型"), resx.FieldWithDataType(req.ResString)),
|
||||
resx.NewResField("data", "", resx.FieldWithName("数据"), resx.FieldWithDefault("{}"), resx.FieldWithDataType(req.ResJson)),
|
||||
),
|
||||
)
|
||||
|
||||
executor := condflow.NewActionInvoker(fixtures.NewExampleExecutor(exampleRes), nil)
|
||||
|
||||
do.ProvideNamedValue(app, fmt.Sprintf("%s/ExampleExecutor", executor.Res().GetCode()), executor)
|
||||
}
|
||||
|
||||
// Example_userApprovalFlow 用户审批流示例
|
||||
func Example_userApprovalFlow() {
|
||||
// 初始化 DI 容器并注册 executor
|
||||
app := do.New()
|
||||
setupExampleExecutor(app)
|
||||
|
||||
// 创建条件流
|
||||
flow := condflow.New("user-approval-flow")
|
||||
|
||||
// Case 1: 金额 <= 1000,自动通过
|
||||
case1Cond := condition.New(condition.Describe("小额自动审批"))
|
||||
case1Cond.SetExpr(condition.NewExpr("@", "amount", condition.Operator(condition.LE), condition.Token("1000", condition.STRING)))
|
||||
|
||||
case1Config, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"notify": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"message": map[string]any{
|
||||
"type": "string",
|
||||
"value": "申请已自动通过",
|
||||
},
|
||||
})
|
||||
|
||||
case1 := condflow.NewCondCase(
|
||||
"auto-approve-small",
|
||||
case1Cond,
|
||||
"Example/ExampleExecutor@AutoApprove",
|
||||
).
|
||||
WithPriority(100).
|
||||
WithActionConfig(case1Config)
|
||||
|
||||
// Case 2: 1000 < 金额 <= 10000,需要经理审批
|
||||
case2Cond := condition.New(condition.Describe("经理审批"))
|
||||
case2Cond.SetExpr(condition.NewExpr("@", "amount", condition.Operator(condition.GT), condition.Token("1000", condition.STRING))).
|
||||
SetExpr(condition.NewExpr("@", "amount", condition.Operator(condition.LE), condition.Token("10000", condition.STRING)))
|
||||
|
||||
case2Config, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"approver_role": map[string]any{
|
||||
"type": "string",
|
||||
"value": "manager",
|
||||
},
|
||||
"timeout_hours": map[string]any{
|
||||
"type": "string",
|
||||
"value": "24",
|
||||
},
|
||||
"notify": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
case2 := condflow.NewCondCase(
|
||||
"manager-approval",
|
||||
case2Cond,
|
||||
"Example/ExampleExecutor@ManagerApproval",
|
||||
).
|
||||
WithPriority(90).
|
||||
WithActionConfig(case2Config)
|
||||
|
||||
// Case 3: 金额 > 10000,需要总监审批
|
||||
case3Cond := condition.New(condition.Describe("总监审批"))
|
||||
case3Cond.SetExpr(condition.NewExpr("@", "amount", condition.Operator(condition.GT), condition.Token("10000", condition.STRING)))
|
||||
|
||||
case3Config, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"approver_role": map[string]any{
|
||||
"type": "string",
|
||||
"value": "director",
|
||||
},
|
||||
"timeout_hours": map[string]any{
|
||||
"type": "string",
|
||||
"value": "48",
|
||||
},
|
||||
"notify": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"cc_roles": map[string]any{
|
||||
"type": "string",
|
||||
"value": "manager,ceo",
|
||||
},
|
||||
})
|
||||
|
||||
case3 := condflow.NewCondCase(
|
||||
"director-approval",
|
||||
case3Cond,
|
||||
"Example/ExampleExecutor@DirectorApproval",
|
||||
).
|
||||
WithPriority(80).
|
||||
WithActionConfig(case3Config)
|
||||
|
||||
// Case 4: 用户信用评分 < 60,直接拒绝
|
||||
case4Cond := condition.New(condition.Describe("信用不足拒绝"))
|
||||
case4Cond.SetExpr(condition.NewExpr("@", "user->>'credit_score'", condition.Operator(condition.LT), condition.Token("60", condition.STRING)))
|
||||
|
||||
case4Config, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"reason": map[string]any{
|
||||
"type": "string",
|
||||
"value": "信用评分不足",
|
||||
},
|
||||
"notify": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"suggest_retry": map[string]any{
|
||||
"type": "string",
|
||||
"value": "false",
|
||||
},
|
||||
})
|
||||
|
||||
case4 := condflow.NewCondCase(
|
||||
"reject-low-credit",
|
||||
case4Cond,
|
||||
"Example/ExampleExecutor@Reject",
|
||||
).
|
||||
WithPriority(200). // 最高优先级,优先检查
|
||||
WithActionConfig(case4Config)
|
||||
|
||||
// 添加所有条件分支到流程
|
||||
flow.AddCase(case4). // 优先级最高
|
||||
AddCase(case1).
|
||||
AddCase(case2).
|
||||
AddCase(case3)
|
||||
|
||||
// 生成包含多种数据类型的测试 map
|
||||
input := reflux.New(map[string]any{
|
||||
// 基础类型
|
||||
"amount": 5000.50, // float64
|
||||
"count": 100, // int
|
||||
"active": true, // bool
|
||||
"user_name": "张三", // string
|
||||
"age": int32(25), // int32
|
||||
"total": int64(1000000), // int64
|
||||
"score": float32(98.5), // float32
|
||||
"is_vip": false, // bool
|
||||
|
||||
// 数组/切片类型
|
||||
"tags": []string{"vip", "premium", "active"}, // slice
|
||||
"scores": []int{85, 90, 95}, // slice of int
|
||||
"prices": []float64{19.99, 29.99, 39.99}, // slice of float
|
||||
|
||||
// Map 类型
|
||||
"preferences": map[string]any{
|
||||
"newsletter": true,
|
||||
"theme": "dark",
|
||||
"language": "zh-CN",
|
||||
},
|
||||
|
||||
// 嵌套结构
|
||||
"user": map[string]any{
|
||||
"id": 12345,
|
||||
"email": "user@example.com",
|
||||
"level": 5,
|
||||
"credit_score": 85,
|
||||
"created_at": "2024-01-01",
|
||||
},
|
||||
|
||||
// 空值测试
|
||||
"nullable_field": nil,
|
||||
"empty_string": "",
|
||||
})
|
||||
|
||||
flow.Run(app, input, base.GetSystemUser())
|
||||
|
||||
fmt.Printf("条件流名称: %s\n", flow.Name())
|
||||
fmt.Printf("条件分支数量: %d\n", flow.CaseCount())
|
||||
|
||||
// Output:
|
||||
// 条件流名称: user-approval-flow
|
||||
// 条件分支数量: 4
|
||||
}
|
||||
|
||||
// Example_emailCampaignFlow 邮件营销活动流示例
|
||||
func Example_emailCampaignFlow() {
|
||||
// 初始化 DI 容器并注册 executor
|
||||
app := do.New()
|
||||
setupExampleExecutor(app)
|
||||
|
||||
// 创建邮件营销条件流
|
||||
flow := condflow.New("email-campaign-flow")
|
||||
|
||||
// Case 1: VIP 用户 - 发送专属优惠
|
||||
vipCond := condition.New(condition.Describe("VIP用户筛选"))
|
||||
vipCond.SetExpr(condition.NewExpr("User", "level", condition.Operator(condition.GE), condition.Token("5", condition.STRING))).
|
||||
SetExpr(condition.NewExpr("User", "email", condition.Operator(condition.IS_NOT_NULL))).
|
||||
SetExpr(condition.NewExpr("User", "preferences->'newsletter'", condition.Token("true", condition.STRING))).
|
||||
SetExpr(condition.NewExpr("User", "tags", condition.FieldSqlFn("json_contains", ""), condition.Token("vip", condition.STRING)))
|
||||
|
||||
vipConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"template": map[string]any{
|
||||
"type": "string",
|
||||
"value": "vip-exclusive-offer",
|
||||
},
|
||||
"subject": map[string]any{
|
||||
"type": "string",
|
||||
"value": "尊贵的VIP会员,专属优惠来啦!",
|
||||
},
|
||||
"discount": map[string]any{
|
||||
"type": "string",
|
||||
"value": "30",
|
||||
},
|
||||
"valid_days": map[string]any{
|
||||
"type": "string",
|
||||
"value": "30",
|
||||
},
|
||||
"priority": map[string]any{
|
||||
"type": "string",
|
||||
"value": "high",
|
||||
},
|
||||
"attachments": map[string]any{
|
||||
"type": "string",
|
||||
"value": "vip-catalog.pdf",
|
||||
},
|
||||
})
|
||||
|
||||
vipCase := condflow.NewCondCase("vip-campaign", vipCond, "Example/ExampleExecutor@VIPEmail").
|
||||
WithPriority(100).
|
||||
WithActionConfig(vipConfig)
|
||||
|
||||
// Case 2: 新用户 - 发送欢迎邮件
|
||||
newUserCond := condition.New(condition.Describe("新用户识别"))
|
||||
newUserCond.SetExpr(condition.NewExpr("User", "created_at", condition.Operator(condition.GE), condition.Token("DATE_SUB(NOW(), INTERVAL 7 DAY)", condition.SQL))).
|
||||
SetExpr(condition.NewExpr("User", "email_verified", condition.Token("true", condition.STRING)))
|
||||
|
||||
newUserConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"template": map[string]any{
|
||||
"type": "string",
|
||||
"value": "welcome-new-user",
|
||||
},
|
||||
"subject": map[string]any{
|
||||
"type": "string",
|
||||
"value": "欢迎加入我们!",
|
||||
},
|
||||
"coupon_code": map[string]any{
|
||||
"type": "string",
|
||||
"value": "WELCOME2024",
|
||||
},
|
||||
"discount": map[string]any{
|
||||
"type": "string",
|
||||
"value": "10",
|
||||
},
|
||||
"trigger_delay": map[string]any{
|
||||
"type": "string",
|
||||
"value": "1h",
|
||||
},
|
||||
})
|
||||
|
||||
newUserCase := condflow.NewCondCase("new-user-welcome", newUserCond, "Example/ExampleExecutor@WelcomeEmail").
|
||||
WithPriority(90).
|
||||
WithActionConfig(newUserConfig)
|
||||
|
||||
// Case 3: 普通活跃用户 - 发送常规营销邮件
|
||||
regularCond := condition.New(condition.Describe("活跃普通用户"))
|
||||
regularCond.SetExpr(condition.NewExpr("User", "last_login_at", condition.Operator(condition.GE), condition.Token("DATE_SUB(NOW(), INTERVAL 30 DAY)", condition.SQL))).
|
||||
SetExpr(condition.NewExpr("User", "email", condition.Operator(condition.IS_NOT_NULL))).
|
||||
SetExpr(condition.NewExpr("User", "preferences->'newsletter'", condition.Token("true", condition.STRING)))
|
||||
|
||||
regularConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"template": map[string]any{
|
||||
"type": "string",
|
||||
"value": "regular-promotion",
|
||||
},
|
||||
"subject": map[string]any{
|
||||
"type": "string",
|
||||
"value": "本月精选优惠",
|
||||
},
|
||||
"discount": map[string]any{
|
||||
"type": "string",
|
||||
"value": "15",
|
||||
},
|
||||
"valid_days": map[string]any{
|
||||
"type": "string",
|
||||
"value": "14",
|
||||
},
|
||||
})
|
||||
|
||||
regularCase := condflow.NewCondCase("regular-campaign", regularCond, "Example/ExampleExecutor@RegularEmail").
|
||||
WithPriority(50).
|
||||
WithActionConfig(regularConfig)
|
||||
|
||||
// Case 4: 未订阅用户 - 跳过
|
||||
skipCond := condition.New(condition.Describe("未订阅用户"))
|
||||
skipCond.SetExpr(condition.NewExpr("User", "preferences->'newsletter'", condition.Token("false", condition.STRING)))
|
||||
|
||||
skipConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"reason": map[string]any{
|
||||
"type": "string",
|
||||
"value": "用户未订阅营销邮件",
|
||||
},
|
||||
"log": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
skipCase := condflow.NewCondCase("skip-unsubscribed", skipCond, "Example/ExampleExecutor@Skip").
|
||||
WithPriority(200). // 最高优先级
|
||||
WithActionConfig(skipConfig)
|
||||
|
||||
// 添加所有条件分支
|
||||
flow.AddCase(skipCase).
|
||||
AddCase(vipCase).
|
||||
AddCase(newUserCase).
|
||||
AddCase(regularCase)
|
||||
|
||||
fmt.Printf("条件流名称: %s\n", flow.Name())
|
||||
fmt.Printf("条件分支数量: %d\n", flow.CaseCount())
|
||||
|
||||
// Output:
|
||||
// 条件流名称: email-campaign-flow
|
||||
// 条件分支数量: 4
|
||||
}
|
||||
|
||||
// Example_orderProcessingFlow 订单处理流示例
|
||||
func Example_orderProcessingFlow() {
|
||||
// 初始化 DI 容器并注册 executor
|
||||
app := do.New()
|
||||
setupExampleExecutor(app)
|
||||
|
||||
// 创建订单处理条件流
|
||||
flow := condflow.New("order-processing-flow")
|
||||
|
||||
// Case 1: 高价值订单 + VIP客户 -> 优先处理 + 包邮
|
||||
premiumCond := condition.New(condition.Describe("高价值VIP订单"))
|
||||
premiumCond.SetExpr(condition.NewExpr("Order", "total_amount", condition.Operator(condition.GE), condition.Token("5000", condition.STRING))).
|
||||
SetExpr(condition.NewExpr("User", "level", condition.Operator(condition.GE), condition.Token("5", condition.STRING)))
|
||||
|
||||
premiumConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"shipping_method": map[string]any{
|
||||
"type": "string",
|
||||
"value": "express",
|
||||
},
|
||||
"shipping_fee": map[string]any{
|
||||
"type": "string",
|
||||
"value": "0",
|
||||
},
|
||||
"priority": map[string]any{
|
||||
"type": "string",
|
||||
"value": "high",
|
||||
},
|
||||
"gift_wrapping": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"insurance": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
premiumCase := condflow.NewCondCase("premium-order", premiumCond, "Example/ExampleExecutor@ExpressShipping").
|
||||
WithPriority(100).
|
||||
WithActionConfig(premiumConfig).
|
||||
WithNextCaseOnSuccess(true) // 继续执行下一个case(通知客户)
|
||||
|
||||
// Case 2: 紧急订单 -> 加急配送
|
||||
urgentCond := condition.New(condition.Describe("紧急订单"))
|
||||
urgentCond.SetExpr(condition.NewExpr("Order", "tags", condition.FieldSqlFn("json_contains", ""), condition.Token("urgent", condition.STRING)))
|
||||
|
||||
urgentConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"shipping_method": map[string]any{
|
||||
"type": "string",
|
||||
"value": "express",
|
||||
},
|
||||
"max_hours": map[string]any{
|
||||
"type": "string",
|
||||
"value": "24",
|
||||
},
|
||||
"priority": map[string]any{
|
||||
"type": "string",
|
||||
"value": "urgent",
|
||||
},
|
||||
})
|
||||
|
||||
urgentCase := condflow.NewCondCase("urgent-order", urgentCond, "Example/ExampleExecutor@ExpressShipping").
|
||||
WithPriority(95).
|
||||
WithActionConfig(urgentConfig)
|
||||
|
||||
// Case 3: 跨区域订单 -> 仓库调配
|
||||
crossRegionCond := condition.New(condition.Describe("跨区域订单"))
|
||||
crossRegionCond.SetExpr(condition.NewExpr("Order", "shipping_province", condition.Operator(condition.NE), condition.Token("warehouse_province", condition.PARAM)))
|
||||
|
||||
crossRegionConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"check_inventory": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"transfer_if_needed": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
"estimated_days": map[string]any{
|
||||
"type": "string",
|
||||
"value": "5",
|
||||
},
|
||||
})
|
||||
|
||||
crossRegionCase := condflow.NewCondCase("cross-region-order", crossRegionCond, "Example/ExampleExecutor@WarehouseTransfer").
|
||||
WithPriority(80).
|
||||
WithActionConfig(crossRegionConfig)
|
||||
|
||||
// Case 4: 普通订单 -> 标准配送
|
||||
standardCond := condition.New(condition.Describe("普通订单"))
|
||||
standardCond.SetExpr(condition.NewExpr("Order", "total_amount", condition.Operator(condition.GT), condition.Token("0", condition.STRING)))
|
||||
|
||||
standardConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"shipping_method": map[string]any{
|
||||
"type": "string",
|
||||
"value": "standard",
|
||||
},
|
||||
"estimated_days": map[string]any{
|
||||
"type": "string",
|
||||
"value": "3",
|
||||
},
|
||||
})
|
||||
|
||||
standardCase := condflow.NewCondCase("standard-order", standardCond, "Example/ExampleExecutor@StandardShipping").
|
||||
WithPriority(50).
|
||||
WithActionConfig(standardConfig)
|
||||
|
||||
// Case 5: 通知客户(配合 premium case 的 nextCaseOnSuccess)
|
||||
notifyCond := condition.New(condition.Describe("需要通知的订单"))
|
||||
notifyCond.SetExpr(condition.NewExpr("Order", "notify_customer", condition.Token("true", condition.STRING)))
|
||||
|
||||
notifyConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"channels": map[string]any{
|
||||
"type": "string",
|
||||
"value": "email,sms",
|
||||
},
|
||||
"template": map[string]any{
|
||||
"type": "string",
|
||||
"value": "order-confirmed",
|
||||
},
|
||||
"immediate": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
notifyCase := condflow.NewCondCase("notify-customer", notifyCond, "Example/ExampleExecutor@NotifyCustomer").
|
||||
WithPriority(40).
|
||||
WithActionConfig(notifyConfig)
|
||||
|
||||
// 添加所有条件分支
|
||||
flow.AddCase(premiumCase).
|
||||
AddCase(urgentCase).
|
||||
AddCase(crossRegionCase).
|
||||
AddCase(standardCase).
|
||||
AddCase(notifyCase)
|
||||
|
||||
fmt.Printf("条件流名称: %s\n", flow.Name())
|
||||
fmt.Printf("条件分支数量: %d\n", flow.CaseCount())
|
||||
|
||||
// Output:
|
||||
// 条件流名称: order-processing-flow
|
||||
// 条件分支数量: 5
|
||||
}
|
||||
|
||||
// Example_nestedFlow 嵌套流程示例 - 展示如何使用 NextFlowOnSuccess
|
||||
func Example_nestedFlow() {
|
||||
// 初始化 DI 容器并注册 executor
|
||||
app := do.New()
|
||||
setupExampleExecutor(app)
|
||||
|
||||
// 创建主流程:用户注册流程
|
||||
mainFlow := condflow.New("user-registration-flow")
|
||||
|
||||
// 创建子流程:邮件验证流程
|
||||
emailVerificationFlow := condflow.New("email-verification-flow")
|
||||
|
||||
verifyCond := condition.New(condition.Describe("发送验证邮件"))
|
||||
verifyConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"template": map[string]any{
|
||||
"type": "string",
|
||||
"value": "email-verification",
|
||||
},
|
||||
"expire_in": map[string]any{
|
||||
"type": "string",
|
||||
"value": "24h",
|
||||
},
|
||||
})
|
||||
verifyCase := condflow.NewCondCase("send-verify-email", verifyCond, "Example/ExampleExecutor@SendVerification").
|
||||
WithActionConfig(verifyConfig)
|
||||
|
||||
emailVerificationFlow.AddCase(verifyCase)
|
||||
|
||||
// 创建子流程:欢迎礼包流程
|
||||
welcomePackFlow := condflow.New("welcome-pack-flow")
|
||||
|
||||
couponCond := condition.New(condition.Describe("创建新用户优惠券"))
|
||||
couponConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"coupon_type": map[string]any{
|
||||
"type": "string",
|
||||
"value": "new_user",
|
||||
},
|
||||
"discount": map[string]any{
|
||||
"type": "string",
|
||||
"value": "20",
|
||||
},
|
||||
"valid_days": map[string]any{
|
||||
"type": "string",
|
||||
"value": "30",
|
||||
},
|
||||
})
|
||||
couponCase := condflow.NewCondCase("new-user-coupon", couponCond, "Example/ExampleExecutor@CreateCoupon").
|
||||
WithActionConfig(couponConfig)
|
||||
|
||||
welcomePackFlow.AddCase(couponCase)
|
||||
|
||||
// 主流程 Case: 邮箱注册用户
|
||||
emailRegCond := condition.New(condition.Describe("邮箱注册"))
|
||||
emailRegCond.SetExpr(condition.NewExpr("User", "register_type", condition.Token("email", condition.STRING)))
|
||||
|
||||
emailRegConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"send_welcome": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
emailRegCase := condflow.NewCondCase("email-registration", emailRegCond, "Example/ExampleExecutor@CreateUser").
|
||||
WithPriority(100).
|
||||
WithNextFlowOnSuccess(emailVerificationFlow, nil). // 成功后执行邮件验证流程
|
||||
WithActionConfig(emailRegConfig)
|
||||
|
||||
// 主流程 Case: 手机号注册用户
|
||||
phoneRegCond := condition.New(condition.Describe("手机号注册"))
|
||||
phoneRegCond.SetExpr(condition.NewExpr("User", "register_type", condition.Token("phone", condition.STRING)))
|
||||
|
||||
phoneRegConfig, _ := fieldx.SchemaFromMap(map[string]any{
|
||||
"send_sms": map[string]any{
|
||||
"type": "string",
|
||||
"value": "true",
|
||||
},
|
||||
})
|
||||
|
||||
phoneRegCase := condflow.NewCondCase("phone-registration", phoneRegCond, "Example/ExampleExecutor@CreateUser").
|
||||
WithPriority(90).
|
||||
WithNextFlowOnSuccess(welcomePackFlow, nil). // 成功后执行欢迎礼包流程
|
||||
WithActionConfig(phoneRegConfig)
|
||||
|
||||
mainFlow.AddCase(emailRegCase).
|
||||
AddCase(phoneRegCase)
|
||||
|
||||
fmt.Printf("主流程名称: %s\n", mainFlow.Name())
|
||||
fmt.Printf("主流程分支数量: %d\n", mainFlow.CaseCount())
|
||||
|
||||
// Output:
|
||||
// 主流程名称: user-registration-flow
|
||||
// 主流程分支数量: 2
|
||||
}
|
||||
Reference in New Issue
Block a user