跳到主要内容

新增/编辑前处理数据

本文档介绍如何在数据新增或编辑前,使用 C# 脚本自定义处理数据。

使用场景​

当需要在数据新增或编辑前对数据进行预处理时,例如:

  • 自动计算字段值(如:数值求和、日期差值等)
  • 数据格式转换和标准化
  • 设置默认值
  • 数据关联处理

实现方式​

数据结构说明​

新增/编辑/删除等操作时,HTTP 请求的 RequestBody 内容会托管到 context.Request.List 属性中,可以在 List 属性中获取到前端请求数据。

示例代码​

以下示例演示如何在新增/编辑前自动计算两个字段的和:

using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;

public class ChameleonCSharpScript
{
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;

foreach (var item in list)
{
item["numbersum"] = Convert.ToInt32(item["number1"]) + Convert.ToInt32(item["number2"]);
}

return null;
}
}

数据格式示例​

新增/编辑时,context.Request.List 的数据格式如下:

{
"list": [
{
"Id": "69dcccb5-9228-4baf-ac38-4eebd0e15076",
"Fields": {
"_id": {
"Code": "_id",
"Value": "69dcccb5-9228-4baf-ac38-4eebd0e15076"
},
"number1": {
"Code": "number1",
"Value": 1
},
"number2": {
"Code": "number2",
"Value": 1
},
"date1": {
"Code": "date1",
"Value": "2024-12-31T16:00:00"
},
"date2": {
"Code": "date2",
"Value": "2025-01-21T16:00:00"
}
}
}
]
}

关键点说明​

1. 数据访问方式​

  • 通过 context.Request.List 获取数据列表
  • 每个列表项是一个字典对象,可通过字段名直接访问
  • 字段值存储在 Fields 集合中的 Value 属性

2. 数据修改​

  • 直接修改 item 字典中的值即可
  • 修改后的数据会传递给后续的数据操作流程

3. 返回值​

  • 返回 null 表示正常继续执行
  • 如需中断流程,可返回错误消息字符串

扩展示例​

日期处理示例​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;

foreach (var item in list)
{
// 计算日期间隔天数
if (item.ContainsKey("date1") && item.ContainsKey("date2"))
{
var date1 = Convert.ToDateTime(item["date1"]);
var date2 = Convert.ToDateTime(item["date2"]);
item["daysdiff"] = (date2 - date1).Days;
}
}

return null;
}

条件判断示例​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;

foreach (var item in list)
{
// 根据金额自动设置等级
var amount = Convert.ToDecimal(item["amount"]);
if (amount >= 10000)
{
item["level"] = "高";
}
else if (amount >= 5000)
{
item["level"] = "中";
}
else
{
item["level"] = "低";
}
}

return null;
}

注意事项​

  1. 类型转换:从字典中获取的值通常是 object 类型,需要进行适当的类型转换
  2. 空值检查:访问字段前建议检查字段是否存在,避免空引用异常
  3. 性能考虑:如果数据量较大,注意脚本的执行效率
  4. 数据验证:可以在脚本中进行数据验证,返回错误消息中断流程

相关文档​