1. 项目背景与核心价值
易飞ERP作为国内主流的企业资源计划系统,其审核流程是企业内部管控的关键环节。传统审核操作通常需要登录系统界面逐一点击完成,对于批量处理或系统集成场景效率较低。我们团队通过WebAPI方式实现了对所有单据类型的审核/撤审功能封装,让企业能够:
- 通过HTTP调用直接触发审核流程
- 与内部其他系统无缝集成
- 实现批量自动化处理
- 构建自定义审核工作台
这个方案特别适合以下场景:
- 与OA系统对接实现电子审批流
- 与MES系统联动实现生产工单自动审核
- 财务系统对接实现凭证批量审核
- 移动端审批应用开发
2. 技术架构设计
2.1 整体方案设计
采用三层架构实现:
[客户端] -> [WebAPI服务层] -> [易飞ERP数据库]服务层使用.NET Core 3.1开发,主要组件包括:
- 身份认证中间件
- 请求参数验证器
- 单据类型路由器
- 审核操作执行器
- 结果包装器
2.2 关键技术实现
2.2.1 用户认证方案
采用JWT+动态密钥方式:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])), ValidateIssuer = false, ValidateAudience = false }; });2.2.2 数据库访问层
使用Dapper进行高效数据访问:
public int ExecuteAudit(string docType, string docNo, string userCode) { using (var conn = new SqlConnection(_config.GetConnectionString("ERP"))) { return conn.Execute( "UPDATE " + GetTableName(docType) + " SET AuditStatus = 1, Auditor = @userCode, AuditTime = GETDATE()" + " WHERE DocNo = @docNo", new { docNo, userCode }); } }3. API接口规范
3.1 审核接口
POST /api/audit Content-Type: application/json { "DocType": "PO", // 单据类型 "DocNo": "PO20230001", // 单据编号 "UserCode": "ADMIN" // 审核人工号 }响应示例:
{ "Success": true, "Message": "审核成功", "Data": { "DocNo": "PO20230001", "AuditTime": "2023-06-15T14:30:22" } }3.2 撤审接口
POST /api/unAudit 参数格式与审核接口相同4. 安全控制要点
4.1 权限验证矩阵
| 操作类型 | 所需权限 | 数据权限控制 |
|---|---|---|
| 采购单审核 | PO_AUDIT | 供应商范围限制 |
| 销售单审核 | SO_AUDIT | 客户范围限制 |
| 生产单审核 | MO_AUDIT | 车间范围限制 |
4.2 审计日志记录
所有审核操作均记录完整操作日志:
CREATE TABLE AuditLog ( LogID INT IDENTITY PRIMARY KEY, DocType VARCHAR(10), DocNo VARCHAR(20), OperationType VARCHAR(10), Operator VARCHAR(20), OperationTime DATETIME, ClientIP VARCHAR(15) );5. 测试环境部署
5.1 环境准备
- 安装IIS 10.0+
- 安装.NET Core 3.1运行时
- 配置数据库连接字符串
5.2 测试用例
使用Postman进行接口测试:
- 获取Token
POST /api/auth Body: {"UserCode":"test","Password":"123456"}- 带Token调用审核接口
GET /api/audit Headers: Authorization: Bearer {token}6. 常见问题解决方案
6.1 错误代码表
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 4001 | 无效单据类型 | 检查DocType参数 |
| 4003 | 单据不存在 | 确认DocNo是否正确 |
| 5001 | 数据库连接失败 | 检查连接字符串 |
| 6001 | 无操作权限 | 检查用户权限配置 |
6.2 性能优化建议
- 启用数据库连接池
- 对高频单据类型建立缓存
- 批量操作接口实现
7. 扩展应用场景
7.1 与RPA集成
通过API实现自动化审核流程:
import requests def auto_audit(doc_list): token = get_token() for doc in doc_list: resp = requests.post( API_URL + '/audit', json=doc, headers={'Authorization': f'Bearer {token}'} ) if not resp.json()['Success']: send_alert(doc['DocNo'])7.2 移动审批应用
开发微信小程序审批界面:
Page({ onAudit: function() { wx.request({ url: 'https://api.xxx.com/audit', method: 'POST', data: { DocType: this.data.docType, DocNo: this.data.docNo, UserCode: app.globalData.userCode }, success: res => { if(res.data.Success) { wx.showToast({title: '审核成功'}) } } }) } })8. 实施注意事项
- 生产环境必须启用HTTPS
- 建议配置API网关进行流量控制
- 重要单据建议增加二次确认机制
- 定期备份审计日志
- 接口版本控制方案建议:
- URL路径版本控制(/v1/audit)
- 通过Header指定版本
- 默认兼容最近两个版本
实际部署中发现,当单日审核操作超过5000次时,建议:
- 增加Redis缓存层
- 采用批量审核接口
- 优化数据库索引
对于特殊单据类型(如财务凭证),我们额外实现了:
- 电子签名验证
- 审核结果回调通知
- 关联单据联动审核