报销单费用更新接口
说明
该接口用于进行报销单费用更新,可以用于将已关联报销单的费用更新.
注意事项
- 该接口为部分失败,在进行费用更新时,如果一次更新5条费用,其中一条失败,不会影响其他四条数据的正常更新。
- 每次更新最大值为10条费用,导入过多费用时,每刻会提示费用超过支持最大值10条。
- 更新的费用需要满足:a.更新费用已关联报销单 b.费用关联的报销单属于草稿状态或驳回至可编辑状态.
- 费用更新传值,若不传则默认复用原费用对应值,传则按最新值进行更新。(expenseTypeBizCode费用类型改变时,则需要传全量值)
- 以下特殊费用字段全覆盖且以最新传值进行更新,不复用旧值:
a.allocationRuleBizCode、allocationList(分摊信息)
b.customObject(自定义字段信息)
c.corpExpense(是否对公费用)
6.根据返回的integrity可以识别该费用是否必填项传入完整:
7.对公费用场景暂不支持:到票核销、支付前期已到的发票 8.该接口不支持费用金额拆分。即使传入- true:所有必填项均传入成功 - false:存在必填项未传入splitByAmount/subExpenseList也不会被处理(不执行拆分),相关字段不生效。如需使用金额拆分导入能力,请使用创建接口POST /api/openapi/receive/expense。
接口地址
/api/openapi/receive/expense/update
请求类型
POST
请求参数
参数说明
在各个表单中,分为系统字段、业务字段及普通字段,系统字段在表单配置界面中不会显示,如expenseTypeBizCode 字段。业务字段及普通字段,可以通过单据配置界面中的开发者模式来查看该字段导入时的的key值,其中普通字段的key值,也可以在界面中进行配置修改
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| employeeId | String(25) | 是 | 需要导入的对应员工的工号 |
| expenseList | List<expenseList> | 是 | 费用列表,根据费用表单配置,分为对公费用参数和对私费用参数 |
expenseList费用列表
对公费用参数说明
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| bizCode | String | 是 | 费用编码(用于更新费用的主键) |
| consumeAmount | AmountInput | 否 | 付款金额 系统内对应:到票全部支付 '付款金额' 预付未到票 '付款金额' 到票核销 '付款金额' 到票部分支付或不支付 '付款金额' 支付前期已到的发票 '付款金额' |
| expenseTypeBizCode | String | 否 | 费用类型业务编码,该字段若修改则需要全字段更新 |
| corpExpense | boolean | 是 | 是否对公费用,需要填写true |
| corpType | String | 否 | 业务场景: ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_PAY_SOME(到票部分支付或不支付) |
| corpExpenseResponsibleEmpIds | List<String> | 否 | 责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) |
| nonReceiptAmount | AmountInput | 否 | 未到票金额(预付未到票场景) |
| receiptAmount | AmountInput | 否 | 本次到票金额(到票全部支付/到票部分支付或不支付/到票核销 三种场景) |
| forecastReceiptDate | Long | 否 | 预计到票时间(预付未到票场景) |
| consumeLocation | CityInput | 否 | 消费地点.不传则复用旧值,传空对象则清除. |
| receiptDate | Long | 否 | 到票时间(到票核销/到票部分支付或不支付 两种场景) |
| tradingPartnerBizCode | String | 否 | 往来单位业务编码 |
| customObject | CustomObject | 否 | 自定义普通字段.不传则复用旧值,传值则全覆盖. |
| allocationList | List<ExpenseAllocation> | 否 | 分摊列表(支付前期已到的发票 场景不支持分摊).不传则复用旧值,传值则全覆盖 |
| allocationRuleBizCode | String | 否 | 分摊规则业务编码,分摊列表不为空则必填; |
| noTaxSuiteTemp | NoTaxInput | 否 | 不含税组件(只有对公费用预付未到票场景支持). 不传则复用旧值,传空对象则清除. |
| receiptMedium | String | 否 | 收据介质。保证金/押金费用有效,可选值:PAPER(纸质)、ELECTRONIC(电子)。不传复用旧值,传空清空 |
| receiptAttachments | List<Attachment> | 否 | 收据附件。保证金/押金费用有效,单次最多 30 个;不传复用旧收据附件,传空数组清空收据附件 |
预付款类型说明
当费用为 corpExpense=true 且 corpType=NO_RECEIPT,并且费用表单配置了“预付款类型”组件时,预付款类型通过 customObject 传入。更新接口中 customObject 为全覆盖字段:传入时会按最新值覆盖原费用自定义字段,不传则复用原值。
字段 key 以费用表单中“预付款类型”组件的业务编码为准;以下示例使用 noReceiptSubType。更新接口推荐在对象中传入预付款类型选项业务编码。
示例:
{
"customObject": {
"noReceiptSubType": {
"bizCode": "RDD25120412SSM5C0"
}
}
}
Attachment
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| url | String | 是 | 附件下载地址 |
| fileName | String | 否 | 文件名 |
| fileType | String | 是 | 文件后缀,如 pdf、jpg、png |
到票核销记录参数说明 ExpenseDeductionTemp
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| recordExpenseCode | String | 是 | 被核销费用的唯一编码(费用导入接口返回的expenseCode 或 报销单详情返回的被核销费用的code) |
| deductionAmount | AmountInput | 是 | 核销金额 |
支付前期已到票记录参数说明 ExpenseDeductionTemp
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| recordExpenseCode | String | 是 | 被核销费用的唯一编码(费用导入接口返回的expenseCode 或 报销单详情返回的被核销费用的code) |
| deductionAmount | AmountInput | 是 | 支付金额 |
对私费用参数说明
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| bizCode | String | 是 | 费用编码(用于更新费用的主键) |
| consumeAmount | AmountInput | 否 | 费用金额 |
| expenseTypeBizCode | String | 否 | 费用类型业务编码 |
| corpExpense | String | 否 | 是否对公费用,需要填写false |
| consumeTime | DateInput | 否 | 消费时间 |
| consumeLocation | CityInput | 否 | 消费地点.不传则复用旧值,传空对象则清除. |
| customObject | CustomObject | 否 | 自定义普通字段.不传则复用旧值,传值则全覆盖. |
| trainSeatStr | String | 否 | 火车席位: BUSINESS-商务座 SPECIAL-特等座 FIRST-一等座 SECOND-二等座 SOFT_SLEEPER-软卧 ADVANCED_SOFT_SLEEPER-高级软卧 HARD_SLEEPER-硬卧 SOFT-软座 HARD-硬座 STANDING-无座 不传则复用旧值,传空串则清除. |
| airClassStr | String | 否 | 飞机舱位: FIRST-头等舱 BUSINESS-商务舱 ECONOMY-经济舱 不传则复用旧值,传空串则清除. |
| shipClassStr | String | 否 | 轮船舱位: VIP-贵宾舱 SPECIAL-特等舱 FIRST-一等舱 SECOND_A-二等A SECOND_B-二等B THIRD_A-三等A THIRD_B-三等B ECONOMY-经济舱 不传则复用旧值,传空串则清除. |
| allocationList | List<ExpenseAllocation> | 否 | 分摊列表.不传则复用旧值,传值则全覆盖 |
| allocationRuleBizCode | String | 否 | 分摊规则业务编码,分摊列表不为空则必填; |
| labourTax | object | 否 | 劳务费个税.不传则复用旧值,传空对象则清除. |
分摊参数说明 ExpenseAllocation
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| allocatedAmount | number | 是 | 分摊金额 |
| legalEntityBizCode | String | 是 | 公司抬头业务编码 |
| coverUserNo | String | 是 | 承担人工号 |
| coverDepartmentBizCode | String | 是 | 承担部门编码 |
| customObject | CustomObject | 遵循表单配置 | 自定义普通字段 |
劳务费个税参数说明 labourTax
参数说明
不传 labourTax 时复用原劳务税和费用金额;显式传入时,系统根据本次请求的字段组合重新计算并同步费用金额。
| 表单能力 | 本次计算起点 | 必填字段 | 更新行为 |
|---|---|---|---|
| 未开启减除税额能力 | 费用金额或税后应付金额 | amountType、amount |
pre 为费用金额,after 为税后应付金额;未启用时减除税额按 0 |
| 已开启减除税额能力 | 费用金额 | amountType=pre、amount |
保持费用金额,先减除 taxDeduction 得到税前金额,再正算预扣个税和税后金额 |
| 已开启减除税额能力 | 税后应付金额 | amountType=after、amount |
表示修改了税后应付金额,按最新减除税额重新生成税后金额、税前金额、预扣个税和费用金额 |
| 已开启减除税额能力 | 费用金额(历史兼容模式) | amountIncludeTaxDeduction |
兼容字段存在时优先;行为与 amountType=pre 相同 |
taxDeduction 为空按 0。同时传历史兼容费用金额和 amountType/amount 时,amountIncludeTaxDeduction 优先。只修改减除税额时沿用当前主金额类型:费用金额口径使用 pre,税后应付金额口径使用 after,并按最新减除税额重新计算完整结果。
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| amountType | String | 条件必填 | pre(费用金额)或 after(税后应付金额) |
| amount | AmountInput | 条件必填 | pre 模式下为费用金额;after 模式下为税后应付金额 |
| amountIncludeTaxDeduction | AmountInput | 条件必填 | 费用金额模式的主金额;存在时优先 |
| taxDeduction | AmountInput | 否 | 减除税额;为空或金额为空时按 0 处理 |
修改税后应付金额
{
"employeeId": "USER001",
"expenseList": [
{
"bizCode": "EXPCODE003",
"labourTax": {
"amountType": "after",
"amount": {
"amount": 980,
"currency": "CNY"
},
"taxDeduction": {
"amount": 100,
"currency": "CNY"
}
}
}
]
}
该请求把税后应付金额修改为 980。系统先得到税后金额 880,再反算得到税前金额 900、预扣个税 20。保存结果保持 amountType=after、amount=980、afterTaxPayableAmount=980,费用金额更新为 1000。
仅修改减除税额
例如税后应付金额保持 8480,只把减除税额从 500 改为 800 时,继续使用 after:
{
"employeeId": "USER001",
"expenseList": [
{
"bizCode": "EXPCODE003",
"labourTax": {
"amountType": "after",
"amount": {
"amount": 8480,
"currency": "CNY"
},
"taxDeduction": {
"amount": 800,
"currency": "CNY"
}
}
}
]
}
税后应付金额保持 8480,系统按最新减除税额重新计算:税后金额为 7680,税前金额为 9142.86,预扣个税为 1462.86,费用金额为 9142.86 + 800 = 9942.86。保存结果保持 amountType=after、amount=8480。历史费用仅查询时不会自动重算,只有显式提交 labourTax 更新才应用新规则。
参数样例
{
"employeeId": "USER001",
"expenseList": [
{
"bizCode": "EXPCODE001",
"consumeAmount": {
"amount": 100,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "EXTYPE001",
"corpType": "NO_RECEIPT",
"nonReceiptAmount": {
"amount": 100,
"currency": "CNY"
},
"forecastReceiptDate": 1593310000000,
"tradingPartnerBizCode": "BIZ001",
"customObject": {
"CF1393": "我是单行文本",
"remarkText": "我是单行文本",
"detail": [
{
"CF1400": "我是单行文本",
"remarkText": "我是单行文本"
}
]
},
"corpExpenseResponsibleEmpIds": [
"no001",
"no002"
]
},
{
"bizCode": "EXPCODE002",
"consumeAmount": {
"amount": 150,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "LPP12123",
"corpType": "ALL_RECEIPTS",
"receiptDate": 1603310000000,
"tradingPartnerBizCode": "015208mk2020-08-28",
"customObject": {
},
"corpExpenseResponsibleEmpIds": [
"no001",
"no002"
]
},
{
"bizCode": "EXPCODE003",
"consumeAmount": {
"amount": 100,
"currency": "CNY"
},
"consumeTime": {
"timeRange": {
"startDate": 1566305347895,
"endDate": 1566305356934
}
},
"consumeLocation": {
"cityPair": {
"departure": "110001",
"destination": "310100"
},
"location": null
},
"corpExpense": false,
"expenseTypeBizCode": "X001",
"trainSeat": "SECOND",
"airClass": "FIRST",
"shipClass": "FIRST",
"allocationRuleBizCode": "A222",
"noTaxSuiteTemp": {
"taxRate": "1",
"taxAmount": "10",
"nonTaxAmount": "90"
},
"deductionTempList": [
{
"recordExpenseCode": "FD230202VWW9HEL",
"deductionAmount": {
"amount": 100,
"currency": "CNY"
}
},
{
"recordExpenseCode": "FD2302131O6J7NYE",
"deductionAmount": {
"amount": 50,
"currency": "CNY"
}
}
],
"payBeforeTempList": [
{
"recordExpenseCode": "FD230202VWW9HEL",
"deductionAmount": {
"amount": 100,
"currency": "CNY"
}
}
],
"receiptAmount": {
"amount": 100,
"currency": "CNY"
},
"allocationList": [
{
"allocatedAmount": "100",
"legalEntityBizCode": "E11",
"coverUserNo": "E11",
"coverDepartmentBizCode": "E11",
"customObject": {
"CF73": "1",
"CF54": {
"name": "每刻科技",
"bizCode": "CODE00124342",
"principalCodes": "MK001",
"value": [
{
"name": "每刻科技",
"bizCode": "CODE00124342",
"principalCodes": "MK001"
}
],
"definedList": [
{
"type": "SingleTextInput",
"label": "业务编码",
"display": false,
"primary": false,
"businessCode": "bizCode"
},
{
"type": "SingleTextInput",
"label": "供应商名称",
"display": true,
"primary": true,
"businessCode": "name"
},
{
"type": "SingleTextInput",
"label": "负责人",
"display": true,
"primary": false,
"businessCode": "principalCodes"
}
]
}
}
}
]
}
]
}
响应参数说明
全部成功时响应参数示例
{
"code": "ACK",
"message": "操作成功",
"data": {
"successData": [{
"expenseCode": "EXPCODE001" ,
"bizCode": "EXPCODE001",
"integrity":true
}]
},
"success": true
}
存在失败时响应参数示例
{
"code": "ACK",
"message": "操作成功",
"data": {
"errorData": [{
"key":"EXPCODE001",
"errorCode": "10000",
"errorMessage": "参数错误"
}],
"successData": [{
"expenseCode": "EXPCODE002",
"bizCode": "EXPCODE002",
"integrity":true
}]
},
"success": false
}
修改记录
2025-12-30 新增费用更新接口
2026-05-29 新增保证金/押金预付款类型、收据介质、收据附件说明
2026-06-30 调整保证金/押金预付款类型传参说明:更新推荐传选项业务编码对象