You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Microsoft Rules Engine实现多选项输出的问卷积分规则?

基于Microsoft Rules Engine实现问卷式积分分配方案

1. 规则配置设计

每个问卷问题对应一组互斥的子规则,每个子规则匹配一个选项并输出对应积分。通过JSON配置规则,将所有问题的规则归入同一个工作流中:

{
  "WorkflowName": "QuestionnairePointsWorkflow",
  "Rules": [
    // 问题1:注册时长对应的规则组
    {
      "RuleName": "RegDuration_Less1Year",
      "Expression": "RegistrationYears < 1",
      "Actions": {
        "OnSuccess": [
          {
            "Name": "OutputPoints",
            "Context": {
              "Question": "您何时注册的?",
              "Points": 1
            }
          }
        ]
      }
    },
    {
      "RuleName": "RegDuration_2To4Years",
      "Expression": "RegistrationYears >= 2 && RegistrationYears <= 4",
      "Actions": {
        "OnSuccess": [
          {
            "Name": "OutputPoints",
            "Context": {
              "Question": "您何时注册的?",
              "Points": 2
            }
          }
        ]
      }
    },
    {
      "RuleName": "RegDuration_Over5Years",
      "Expression": "RegistrationYears > 5",
      "Actions": {
        "OnSuccess": [
          {
            "Name": "OutputPoints",
            "Context": {
              "Question": "您何时注册的?",
              "Points": 3
            }
          }
        ]
      }
    },
    {
      "RuleName": "RegDuration_Unregistered",
      "Expression": "IsRegistered == false",
      "Actions": {
        "OnSuccess": [
          {
            "Name": "OutputPoints",
            "Context": {
              "Question": "您何时注册的?",
              "Points": 0
            }
          }
        ]
      }
    },
    // 剩余9个问题的规则组按上述格式依次添加
  ]
}

核心要点:每个问题的子规则需确保条件互斥,覆盖所有可能的选项场景,避免同一问题匹配多条规则。

2. 输入数据模型定义

创建包含所有问卷问题字段的强类型模型,让规则可以直接引用属性进行条件判断:

public class QuestionnaireInput
{
    // 问题1字段
    public int? RegistrationYears { get; set; }
    public bool IsRegistered { get; set; }
    
    // 问题2字段示例:比如用户等级
    // public int UserLevel { get; set; }
    
    // 问题3-10的字段按需求添加
}

3. 规则执行与积分收集

通过代码加载规则配置、执行工作流,并收集每个匹配规则的积分输出:

// 加载规则配置(可从本地文件、数据库读取)
var ruleConfig = File.ReadAllText("QuestionnaireRules.json");
var workflowRules = JsonSerializer.Deserialize<List<Workflow>>(ruleConfig);

// 初始化RulesEngine
var re = new RulesEngine.RulesEngine(workflowRules.ToArray());

// 构造输入数据
var input = new QuestionnaireInput
{
    IsRegistered = true,
    RegistrationYears = 3
    // 填充其他9个问题的输入值
};

// 执行全部规则
var ruleResults = await re.ExecuteAllRulesAsync("QuestionnairePointsWorkflow", input);

// 整理积分结果
var totalPoints = 0;
var questionPointDetails = new List<QuestionPointRecord>();

foreach (var result in ruleResults)
{
    if (result.IsSuccess)
    {
        var actionContext = result.Actions.FirstOrDefault()?.Context;
        if (actionContext != null)
        {
            var question = actionContext["Question"].ToString();
            var points = int.Parse(actionContext["Points"].ToString());
            
            questionPointDetails.Add(new QuestionPointRecord { Question = question, Points = points });
            totalPoints += points;
        }
    }
}

// 输出结果示例
Console.WriteLine($"总积分:{totalPoints}");
foreach (var record in questionPointDetails)
{
    Console.WriteLine($"{record.Question}:{record.Points}分");
}

// 辅助存储类
public class QuestionPointRecord
{
    public string Question { get; set; }
    public int Points { get; set; }
}

4. 关键优化建议

  • 规则复用:如果多个问题的积分逻辑类似,可提取通用规则模板,通过动态参数调整条件和积分值。
  • 动态规则管理:将规则配置存储在数据库中,支持后台修改规则,无需重新部署代码。
  • 校验逻辑:在输入数据进入规则引擎前,添加字段合法性校验(如RegistrationYears的非负性),避免无效规则匹配。

内容的提问来源于stack exchange,提问作者maX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:00:04