报销单费用导入接口
说明
该接口用于进行费用导入,可以用于将其他来源的费用导入到每刻系统中.
注意事项
- 该接口为部分失败,在进行费用导入时,如果一次导入5条费用,其中一条失败,不会影响其他四条数据的正常导入。
- 每次导入最大值为10条费用,导入过多费用时,每刻会将多出的费用进行遗弃。
- 如需在费用上关联发票,可以在费用导入成功后,将返回的expenseCode添加到发票导入接口的入参内。
- 根据返回的integrity可以识别该费用是否必填项传入完整:
- true:所有必填项均传入成功
- false
- 接口可导入的必填项未导入完整
- 不支持接口导入,但表单设置必填(此情况需要设置单据导入为草稿或者去除费用上对应组件的必填设置)
接口地址
/api/openapi/receive/expense
请求类型
POST
请求参数
参数说明
在各个表单中,分为系统字段、业务字段及普通字段,系统字段在表单配置界面中不会显示,如expenseTypeBizCode 字段。业务字段及普通字段,可以通过单据配置界面中的开发者模式来查看该字段导入时的的key值,其中普通字段的key值,也可以在界面中进行配置修改
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| employeeId | String(25) | 是 | 需要导入的对应员工的工号 |
| expenseList | List<expenseList> | 是 | 费用列表,根据费用表单配置,分为对公费用参数和对私费用参数 |
expenseList费用列表
对公费用参数说明
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| consumeAmount | AmountInput | 是 | 付款金额 系统内对应:到票全部支付 '付款金额' 预付未到票 '付款金额' 到票核销 '付款金额' 到票部分支付或不支付 '付款金额' 支付前期已到的发票 '付款金额' |
| expenseTypeBizCode | String | 是 | 费用类型业务编码 |
| corpExpense | boolean | 是 | 是否对公费用,需要填写true |
| corpType | String | 是 | 业务场景: ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票) |
| corpExpenseResponsibleEmpIds | List<String> | 否 | 责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) |
| nonReceiptAmount | AmountInput | 遵循表单配置 | 未到票金额(预付未到票场景必填) |
| receiptAmount | AmountInput | 否 | 本次到票金额(到票全部支付/到票部分支付或不支付/到票核销 三种场景必填) |
| forecastReceiptDate | Long | 遵循表单配置 | 预计到票时间(预付未到票场景必填) |
| consumeLocation | CityInput | 遵循表单配置 | 消费地点 |
| receiptDate | Long | 遵循表单配置 | 到票时间(到票核销/到票部分支付或不支付 两种场景必填) |
| viceExpenseTypeBizCode | String | 遵循表单配置 | 辅助费用类型业务编码。仅在费用表单配置了辅助费用类型组件时生效;未传时按表单默认值配置处理 |
| tradingPartnerBizCode | String | 遵循表单配置 | 往来单位业务编码 |
| customObject | CustomObject | 遵循表单配置 | 自定义普通字段 |
| allocationList | List<ExpenseAllocation> | 否 | 分摊列表(支付前期已到的发票 场景不支持分摊) |
| allocationRuleBizCode | String | 否 | 分摊规则业务编码,分摊列表不为空则必填; |
| amortizationList | List<ExpenseAmortizationTemp> | 否 | 摊销列表(摊销金额合计需等于费用金额) |
| deductionTempList | List<ExpenseDeductionTemp> | 否 | 到票核销预付的明细记录(到票核销费用必填) |
| payBeforeTempList | List<ExpenseDeductionTemp> | 否 | 支付前期已到的发票的明细记录(支付前期已到的发票费用必填) |
| noTaxSuiteTemp | NoTaxInput | 否 | 不含税组件(只有对公费用预付未到票场景支持) |
| receiptMedium | String | 否 | 收据介质。保证金/押金费用有效,可选值:PAPER(纸质)、ELECTRONIC(电子) |
| receiptAttachments | List<Attachment> | 否 | 收据附件。保证金/押金费用有效,单次最多 30 个,最终保存为费用附件并打 DEPOSIT_RECEIPT 标签 |
| bizCode | String | 否 | 自定义费用编码(支持外部系统编码,系统内唯一,无法更新) |
| splitByAmount | boolean | 否 | 是否按费用金额拆分,传 true 触发拆分;缺省或 false 不拆分 |
| subExpenseList | List<对公费用参数> | 否 | 子费用列表,结构等同上述对公费用参数说明;明细拆分不支持;子费用不允许嵌套 |
金额拆分:主费用金额作为拆分总金额,子费用金额从中扣减(由服务端按拆分处理);企业开启拆分金额合计校验开关(
EXPENSE_SPLITTING_AMOUNT_LIMIT)时,校验子费用金额合计 ≤ 主费用金额,超限返回错误;对公费用同时校验到票金额(receiptAmount)与付款金额(consumeAmount)两个维度。对私费用拆分同此规则。 对公费用拆分仅支持以下业务场景:ALL_RECEIPTS(全部到票)、RECEIPT_DEDUCTION(到票核销)、RECEIPT_PAY_SOME(到票部分支付或不支付);其他对公业务场景(如NO_RECEIPT预付未到票、PAY_BEFORE_RECEIPT支付前期已到的发票)不支持费用金额拆分。
到票核销记录参数说明 ExpenseDeductionTemp
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| recordExpenseCode | String | 是 | 被核销费用的唯一编码(费用导入接口返回的expenseCode 或 报销单详情返回的被核销费用的code) |
| deductionAmount | AmountInput | 是 | 核销金额 |
支付前期已到票记录参数说明 ExpenseDeductionTemp
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| recordExpenseCode | String | 是 | 被核销费用的唯一编码(费用导入接口返回的expenseCode 或 报销单详情返回的被核销费用的code) |
| deductionAmount | AmountInput | 是 | 支付金额 |
对私费用参数说明
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| consumeAmount | AmountInput | 条件必填 | 费用金额。使用劳务费个税的费用金额模式或税后应付金额模式时可省略,由系统按劳务税结果生成 |
| expenseTypeBizCode | String | 是 | 费用类型业务编码 |
| corpExpense | String | 是 | 是否对公费用,需要填写false |
| consumeTime | DateInput | 是 | 消费时间 |
| consumeLocation | CityInput | 遵循表单配置 | 消费地点 |
| viceExpenseTypeBizCode | String | 遵循表单配置 | 辅助费用类型业务编码。仅在费用表单配置了辅助费用类型组件时生效;未传时按表单默认值配置处理 |
| customObject | CustomObject | 遵循表单配置 | 自定义普通字段 |
| trainSeat | String | 遵循表单配置 | 火车席位: BUSINESS-商务座 SPECIAL-特等座 FIRST-一等座 SECOND-二等座 SOFT_SLEEPER-软卧 ADVANCED_SOFT_SLEEPER-高级软卧 HARD_SLEEPER-硬卧 SOFT-软座 HARD-硬座 STANDING-无座 |
| airClass | String | 是 | 飞机舱位: FIRST-头等舱 BUSINESS-商务舱 ECONOMY-经济舱 |
| shipClass | String | 是 | 轮船舱位: VIP-贵宾舱 SPECIAL-特等舱 FIRST-一等舱 SECOND_A-二等A SECOND_B-二等B THIRD_A-三等A THIRD_B-三等B ECONOMY-经济舱 |
| allocationList | List<ExpenseAllocation> | 否 | 分摊列表 |
| allocationRuleBizCode | String | 否 | 分摊规则业务编码,分摊列表不为空则必填; |
| amortizationList | List<ExpenseAmortizationTemp> | 否 | 摊销列表(摊销金额合计需等于费用金额) |
| labourTax | object | 否 | 劳务费个税 |
| splitByAmount | boolean | 否 | 是否按费用金额拆分,传 true 触发拆分;缺省或 false 不拆分 |
| subExpenseList | List<对私费用参数> | 否 | 子费用列表,结构等同上述对私费用参数说明;明细拆分不支持;子费用不允许嵌套 |
摊销参数说明 ExpenseAmortizationTemp
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| amount | number | 是 | 摊销金额 |
| amortizedDateStr | String | 是 | 摊销日期,格式:yyyy-MM |
分摊参数说明 ExpenseAllocation
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| allocatedAmount | number | 是 | 分摊金额 |
| legalEntityBizCode | String | 是 | 公司抬头业务编码 |
| coverUserNo | String | 是 | 承担人工号 |
| coverDepartmentBizCode | String | 是 | 承担部门编码 |
| customObject | CustomObject | 遵循表单配置 | 自定义普通字段 |
劳务费个税参数说明 labourTax
参数说明
OpenAPI 导入的劳务费默认计算预扣个税。合法入参组合如下:
| 表单能力 | 计算起点 | 必填字段 | 计算规则 |
|---|---|---|---|
| 未开启“按照费用金额扣除减除税额后的金额计算个税” | 费用金额或税后应付金额 | amountType、amount |
pre 表示费用金额,after 表示税后应付金额;未启用时减除税额按 0 |
| 已开启上述能力 | 费用金额 | amountType=pre、amount |
保持费用金额,税前金额 = 费用金额 - 减除税额,再正算预扣个税和税后金额 |
| 已开启上述能力 | 税后应付金额 | amountType=after、amount |
税后金额 = 税后应付金额 - 减除税额,再反算税前金额和预扣个税,费用金额按税前金额加减除税额生成 |
| 已开启上述能力 | 费用金额(历史兼容模式) | amountIncludeTaxDeduction |
兼容字段存在时优先;计算结果与 amountType=pre 相同 |
同时传 amountIncludeTaxDeduction 和 amountType/amount 时,为兼容旧调用方,系统优先采用历史费用金额模式。afterTaxPayableAmount 不等于费用金额;费用金额读取费用对象的 consumeAmount。
| 字段名称 | 字段类型 | 是否必填 | 字段说明 |
|---|---|---|---|
| amountType | String | 条件必填 | pre(费用金额)或 after(税后应付金额) |
| amount | AmountInput | 条件必填 | pre 模式下为费用金额;after 模式下为税后应付金额 |
| amountIncludeTaxDeduction | AmountInput | 条件必填 | 开启减除税额能力后的兼容费用金额字段;存在时优先于 amountType/amount |
| taxDeduction | AmountInput | 否 | 减除税额;为空或金额为空时按 0 处理 |
税后应付金额反算示例
以下费用表单已开启减除税额能力。税后应付金额为 980 CNY,减除税额为 100 CNY:
{
"employeeId": "USER001",
"expenseList": [
{
"corpExpense": false,
"expenseTypeBizCode": "LABOUR001",
"consumeTime": 1784736000000,
"labourTax": {
"amountType": "after",
"amount": {
"amount": 980,
"currency": "CNY"
},
"taxDeduction": {
"amount": 100,
"currency": "CNY"
}
}
}
]
}
系统先得到税后金额 980 - 100 = 880,再反算出税前金额 900、预扣个税 20。导入结果保留 amountType=after、amount=980,并返回 afterTaxPayableAmount=980;费用金额 consumeAmount 按 preTaxAmount + taxDeduction 生成,为 1000。
本节“导入”仅指 OpenAPI 费用导入接口,不包含 Excel 导入、初始数据导入或
batch-import-service。既有合法入参继续兼容,本次变更不是 Breaking Change。
参数样例
consumeTime 可传单日期 currentTime 或日期区间 timeRange;实际请求按费用表单组件类型选择其一。日期区间中的 startDate、endDate 分别表示开始时间和结束时间。
{
"employeeId": "USER001",
"expenseList": [
{
"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"
]
},
{
"consumeAmount": {
"amount": 150,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "LPP12123",
"corpType": "ALL_RECEIPTS",
"receiptDate": 1603310000000,
"tradingPartnerBizCode": "015208mk2020-08-28",
"customObject": {},
"corpExpenseResponsibleEmpIds": [
"no001",
"no002"
]
},
{
"consumeAmount": {
"amount": 100,
"currency": "CNY"
},
"consumeTime": {
"currentTime": 1594197456845
},
"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"
}
]
}
}
}
],
"amortizationList": [
{
"amount": 30,
"amortizedDateStr": "2021-01"
},
{
"amount": 30,
"amortizedDateStr": "2021-02"
},
{
"amount": 40,
"amortizedDateStr": "2021-03"
}
]
},
{
"consumeAmount": {
"amount": 1000,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "EXTYPE002",
"corpType": "ALL_RECEIPTS",
"receiptAmount": {
"amount": 1000,
"currency": "CNY"
},
"splitByAmount": true,
"subExpenseList": [
{
"consumeAmount": {
"amount": 600,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "EXTYPE002",
"corpType": "ALL_RECEIPTS",
"receiptAmount": {
"amount": 600,
"currency": "CNY"
}
},
{
"consumeAmount": {
"amount": 400,
"currency": "CNY"
},
"corpExpense": true,
"expenseTypeBizCode": "EXTYPE002",
"corpType": "ALL_RECEIPTS",
"receiptAmount": {
"amount": 400,
"currency": "CNY"
}
}
]
},
{
"consumeAmount": {
"amount": 500,
"currency": "CNY"
},
"corpExpense": false,
"expenseTypeBizCode": "X002",
"consumeTime": {
"currentTime": 1594197456845
},
"splitByAmount": true,
"subExpenseList": [
{
"consumeAmount": {
"amount": 300,
"currency": "CNY"
},
"corpExpense": false,
"expenseTypeBizCode": "X002",
"consumeTime": {
"currentTime": 1594197456845
}
},
{
"consumeAmount": {
"amount": 200,
"currency": "CNY"
},
"corpExpense": false,
"expenseTypeBizCode": "X002",
"consumeTime": {
"currentTime": 1594197456845
}
}
]
}
]
}
响应参数说明
全部成功时响应参数示例
{
"code": "ACK",
"message": "操作成功",
"data": {
"successData": [
{
"idx": 0,
"expenseCode": "EXPCODE001",
"integrity": true
}
]
},
"success": true
}
存在失败时响应参数示例
费用行异常信息返回在 data.errorData.errorMessage;idx 对应请求参数 expenseList 中从 0 开始的下标。
{
"code": "ACK",
"message": "操作成功",
"data": {
"errorData": [
{
"idx": 0,
"key": null,
"errorCode": "10000",
"errorMessage": "费用类型不存在"
}
],
"successData": [
{
"idx": 1,
"expenseCode": "EXPCODE001"
}
]
},
"success": false
}
employeeId 工号错误时,异常信息返回在顶层 message:
{
"code": "NACK",
"message": "员工编号错误",
"data": null,
"requestId": "085d530d3a2949b4",
"errorCode": null,
"success": false
}
金额拆分校验失败响应示例
"code": "ACK",
"message": "操作成功",
"data": {
"errorData": [
{
"idx": 3,
"key": "message.expense.split.amount.total.exceed",
"errorCode": "10000",
"errorMessage": "拆分金额合计不得超过拆分总金额"
}
],
"successData": [
{
"idx": 0,
"expenseCode": "EXPCODE001",
"integrity": true
}
]
},
"success": false
}
修改记录
2023-05-23 新增费用导入接口
2023-07-10 新增费用导入不含税金额接口
2025-05-31 新增摊销列表字段(amortizationList)
2026-06-29 新增辅助费用类型业务编码viceExpenseTypeBizCode
2026-07-06 新增费用金额拆分功能(splitByAmount/subExpenseList)