内部单据预算操作
说明
可用于外部系统关联每刻内部单据,冻结、占用、释放每刻的层级预算。
注:
- 仅支持当前已生效的层级预算,单据类型支持申请、报销和合同。ps:后续支持平/层级
- 一次请求对应一张单据,freezeBudgets、occupyBudgets、unfreezeBudgets 必须恰好一个非空。
- 冻结先匹配预算;占用和释放按 uniqueCode 查找原冻结明细,不重新匹配。占用将冻结金额转为占用,释放仅支持释放冻结金额。
- 三种动作的 amount 均不得为负数。占用、释放金额换算后不能超过原明细的剩余冻结金额。
- 此接口为整批成功或整批失败,一条数据错误则整批失败。
- 同一单据的 uniqueCode 在有余额时不能重复新增冻结;全部释放后可以重新冻结。相同释放请求再次调用,会再次扣减冻结余额。
- 未指定预算组织、科目业务编码时,需按对应预算组织和科目配置的匹配条件传参。
- 冻结明细中任一 ignoreWeakControl 为 true,整批忽略弱控提示,强控仍然生效。
- 币种与预算方案币种不一致时,按 exchangeTime 对应汇率换算;未传时取当前时间。
- 单据节点的预算动作由外部系统调用本接口处理。
接口限制
该接口单批默认最多支持1000条明细。
接口地址
/api/openapi/budget/operation
请求类型
POST
请求参数
参数说明
| 参数名称 |
类型 |
是否必填 |
参数说明 |
默认值 |
| formType |
String |
是 |
单据类型:PRECONSUME(申请)、REIMBURSE(报销)、CONTRACT(合同) |
|
| formDataCode |
String |
是 |
每刻单据内码 |
|
| formCode |
String |
否 |
单据号,传入时需与每刻单据一致 |
|
| formSubTypeBizCode |
String |
否 |
单据小类业务编码,传入时需与每刻单据一致 |
|
| freezeBudgets |
List<Object> |
三选一 |
冻结预算明细 |
|
| occupyBudgets |
List<Object> |
三选一 |
冻结转占用明细 |
|
| unfreezeBudgets |
List<Object> |
三选一 |
释放冻结预算明细 |
freezeBudgets 参数说明
| 参数名称 |
类型 |
是否必填 |
参数说明 |
默认值 |
| uniqueCode |
String(50) |
是 |
外部行数据唯一标识,同一批次不可重复,长度不超过50;同一单据下仍有余额时不能重复新增冻结 |
|
| budgetPlanBizCode |
String |
否 |
预算方案业务编码,指定时按该方案匹配预算 |
|
| orgMatch |
Object |
是 |
预算组织编码或组织匹配条件,见下表 |
|
| subjectMatch |
Object |
条件必填 |
预算科目编码或科目匹配条件;预算方案未配置科目匹配时可不传 |
|
| budgetTime |
long |
是 |
用于匹配预算期间的时间,精确到毫秒,例如:1648693651000 |
|
| amount |
BigDecimal |
是 |
本次冻结金额,不得为负数 |
|
| currency |
String |
是 |
币种,如人民币:CNY;与预算方案币种不一致时按汇率换算 |
|
| desc |
String |
否 |
事由、描述,长度小于200字符 |
|
| ignoreWeakControl |
Boolean |
否 |
弱控超标时是否忽略弱控提示强占预算;任一行为true时整批忽略弱控 |
false |
| exchangeTime |
long |
否 |
用于获取汇率的时间,精确到毫秒;未传时取当前时间 |
orgMatch:
| 字段名称 |
类型 |
是否必填 |
字段说明 |
默认值 |
| orgBizCode |
String |
否 |
预算组织业务编码,有值时不再使用下面的字段匹配预算组织 |
|
| departmentBizCode |
String |
否 |
用于匹配预算组织的部门业务编码 |
|
| employeesNo |
String |
否 |
用于匹配预算组织的员工工号 |
|
| legalEntityBizCode |
String |
否 |
用于匹配预算组织的公司抬头业务编码 |
|
| referenceDataDetailBizCodes |
List<String> |
否 |
用于匹配预算组织的自定义档案选项业务编码 |
subjectMatch:
| 字段名称 |
类型 |
是否必填 |
字段说明 |
默认值 |
| subjectBizCode |
String |
否 |
预算科目业务编码,有值时不再使用下面的字段匹配预算科目 |
|
| expenseTypeBizCode |
String |
否 |
用于匹配预算科目的费用类型业务编码 |
|
| referenceDataDetailBizCodes |
List<String> |
否 |
用于匹配预算科目的自定义档案选项业务编码 |
occupyBudgets、unfreezeBudgets 参数说明
| 参数名称 |
类型 |
是否必填 |
参数说明 |
默认值 |
| uniqueCode |
String(50) |
是 |
当前单据下原冻结明细的唯一标识,同一批次不可重复 |
|
| amount |
BigDecimal |
是 |
本次转占用或释放金额,不得为负数;换算后不能超过剩余冻结金额 |
|
| currency |
String |
是 |
币种,如人民币:CNY;与预算方案币种不一致时按汇率换算 |
|
| desc |
String |
否 |
事由、描述,长度小于200字符 |
|
| exchangeTime |
long |
否 |
用于获取汇率的时间,精确到毫秒;未传时取当前时间 |
参数样例
冻结
{
"formType": "PRECONSUME",
"formDataCode": "FORM_DEMO_001",
"freezeBudgets": [
{
"uniqueCode": "A",
"budgetPlanBizCode": "PLAN_2026",
"orgMatch": {
"orgBizCode": "ORG_SALES"
},
"subjectMatch": {
"subjectBizCode": "SUBJECT_TRAVEL"
},
"budgetTime": 1791849600000,
"amount": "100.00",
"currency": "CNY",
"desc": "申请时冻结",
"ignoreWeakControl": false,
"exchangeTime": 1791849600000
}
]
}
冻结转占用
{
"formType": "PRECONSUME",
"formDataCode": "FORM_DEMO_001",
"occupyBudgets": [
{
"uniqueCode": "A",
"amount": "80.00",
"currency": "CNY",
"desc": "审批完成转占用"
}
]
}
释放剩余冻结金额
{
"formType": "PRECONSUME",
"formDataCode": "FORM_DEMO_001",
"unfreezeBudgets": [
{
"uniqueCode": "A",
"amount": "20.00",
"currency": "CNY",
"desc": "释放剩余冻结金额"
}
]
}
响应参数
响应参数说明
| 参数名称 |
类型 |
是否必填 |
参数说明 |
| code |
String |
是 |
ACK:成功;NACK:失败 |
| message |
String |
是 |
返回消息,失败时为错误说明 |
| data |
Object |
否 |
本接口不返回明细结果,为null |
| errorCode |
String |
否 |
错误码,无值时为null |
| success |
Boolean |
是 |
是否成功 |
参数样例
正确示例返回
{
"code": "ACK",
"message": "成功",
"data": null,
"errorCode": null,
"success": true
}
错误示例返回
{
"code": "NACK",
"message": "预算操作金额不能为负数",
"data": null,
"errorCode": "999997",
"success": false
}
常见错误提示说明--message
| 错误提示 |
说明 |
| freezeBudgets、occupyBudgets、unfreezeBudgets 必须恰好一个非空 |
一次请求只能执行一种预算动作 |
| 预算明细单批上限为 1000 |
明细数量超过单批上限 |
| uniqueCode 必填且最长 50 字符 |
uniqueCode为空或长度超过50 |
| 同批 uniqueCode 不得重复 |
同一批次的明细标识重复 |
| 预算操作金额不能为负数 |
冻结、占用、释放均不允许负数金额 |
| 事由长度必须小于 200 个字符 |
desc长度达到或超过200 |
| 未找到可操作的冻结预算 |
原冻结明细不存在或已无冻结余额 |
| 业务行仍有未释放余额 |
同一单据下该uniqueCode不能重复新增冻结 |
| 操作金额超过剩余冻结金额 |
本次转占用或释放金额超过剩余冻结余额 |
| 超出预算强控金额 |
冻结金额触发预算强控 |
| 超出预算弱控金额 |
冻结金额触发弱控,且未忽略弱控 |