后台基础代码扩展实现
此文档是生成代码对应后台业务处理
- 每张表生成的后台代码都有一个 表Service.cs 类;业务扩展写在 Partial 文件夹下的 表Service.cs 分部类中(重新生成代码不会覆盖)。
- 框架已在
VolPro.Core/BaseProvider/ServiceBase.cs实现查询、新建、修改、删除、审批、导入、导出等标准流程;业务只需在 Partial Service 中 重写对应 virtual 方法,并为基类ApplicationServiceBase上的 Func / Action 委托属性赋值,再调用base.xxx(...)。 - 各操作的 完整代码示例 见本目录子文档:search、add、update、del、audit 等。

实现原理(Func 委托)
生成表 Service 继承链:{表}Service → ServiceBase<TEntity,TRepository> → ApplicationServiceBase<TEntity,TRepository>。
所有业务扩展点 均定义在 ApplicationServiceBase.cs 中,类型为 Func<...> 或 Action<...>。
在 Partial 的 {表}Service.cs 里 不要 复制框架 CRUD 逻辑,而是:
public override WebResponseContent Add(SaveModel saveDataModel)
{
var webResponse = new WebResponseContent();
// 1. 给 this 上的委托属性赋值(Lambda)
AddOnExecuting = (当前表 main, object list) => {
// 业务逻辑
return webResponse.OK(); // 成功
// return webResponse.Error("提示"); // 失败,中止保存
};
AddOnExecuted = (当前表 main, object list) => {
// 数据库已 SaveChanges,仍在同一事务内
return webResponse.OK();
};
// 2. 必须调用 base,框架才会按顺序 Invoke 上述 Func
return base.Add(saveDataModel);
}
注意
- Func 必须在
return base.xxx(...)之前 赋值;base方法内部读取this.AddOnExecuting等属性并调用。 - 返回
webResponse.Error(...)或Status=false会 中止 后续框架步骤;AddOnExecuted/UpdateOnExecuted/DelOnExecuted内Error会 回滚事务。 - 同步与异步:生成器勾选「异步接口」后走
GetPageDataAsync/AddAsync等;可额外赋值*Async后缀委托(如AddOnExecutingAsync),与同步版 都会执行(先同步后异步)。
Func 属性总览
以下属性均在 ApplicationServiceBase.cs 声明;ServiceBase.cs 在对应 virtual 方法中 Invoke。
查询 GetPageData
| 属性 | 类型 | 执行时机 | 说明 |
|---|---|---|---|
QueryRelativeList | Action<List<SearchParameters>> | 解析前台 wheres 之前 | 增删改原生查询参数;某字段 item.Value=null 则框架不再使用该条件 |
QuerySql | string | 构建 IQueryable 时 | 原生 SQL,select 须返回实体全部列 |
QueryRelativeExpression | Func<IQueryable<T>, IQueryable<T>> | 条件合并后 | LINQ 追加 Where / Include 等 |
OrderByExpression | Expression<Func<T, Dictionary<object, QueryOrderBy>>> | 排序 | 多字段排序 |
SummaryExpress | Func<IQueryable<T>, object> | 分页前 | 主表表格合计(配合前端 table 合计) |
SummaryExpressAsync | Func<IQueryable<T>, Task<object>> | 异步合计 | 异步接口时使用 |
GetPageDataOnExecuted | Action<PageGridData<T>> | 数据查回、返前端 之前 | 可改 grid.rows;同步 GetPageData 末尾调用 |
GetPageDataOnExecutedAsync | Func<PageGridData<T>, Task> | 同上(异步) | 仅 GetPageDataAsync 额外调用 |
执行顺序: QueryRelativeList →(QuerySql / 租户过滤)→ QueryRelativeExpression → 分页/合计 → GetPageDataOnExecuted → 返回。
新建 Add
| 属性 | 类型 | 执行时机 | 说明 |
|---|---|---|---|
AddOnExecute | Func<SaveModel, WebResponseContent> | 最早,实体转换前 | 操作原始 SaveModel(少见) |
AddOnExecuting | Func<T, object, WebResponseContent> | 校验通过后、写库前 | object 为明细 List<明细> 或一对多结构 |
AddOnExecutingAsync | 同上(Task) | 与上并行链式 | 异步版 |
AddOnExecuted | Func<T, object, WebResponseContent> | 主表 SaveChanges 后,同事务 | Error 回滚 |
AddOnExecutedAsync | 同上(Task) | 同事务 | 异步版 |
AddWorkFlowExecuting | Func<T, bool> | 进审批流程 前 | 返回 false 不进流程 |
AddWorkFlowExecuted | Action<T, List<int>> | 审批人写入 后 | 参数为审批人 userId 列表 |
执行顺序: AddOnExecute → 实体/明细转换与校验 → AddOnExecuting →(AddOnExecutingAsync)→ 事务内 Insert + AddOnExecuted → 审批流程钩子。
修改 Update
| 属性 | 类型 | 执行时机 | 说明 |
|---|---|---|---|
UpdateOnExecute | Func<SaveModel, WebResponseContent> | 最早,实体转换前 | 可改 saveModel.MainData["字段"] |
UpdateOnExecuting | Func<T, object, object, List<object>, WebResponseContent> | 写库前 | addList / updateList / delKeys 为明细增删改 |
UpdateOnExecutingAsync | 同上(Task) | 写库前 | 异步版 |
UpdateOnExecuted | Func<T, object, object, List<object>, WebResponseContent> | 明细增删改 SaveChanges 后,同事务 | 写关联表;Error 回滚 |
UpdateOnExecutedAsync | 同上(Task) | 同事务 | 异步版 |
一对多明细:MultipleTableEntity.GetAddList(typeof(明细表), null) 等,见 update.md。
执行顺序: UpdateOnExecute → 转换与校验 → UpdateOnExecuting → 事务内 Update 主从 → UpdateOnExecuted。
删除 Del
| 属性 | 类型 | 执行时机 | 说明 |
|---|---|---|---|
DelOnExecuting | Func<object[], WebResponseContent> | 删库 前 | _keys 为待删主键 |
DelOnExecutingAsync | 同上(Task) | 删库前 | 异步版 |
DelOnExecuted | Func<object[], WebResponseContent> | 删库 后,同事务 | Error 回滚 |
详见 del.md。
审批 / 反审
| 属性 | 类型 | 说明 |
|---|---|---|
AuditOnExecuting / AuditOnExecuted | Func<List<T>, WebResponseContent> | 普通审核(非流程)前后 |
AuditWorkFlowExecuting | Func<T, AuditStatus, bool, WebResponseContent> | 流程审批前;lastAudit 是否最后节点 |
AuditWorkFlowExecuted | Func<T, AuditStatus, List<int>, bool, WebResponseContent> | 流程审批后;下一节点审批人 ids |
AntiAuditOnExecuting / AntiAuditOnExecuted | Func<T, WebResponseContent> | 反审前后 |
详见 audit.md、antiAudit.md。
导入 / 导出
| 属性 | 类型 | 说明 |
|---|---|---|
ImportOnExecuting / ImportOnExecuted | Func<List<T>, WebResponseContent> | 导入保存前/后 |
ImportOnReadCellValue | Func<string, ExcelWorksheet, ExcelRange, int, int, string> | 自定义读 Excel 单元格 |
ExportOnExecuting | Func<List<T>, List<string>, WebResponseContent> | 导出前 |
ExportColumns / DownLoadTemplateColumns | Expression<Func<T, object>> | 指定导出/模板列 |
ExcelHeaderMap | 表达式 | 导入列名映射 |
详见 importData.md、exportData.md。
子文档索引
| 业务 | 重写方法 | 主要 Func | 文档 |
|---|---|---|---|
| 主表查询 | GetPageData / GetPageDataAsync | QueryRelativeList、QueryRelativeExpression、SummaryExpress、GetPageDataOnExecuted | search.md |
| 明细查询/合计 | GetDetailPage / GetDetailSummary | DetailQuery(override) | detail.md |
| OR 查询 | 前端 wheres + 可选 QueryRelativeExpression | — | or.md |
| 新建 | Add / AddAsync | AddOnExecuting、AddOnExecuted、AddWorkFlow* | add.md |
| 修改 | Update / UpdateAsync | UpdateOnExecuting、UpdateOnExecuted | update.md |
| 删除 | Del / DelAsync | DelOnExecuting、DelOnExecuted | del.md |
| 审批 | Audit | AuditWorkFlow*、AuditOn* | audit.md |
| 反审 | AntiAudit | AntiAuditOn* | antiAudit.md |
| 导入 | Import | ImportOn* | importData.md |
| 导出 | Export | ExportOn*、ExportColumns | exportData.md |
| 上传 | Upload | UploadFolder 等字段 | upload.md |
| 流程信息 | — | GetTableWorkflow 等扩展方法 | flow.md |
与前端配合
| 后台 | 前端(标准生成页) |
|---|---|
options.Value / QueryRelativeList | searchBefore 中 param.value = ... |
GetPageData 返回 res.extra | searchAfter(rows, res) 第二参数 |
| Add/Update 校验失败 Message | 前端 addBefore / updateBefore 也可做 UI 层校验(双端可选) |
前端 Hook 见 生成页面文档 / view-grid;后台以 Partial Service + Func 为准处理数据库与事务。
