新增/编辑时动态赋值字段值(复杂场景)
在某些业务场景下,需要在新增时,对某个字段进行动态赋值,新的值可能需要经过其他字段的计算得出,平台提供了相关能力对该业务场景进行扩展。
当我们的赋值逻辑较为复杂,我们可以通过该方法进行手动编码赋值。如果我们的赋值逻辑相对简单,我们可以优先参考新增/编辑时动态赋值字段值(简单场景)以一种更为简单的方式进行赋值操作。
场景示例
我们有三个字段,两个数字字段与两个数字之和字段,我们想在输入两个数字后,提交表单时,自动将两个数字相加,并且存储在数字之和字段。
接口配置
我们需要配置一个接口来对我们的列表业务进行扩展。在我们字 段所在对象 → 接口管理中新增接口,并对接口进行配置。
接口流程图
配置步骤
使用C#脚本组件来对数据集合进行编辑,脚本配置如下:
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;
public class ChameleonCSharpScript
{
public object Execute(ComponentContext context, IChameleonDbContext dbContext, ILogger logger)
{
var list = context.Request.List;
foreach (var item in list)
{
item["numbersum"] = Convert.ToInt32(item["number1"]) + Convert.ToInt32(item["number2"]);
}
return null;
}
}
配置数据写入组件来执行数据的写入,在组件的属性设置中勾选"输出到最终结果"。保存并发布接口。
扩展新增表单
在表单的属性配置区域内,使用自定义新增接口功能,选择我们刚才配置的接口来覆盖默认的新增行为。
结果展示
我们打开新增表单,输入两个数字值。点击提交后,可以看到已经成功计算出两数之和。
日期时间字段处理
如果表单中设计日期时间类型字段,表单提交时,请求数据中的字段值会携带时区信息,因此,需要手动转为UTC时间进行存储。系统默认的新增组件和编辑组件已经内置了处理逻辑,如果手动通过脚本处理数据直接写入数据库,则需要手动处理。
例如:
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
public class ChameleonCSharpScript
{
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var data = context.Request.List?.FirstOrDefault() ?? new ObjectData();
data.Id = Guid.Parse("CA3313D6-5863-4BBC-BACC-A85D19995A70");
var semester = sdk.DbContext.GetById("Outside.moreconfig", data.Id);
if (DateTimeOffset.TryParse(data["starttime"]?.ToString(), out var starttime))
{
data["starttime"] = starttime.UtcDateTime;
}
if (DateTimeOffset.TryParse(data["endtime"]?.ToString(), out var endtime))
{
data["endtime"] = endtime.UtcDateTime;
}
if (semester != null)
{
sdk.DbContext.Update("Outside.moreconfig", data);
}
else
{
sdk.DbContext.Add("Outside.moreconfig", data);
}
return null;
}
}
注意事项
- 该方案适用于复杂的字段计算和赋值场景
- 对于简单的业务逻辑,建议使用简单场景的方案
- 确保接口已保存并发布后才能在表单中使用
- 处理日期时间字段时,需要手动转换为UTC时间
- C#脚本支持完整的C#语法和平台API