报销退回后重新走流程-接口调用示例.md
11.2 KB
报销退回后修改并重新走流程 - 接口调用示例
前置条件
- 已创建报销申请并提交审批
- 申请已被退回(状态为"已退回")
- 申请ID:
767672243453953285(示例) - Token:
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(需要替换为实际token)
完整流程
步骤1:退回申请(如果还未退回)
接口地址: POST /api/Extend/LqReimbursementApplication/{id}/Actions/Approve
请求参数:
result: 审批结果,值为退回(需要URL编码为%E9%80%80%E5%9B%9E)opinion: 退回原因
cURL 示例:
curl -X POST "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285/Actions/Approve?result=%E9%80%80%E5%9B%9E&opinion=%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E9%87%91%E9%A2%9D" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json"
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": null
}
步骤2:查看退回后的状态
接口地址: GET /api/Extend/LqReimbursementApplication/{id}
cURL 示例:
curl -X GET "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json"
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": {
"form": {
"id": "767672243453953285",
"applicationUserId": "admin",
"applicationUserName": "管理员",
"applicationStoreId": "1649328471923847168",
"amount": "200.00",
...
},
"approvalStatus": "已退回",
"currentNodeOrder": 0,
"returnedReason": "需要修改金额",
"nodes": [
{
"nodeOrder": 1,
"nodeName": "部门经理审批",
"approvalRecords": [
{
"approverName": "管理员",
"approvalResult": "退回",
"approvalOpinion": "需要修改金额",
"approvalTime": 1765192675000
}
]
}
]
}
}
步骤3:修改报销单
接口地址: PUT /api/Extend/LqReimbursementApplication/{id}
请求体参数:
{
"id": "767672243453953285",
"applicationUserId": "admin",
"applicationUserName": "管理员",
"applicationStoreId": "1649328471923847168",
"applicationTime": 1765123200000,
"amount": "300.00",
"selectedPurchaseRecordIds": [],
"purchaseRecordsId": null
}
参数说明:
id: 申请编号(必填)applicationUserId: 申请人编号(可选,不修改可不传)applicationUserName: 申请人姓名(可选,不修改可不传)applicationStoreId: 申请门店ID(可选,不修改可不传)applicationTime: 申请时间(时间戳,可选)amount: 总金额(可选,要修改的字段)selectedPurchaseRecordIds: 选中的购买记录ID列表(可选,数组)purchaseRecordsId: 关联购买编号(可选,字符串,多个用逗号分隔)
cURL 示例:
curl -X PUT "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json" \
-d '{
"id": "767672243453953285",
"amount": "300.00"
}'
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": null
}
注意:
- 只有"待审批"(CurrentNodeOrder=0)或"已退回"状态的申请才能修改
- 如果状态为"审批中"、"已通过"、"未通过",修改会被拒绝
步骤4:重新提交审批
接口地址: POST /api/Extend/LqReimbursementApplication/{id}/Actions/SubmitApproval
cURL 示例:
curl -X POST "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285/Actions/SubmitApproval" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json"
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": null
}
说明:
- 重新提交审批后,会创建新的"待审批"记录
- 之前的"退回"记录会被保留,不会删除
- 申请状态会从"已退回"变为"审批中"
步骤5:审批通过
接口地址: POST /api/Extend/LqReimbursementApplication/{id}/Actions/Approve
请求参数:
result: 审批结果,值为通过(需要URL编码为%E9%80%9A%E8%BF%87)opinion: 审批意见(可选)
cURL 示例:
curl -X POST "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285/Actions/Approve?result=%E9%80%9A%E8%BF%87&opinion=%E4%BF%AE%E6%94%B9%E5%90%8E%E5%AE%A1%E6%89%B9%E9%80%9A%E8%BF%87" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json"
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": {
"approvalStatus": "已通过"
}
}
步骤6:查看最终状态和审批记录
接口地址: GET /api/Extend/LqReimbursementApplication/{id}
cURL 示例:
curl -X GET "http://localhost:2011/api/Extend/LqReimbursementApplication/767672243453953285" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJhZG1pbiIsIkFjY291bnQiOiJhZG1pbiIsIlVzZXJOYW1lIjoi566h55CG5ZGYIiwiQWRtaW5pc3RyYXRvciI6MSwiVGVuYW50SWQiOiJkYiIsIlRlbmFudERiTmFtZSI6ImxxZXJwX3Rlc3QiLCJpYXQiOjE3NjUxOTIzMDgsIm5iZiI6MTc2NTE5MjMwOCwiZXhwIjoxNzY1MjQ2MzA4LCJpc3MiOiJ5aW5tYWlzb2Z0IiwiYXVkIjoieWlubWFpc29mdCJ9.5YBxyOU5SmmIldlVp6V7uclsLrzLR8KIp51kraW7EGQ" \
-H "Content-Type: application/json"
返回示例:
{
"code": 200,
"msg": "操作成功",
"data": {
"form": {
"id": "767672243453953285",
"amount": "300.00",
...
},
"approvalStatus": "已通过",
"currentNodeOrder": 2,
"nodes": [
{
"nodeOrder": 1,
"nodeName": "部门经理审批",
"approvalRecords": [
{
"approverName": "管理员",
"approvalResult": "退回",
"approvalOpinion": "需要修改金额",
"approvalTime": 1765192675000
},
{
"approverName": "管理员",
"approvalResult": "通过",
"approvalOpinion": "修改后审批通过",
"approvalTime": 1765192762000
}
]
}
]
}
}
说明:
- 审批记录中包含完整的审批历史
- "退回"记录和"通过"记录都会保留
- 可以清楚地看到退回原因和重新审批的结果
完整流程总结
- 退回申请 → 状态变为"已退回",当前节点为0
- 修改报销单 → 修改需要调整的字段(金额、购买记录等)
- 重新提交审批 → 状态变为"审批中",创建新的"待审批"记录
- 审批通过 → 状态变为"已通过",审批记录中包含退回和通过两条记录
注意事项
URL编码:中文字符需要URL编码
退回→%E9%80%80%E5%9B%9E通过→%E9%80%9A%E8%BF%87
状态检查:
- 只有"待审批"或"已退回"状态的申请才能修改
- 只有"审批中"状态的申请才能进行审批操作
审批记录:
- 退回记录会被保留,不会删除
- 重新提交审批后会创建新的"待审批"记录
- 审批记录按时间顺序显示,包含完整的审批历史
Token:所有接口都需要在Header中携带有效的Authorization Token
JavaScript/Axios 示例
const axios = require('axios');
const BASE_URL = 'http://localhost:2011';
const TOKEN = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const APPLICATION_ID = '767672243453953285';
// 1. 退回申请
async function returnApplication() {
const response = await axios.post(
`${BASE_URL}/api/Extend/LqReimbursementApplication/${APPLICATION_ID}/Actions/Approve`,
null,
{
headers: { Authorization: TOKEN },
params: {
result: '退回',
opinion: '需要修改金额'
}
}
);
return response.data;
}
// 2. 修改报销单
async function updateApplication() {
const response = await axios.put(
`${BASE_URL}/api/Extend/LqReimbursementApplication/${APPLICATION_ID}`,
{
id: APPLICATION_ID,
amount: '300.00'
},
{
headers: { Authorization: TOKEN }
}
);
return response.data;
}
// 3. 重新提交审批
async function resubmitApproval() {
const response = await axios.post(
`${BASE_URL}/api/Extend/LqReimbursementApplication/${APPLICATION_ID}/Actions/SubmitApproval`,
null,
{
headers: { Authorization: TOKEN }
}
);
return response.data;
}
// 4. 审批通过
async function approveApplication() {
const response = await axios.post(
`${BASE_URL}/api/Extend/LqReimbursementApplication/${APPLICATION_ID}/Actions/Approve`,
null,
{
headers: { Authorization: TOKEN },
params: {
result: '通过',
opinion: '修改后审批通过'
}
}
);
return response.data;
}
// 完整流程
async function completeFlow() {
try {
// 1. 退回
await returnApplication();
console.log('✅ 申请已退回');
// 2. 修改
await updateApplication();
console.log('✅ 申请已修改');
// 3. 重新提交
await resubmitApproval();
console.log('✅ 已重新提交审批');
// 4. 审批通过
await approveApplication();
console.log('✅ 审批已通过');
} catch (error) {
console.error('❌ 流程执行失败:', error.response?.data || error.message);
}
}