后台基础代码扩展实现

此文档是生成代码对应后台业务处理

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


实现原理(Func 委托)

生成表 Service 继承链:{表}ServiceServiceBase<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 / DelOnExecutedError回滚事务
  • 同步与异步:生成器勾选「异步接口」后走 GetPageDataAsync / AddAsync 等;可额外赋值 *Async 后缀委托(如 AddOnExecutingAsync),与同步版 都会执行(先同步后异步)。

Func 属性总览

以下属性均在 ApplicationServiceBase.cs 声明;ServiceBase.cs 在对应 virtual 方法中 Invoke

查询 GetPageData

属性类型执行时机说明
QueryRelativeListAction<List<SearchParameters>>解析前台 wheres 之前增删改原生查询参数;某字段 item.Value=null 则框架不再使用该条件
QuerySqlstring构建 IQueryable 时原生 SQL,select 须返回实体全部列
QueryRelativeExpressionFunc<IQueryable<T>, IQueryable<T>>条件合并后LINQ 追加 Where / Include 等
OrderByExpressionExpression<Func<T, Dictionary<object, QueryOrderBy>>>排序多字段排序
SummaryExpressFunc<IQueryable<T>, object>分页前主表表格合计(配合前端 table 合计)
SummaryExpressAsyncFunc<IQueryable<T>, Task<object>>异步合计异步接口时使用
GetPageDataOnExecutedAction<PageGridData<T>>数据查回、返前端 之前可改 grid.rows;同步 GetPageData 末尾调用
GetPageDataOnExecutedAsyncFunc<PageGridData<T>, Task>同上(异步)GetPageDataAsync 额外调用

执行顺序: QueryRelativeList →(QuerySql / 租户过滤)→ QueryRelativeExpression → 分页/合计 → GetPageDataOnExecuted → 返回。

详见 search.mddetail.md

新建 Add

属性类型执行时机说明
AddOnExecuteFunc<SaveModel, WebResponseContent>最早,实体转换前操作原始 SaveModel(少见)
AddOnExecutingFunc<T, object, WebResponseContent>校验通过后、写库前object 为明细 List<明细> 或一对多结构
AddOnExecutingAsync同上(Task)与上并行链式异步版
AddOnExecutedFunc<T, object, WebResponseContent>主表 SaveChanges 后,同事务Error 回滚
AddOnExecutedAsync同上(Task)同事务异步版
AddWorkFlowExecutingFunc<T, bool>进审批流程 返回 false 不进流程
AddWorkFlowExecutedAction<T, List<int>>审批人写入 参数为审批人 userId 列表

执行顺序: AddOnExecute → 实体/明细转换与校验 → AddOnExecuting →(AddOnExecutingAsync)→ 事务内 Insert + AddOnExecuted → 审批流程钩子。

详见 add.mdflow.md

修改 Update

属性类型执行时机说明
UpdateOnExecuteFunc<SaveModel, WebResponseContent>最早,实体转换前可改 saveModel.MainData["字段"]
UpdateOnExecutingFunc<T, object, object, List<object>, WebResponseContent>写库前addList / updateList / delKeys 为明细增删改
UpdateOnExecutingAsync同上(Task)写库前异步版
UpdateOnExecutedFunc<T, object, object, List<object>, WebResponseContent>明细增删改 SaveChanges 后,同事务写关联表;Error 回滚
UpdateOnExecutedAsync同上(Task)同事务异步版

一对多明细:MultipleTableEntity.GetAddList(typeof(明细表), null) 等,见 update.md

执行顺序: UpdateOnExecute → 转换与校验 → UpdateOnExecuting → 事务内 Update 主从 → UpdateOnExecuted

删除 Del

属性类型执行时机说明
DelOnExecutingFunc<object[], WebResponseContent>删库 _keys 为待删主键
DelOnExecutingAsync同上(Task)删库前异步版
DelOnExecutedFunc<object[], WebResponseContent>删库 ,同事务Error 回滚

详见 del.md

审批 / 反审

属性类型说明
AuditOnExecuting / AuditOnExecutedFunc<List<T>, WebResponseContent>普通审核(非流程)前后
AuditWorkFlowExecutingFunc<T, AuditStatus, bool, WebResponseContent>流程审批前;lastAudit 是否最后节点
AuditWorkFlowExecutedFunc<T, AuditStatus, List<int>, bool, WebResponseContent>流程审批后;下一节点审批人 ids
AntiAuditOnExecuting / AntiAuditOnExecutedFunc<T, WebResponseContent>反审前后

详见 audit.mdantiAudit.md

导入 / 导出

属性类型说明
ImportOnExecuting / ImportOnExecutedFunc<List<T>, WebResponseContent>导入保存前/后
ImportOnReadCellValueFunc<string, ExcelWorksheet, ExcelRange, int, int, string>自定义读 Excel 单元格
ExportOnExecutingFunc<List<T>, List<string>, WebResponseContent>导出前
ExportColumns / DownLoadTemplateColumnsExpression<Func<T, object>>指定导出/模板列
ExcelHeaderMap表达式导入列名映射

详见 importData.mdexportData.md


子文档索引

业务重写方法主要 Func文档
主表查询GetPageData / GetPageDataAsyncQueryRelativeList、QueryRelativeExpression、SummaryExpress、GetPageDataOnExecutedsearch.md
明细查询/合计GetDetailPage / GetDetailSummaryDetailQuery(override)detail.md
OR 查询前端 wheres + 可选 QueryRelativeExpressionor.md
新建Add / AddAsyncAddOnExecuting、AddOnExecuted、AddWorkFlow*add.md
修改Update / UpdateAsyncUpdateOnExecuting、UpdateOnExecutedupdate.md
删除Del / DelAsyncDelOnExecuting、DelOnExecuteddel.md
审批AuditAuditWorkFlow*、AuditOn*audit.md
反审AntiAuditAntiAuditOn*antiAudit.md
导入ImportImportOn*importData.md
导出ExportExportOn*、ExportColumnsexportData.md
上传UploadUploadFolder 等字段upload.md
流程信息GetTableWorkflow 等扩展方法flow.md

与前端配合

后台前端(标准生成页)
options.Value / QueryRelativeListsearchBeforeparam.value = ...
GetPageData 返回 res.extrasearchAfter(rows, res) 第二参数
Add/Update 校验失败 Message前端 addBefore / updateBefore 也可做 UI 层校验(双端可选)

前端 Hook 见 生成页面文档 / view-grid;后台以 Partial Service + Func 为准处理数据库与事务。

Last Updated 2026/6/15 15:42:48