报销退回后重新走流程-接口调用示例.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
          }
        ]
      }
    ]
  }
}

说明:

  • 审批记录中包含完整的审批历史
  • "退回"记录和"通过"记录都会保留
  • 可以清楚地看到退回原因和重新审批的结果

完整流程总结

  1. 退回申请 → 状态变为"已退回",当前节点为0
  2. 修改报销单 → 修改需要调整的字段(金额、购买记录等)
  3. 重新提交审批 → 状态变为"审批中",创建新的"待审批"记录
  4. 审批通过 → 状态变为"已通过",审批记录中包含退回和通过两条记录

注意事项

  1. URL编码:中文字符需要URL编码

    • 退回%E9%80%80%E5%9B%9E
    • 通过%E9%80%9A%E8%BF%87
  2. 状态检查

    • 只有"待审批"或"已退回"状态的申请才能修改
    • 只有"审批中"状态的申请才能进行审批操作
  3. 审批记录

    • 退回记录会被保留,不会删除
    • 重新提交审批后会创建新的"待审批"记录
    • 审批记录按时间顺序显示,包含完整的审批历史
  4. 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);
  }
}