后端
1. API接口文档说明
CMS2.0基座配备了众多标准化且高效的核心业务模块,并提供了相应的外部接口。借助这些模块,插件能够迅速完成业务开发。以下是为二次开发的外部插件所提供的基座业务模块API接口清单。如需进一步扩展接口,请与产品研发团队联系。
2. 权限模块
提供与用户身份、用户鉴权、用户授权相关信息的API接口。
2.1 获取用户信息
依赖包:CMS.Unit.Authority
命名空间:CMS.Unit.Authority.Services.Abstractions
方法名:IUserService.GetUser
说明:根据用户id获取用户信息
参数
| 类型 | 名字 | 说明 |
|---|---|---|
| Guid | id | 用户id |
返回值
返回对象类型:UserGetDTO,属性信息如下:
| 类型 | 名字 | 说明 |
|---|---|---|
| Guid | Id | 用户id |
| string | UserName | 用户名 |
| string | Name | 姓名 |
List<Guid> | RoleIds | 关联的角色id集合,未关联时为空集合 |
| string | RolesDisplay | 关联的角色全名称,未关联时为空字符串 |
| Guid | OrganizationId | 关联的组织架构id,未关联时为空id: 00000000-0000-0000-0000-000000000000 |
| string | OrignizationDiaplsyName | 关联的组织架构名称id全名称,为关联时为空字符串 |
例子
//1.从依赖注入容器中获取IUserService
IUserService userService = ...;
//2.获取用户id
Guid id = ...;
//3.根据用户id获取用户信息
var user = await userService.GetUser(id);
2.2 获取用户的角色信息
依赖包:CMS.Unit.Authority
命名空间:CMS.Unit.Authority.Services.Abstractions
方法名:IRoleService.GetRole
说明:根据角色id获取角色信息
参数
| 类型 | 名字 | 说明 |
|---|---|---|
| Guid | id | 角色id |
返回值
返回对象类型:RoleGetDTO
| 类型 | 名字 | 说明 |
|---|---|---|
| Guid | Id | 角色id |
| string | Name | 角色名称 |
| string | Remark | 备注 |
例子
//1.从依赖注入容器中获取IRoleService
IRoleService roleService = ...;
//2.获取角色id
Guid id = ...;
//3.根据角色id获取角色信息
var user = await roleService.GetRole(id);
3. 变量模块
提供与变量相关操作的API接口
3.1 订阅变量变化事件,监听变量的变化
-
依赖包:CMS.Unit.RuntimeValue.Abstractions
-
命名空间:CMS.Unit.RuntimeValue.Abstractions
-
事件名:IVariableDataCache.TagChanged
-
说明:通过订阅
IVariableDataCache.TagChanged事件,您可以实时监控变量的变化。此事件会传递所有变量至事件处理函数,因此,业务层需在函数中筛选关注的变量。注意事项:
(1)性能影响: 发布事件时,事件的发送者将阻塞流程。因此,强烈建议避免在事件处理函数中执行 I/O 操作、HTTP 接口访问或其他耗时操作,以防止对系统性能产生严重影响,导致整个系统响应延迟。
(2)高频率触发: 由于事件订阅了全量变量,触发频率可能非常高。
(3)异步处理: 鉴于事件触发频率很高,建议业务层在筛选关注变量后,使用
Task启动新线程处理业务逻辑,以避免阻塞核心的变量监听功能,实现业务层与平台基座的解耦。(4)并发管理: 如果业务层并发量大,必须优化代码设计和实施,以减少在高并发情况下的系统资源消耗,防止系统性能问题。
(5)代码安全: 安装并使用
CMS.CodeAnalysis分析器来分析IVariableDataCache.TagChanged的使用情况。该工具能在使用不当时提供编译错误,帮助您提高代码质量。
事件处理函数输入参数
| 类型 | 名字 | 说明 |
|---|---|---|
| object | sender | 事件发送者 |
| TagChangedEventArgs | e: TraceId Changeds | 事件参数: 追踪id 变量列表 |
返回值
N/A
例子
//1.从依赖注入容器中获取IVariableDataCache
IVariableDataCache cache=...;
cache.TagChanged+=(sender,e)=>
{
//2.找出业务相关的变化变量
var tags _=e.Changeds.Where(a=>......);
//3.开启新线程处理业务,完成基座与插件解耦
_ = Task.Run(() =>
{
});
};
3.2 使用变量通道,监听变量的变化
-
依赖包:CMS.Unit.RuntimeValue.Abstractions
-
命名空间:CMS.Unit.RuntimeValue.Abstractions
-
方法名:IVariableDataCache.CreateChannel
-
说明:业务层可注册一个通道以监控变量变化。当变量发生变化时,通道的监听器处理函数将接收到所有变量,允许业务层筛选关注的变量进行处理。
(1)解耦和系统稳定性: 通过实现变量通道,基座的变量变化消息发布和业务层的变量变化消息订阅得到了有效解耦,从而避免了系统变量监听的阻塞引起系统整体响应延迟。
(2)优化并发处理: 如果业务并发量较高,需优化业务处理逻辑,以防止变量变化消息在通道中造成阻塞。
(3)高频率触发管理: 由于通道会监听所有变量,导致处理方法的触发频率较高。业务层应根据实际业务节奏采取合理策略,避免消息在通道中持续积压,确保流畅的消息处理。
创建通道参数
| 类型 | 名字 | 说明 |
|---|---|---|
| string | name | 通道的名字,命名时请加上与插件相关的防止和其他插件的通道名称重复 ;可以通过通道名称在日志中查询出订阅处理函数的耗时; |
| IVariableChannelListener | channelListener | 通道监听器,业务处理入口 |
ILogger<VariableChannel> | logger | 日志记录器 |
| bool | waitListener | 是否等待业务处理结束才开始下一个业务(是否有序) |
| TimeSpan? | timeout | 监听者业务处理函数超时时间,作用于监者听处理函数的入参取消令牌(CancellationToken)参数 |
| bool | continueCaptureContext | 请使用默认值 |
IReadOnlySet<string>? | variableFilter | 过滤变量,如果是空就不过滤 |
返回值
VariableChannel
返回对象需要存在下来,在不使用的时候需要进行释放(Dispose())
例子
//1.定义自己的通道监听,继承基座提供的IVariableChannelListener(变量通道监听器)接口,
public class MyVariableChannelListener : IVariableChannelListener
{
/// <summary>
/// 变量变化处理方法
/// </summary>
/// <param name="args">变量参数</param>
/// <param name="token">取消令牌</param>
/// <returns></returns>
public async Task RunAsync(TagChangedEventArgs args, CancellationToken token)
{
//从全量变量中找出自己业务的变量信号
var variables = args.Changeds.Where(a => ...);
//链路追踪id
var tranceId = args.TraceId;
//开启新的线程处理业务,完成基座与插件解耦
_ = Task.Run(async() =>
{
await Task.CompletedTask;
});
}
}
//2.创建变量通道
//2.1 从依赖注入容器中获取IVariableDataCachev
IVariableDataCache cache=...;
//2.2 创建变量通道并保存下来,用于后续需要的地方释放通道
var variableChannel = cache.CreateChannel("channel-name", new MyVariableChannelListener(),waitListener:true,timeout:TimeSpan.FromSeconds(30),variableFilter:new HashSet<string> { "a1"});
//3. 在业务结束时需要释放通道,通道释放后如果还有变量变化的消息积压在通道中,消息会随着通道释放而销毁
variableChannel.Dispose();
3.3 变量读取
- 依赖包:CMS.Extensions.Variable
- 命名空间:CMS.Extensions.Variable
- 方法名:IVariableTypeDeterminer.ReadVariableAsync
- 说明:读取变量
参数
| 类型 | 名字 | 作用 |
|---|---|---|
IReadOnlyList<string> | names | 需要读取的变量名 |
| Guid | traceId | 链路追踪id |
| CancellationToken | token | 取消令牌 |
返回值
返回值类型:ReadWriteResult<IReadOnlyDictionary<string, DataQuality?>>
| 类型 | 名字 | 作用 |
|---|---|---|
ReadWriteCodeResult | Code | 结果状态码枚举 |
IReadOnlyDictionary<string, IVariableValue?> | Content | 读取结果内容,字典key时变量名,字典值时变量的值 |
ReadWriteCodeResult枚举如下
/// <summary>
/// 读写结果状态码
/// </summary>
public enum ReadWriteCodeResult : sbyte
{
/// <summary>
/// 没有初始化
/// </summary>
NotInited = -1,
/// <summary>
/// 成功
/// </summary>
Success = 0,
/// <summary>
/// 部分成功
/// </summary>
PartSuccess = 1,
/// <summary>
/// 失败
/// </summary>
Fail = 2,
/// <summary>
/// 其他
/// </summary>
Other = 4
}
IVariableValue描述
| 类型 | 名字 | 作用 |
|---|---|---|
| object? | Value | 读到的数据,已经转成 CLR 类型,如果有 |
| VariableInfo? | Tag | 读到的变量信息,如果有 |
| DataQuality? | DataQuality | 读到的数据质量,如果有 |
| DateTime? | UpdateTime | 读到的最后更新时间,如果有 |
| ReadWriteMode | Mode | 读到的变量读写方式: |
例子
//1. 从依赖注入容器中获取IVariableTypeDeterminer
IVariableTypeDeterminer determiner = ...;
//2. 读取变量
var result = await determiner.ReadVariableAsync(new string[]{"a1","a2","a3"});
//3. 返回的结果信息准确信校验
... ...
//4.从结果中获取变量的值,例如a1
var a1Value = result.Content["a1"]?.Value;
3.4 变量写入
- 依赖包:CMS.Extensions.Variable
- 命名空间:CMS.Extensions.Variable
- 方法名:IVariableTypeDeterminer.WriteVariableAsync
- 说明:给变量写入值
参数
| 类型 | 名字 | 作用 |
|---|---|---|
IReadOnlyDictionary<string, object?> | variables | 要设置的变量值集合 |
CancellationToken | token | 取消令牌 |
IEnumerable<string>? | notifyVariables | 需要通知的变量,空则按变量类型自动判断是否需要通知 |
Guid? | traceId | 链路追踪 Id |
返回值
DataQuality 值与描述
| 值 | 描述 | 处理建议 |
|---|---|---|
| -1 | 未初始化 | 无 |
| 0 | 成功 | 无 |
| 1 | 变量名不存在 | 只下发存在的变量名 |
| 2 | 变量格式错误 | 无 |
| 3 | 设备断开 | 排查一下设备连接状态 |
| 4 | 其他 | 无 |
ReadWriteCodeResult 值与描述
| 值 | 描述 | 处理建议 |
|---|---|---|
| -1 | 没有初始化 | 无 |
| 0 | 全部成功 | 无 |
| 1 | 部分成功 | 无 |
| 2 | 全部失败 | 无 |
| 4 | 其他 | 无 |
例子
//1. 从依赖注入容器中获取IVariableTypeDeterminer
IVariableTypeDeterminer determiner=...;
//2. 批量变量设置值
var result=await determiner.WriteVariableAsync(new Dictionary<string, object?>
{
["a1"] = 123,
["a2"] = "123",
["a3"] = DateTime.Now,
["a4"] = true,
["a5"] = 1.1234,
});
//3. 对写入的结果相关处理
......
4. 数据管理模块
4.1 数据归档功能—新增归档表
-
依赖包:CMS.Unit.DataConfig.Abstractions
-
命名空间:CMS.Unit.DataConfig.Abstractions
-
方法名:IFilingTableService.AddFilingTableAsync
-
说明:给数据模块的数据表菜单树新增一个归档表 节点;
如图:

参数
| 类型 | 名字 | 作用 |
|---|---|---|
Guid | folderId | 文件夹 id |
string | name | 显示的表名字 |
int | sort | 表排序 id |
Action<FilingTable>? | settings | 归档表字段设置,可以无 |
返回值
FilingTable
| 类型 | 名字 | 作用 |
|---|---|---|
| Guid | Id | 主键 |
| Guid | FolderId | 文件夹 id |
| string | Name | 命名 |
| int | Sort | 排序 |
| bool | Enable | 启用/禁用 |
| DateTime | CreateDateTime | 创建时间 |
| SelectMode | OperationMode | 操作按钮选择模式 |
ICollection<OperationType>? | OperationTypes | 操作按钮 |
| SelectMode | FunctionMode | 功能按钮选择模式 |
ICollection<FilingTableFunctionType>? | FunctionTypes | 功能按钮 |
ICollection<string>? | ExtendedHeaders | 扩展的 headers,默认[记录时间] |
| bool | CacheConfig_EnableCache | 实时缓存 |
| int | CacheConfig_QuantityLimit | 缓存数量上限 |
| int | CacheConfig_TimeSpanLimit | 时间跨度上限 |
| TimeUnit | CacheConfig_TimeSpanLimitUnit | 时间跨度上限单位 |
| string | CacheConfig_ClearCache | 缓存清除 |
| bool | StorageConfig_EnableClear | 是否启用数据清除 |
| int | StorageConfig_RetentionValue | 保留范围(值) |
| TimeUnit | StorageConfig_RetentionUnit | 保留范围(单位) |
| bool | StorageConfig_BackupBeforeClear | 清除前备份 |
| string | StorageConfig_BackupPath | 备份路径 |
SelectMode
| 类型 | 名字 | 作用 |
|---|---|---|
| All | All | 包含所有 |
| None | None | 排除所有 |
| Include | Include | 包含 |
| Exclude | Exclude | 排除 |
例子
//1. 从依赖注入容器中获取 IFilingTableService
IFilingTableService fillingTableService=...;
//2. 生成或者获取文件夹id
Guid folderGuid=...;
//3. 添加归档表id
var result=await fillingTableService.AddFilingTableAsync(folderGuid,"汽车组BU",1,s=>{...});
4.2 数据归档功能—设置归档表字段配置
- 依赖包:CMS.Unit.DataConfig.Abstractions
- 命名空间:CMS.Unit.DataConfig.Abstractions
- 方法名:IFilingTableService.SetFilingTableFieldsAsync
- 说明:设置归档表的字段配置;
如图:

参数
| 类型 | 名字 | 作用 |
|---|---|---|
Guid | filingTableId | 归档表 id |
List<FilingTableField> | filingTableFields | 归档表字段配置 |
FilingTableField
| 类型 | 名字 | 作用 |
|---|---|---|
| string? | Id | 主键 |
| Guid | FilingTableId | 归档表 id |
| string | FieldName | 字段名称 |
| FieldType | FieldType | 字段类型 |
| string | AssociatedVariable | 关联变量 |
| string | Formula | 计算公式 |
| int | Sort | 排序 |
FieldType
| 类型 | 名字 | 作用 |
|---|---|---|
| FieldType | Unknow | Unknow |
| FieldType | 数值 | 数值 |
| FieldType | 文本 | 文本 |
| FieldType | 日期 | 日期 |
返回值
N/A
例子
//1.从依赖注入容器中获取 IFilingTableService
IFilingTableService fillingTableService=...;
//2.获取归档表id
Guid fillingTableId=...;
//3.构造字段配置列表
List<FilingTableField> fields=...;
//4.给配置表设置字段配置
var result=await fillingTableService.SetFilingTableFieldsAsync(fillingTableId,fields);
4.3 数据归档功能—通过 id 获取归档表
- 依赖包:CMS.Unit.DataConfig.Abstractions
- 命名空间:CMS.Unit.DataConfig.Abstractions
- 方法名:IFilingTableService.GetFilingTableAsync
- 说明:通过 id 获取归档表在数据表菜单树中的节点信息;
参数
| 类型 | 名字 | 作用 |
|---|---|---|
| Guid | filingTableId | 归档表 id |
返回值
FilingTable例子
//1.从依赖注入容器中获取IFilingTableService
IFilingTableService fillingTableService=...;
//2.获取聚合表id
Guid fillingTableId=...;
//3.根据id获取聚合表信息
var filingTable=await fillingTableService.GetFilingTableAsync(fillingTableId);
4.4 数据归档功能—通过 id 获取归档表字段配置
- 依赖包:CMS.Unit.DataConfig.Abstractions
- 命名空间:CMS.Unit.DataConfig.Abstractions
- 方法名:IFilingTableService.GetFilingTableAsync
- 说明:根据归档表节点id获取字段配置信息列表
参数
| 类型 | 名字 | 作用 |
|---|---|---|
| Guid | filingTableId | 归档表 id |
| bool | queryHeader | 是否查询header信息:false-不查询 , true-查询 |
返回值
FilingTableField例子
//1.从依赖注入容器中获取IFilingTableService
IFilingTableService fillingTableService=...;
//2.获取聚合表id
Guid fillingTableId=...;
//3.根据id获取聚合表字段配置信息
var filingTableFields=await fillingTableService.GetFilingTableFieldsAsync(fillingTableId,false);
4.5 数据归档功能—删除归档表
- 依赖包:CMS.Unit.DataConfig.Abstractions
- 命名空间:CMS.Unit.DataConfig.Abstractions
- 方法名:IFilingTableService.DeleteFilingTableAsync
- 说明:根据id删除聚合表节点;
参数
| 类型 | 名字 | 作用 |
|---|---|---|
| Guid | filingTableId | 归档表id |
返回值
删除的表及引用的 Id 列表;
例子
//1.从依赖注入容器中获取IFilingTableService
IFilingTableService fillingTableService=...;
//2.获取聚合表id
Guid fillingTableId=...;
//3.根据id删除聚合表配置节点
await fillingTableService.DeleteFilingTableAsync(fillingTableId);