{
  "8790410": {
    "id": 8790410,
    "name": "S00-环境与认证（双库）",
    "description": "学校端双库环境与认证入口：登录、当前用户、刷新、退出和注销后 401。每步显示关键返回值摘要并输出脱敏 APIFOX_EVIDENCE。",
    "priority": 2,
    "ordering": 0,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "b8cbcafe-f5d5-481f-89ef-5cfbaf7aaa2d",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "62901b0e-f1f9-40f6-8390-141d884ba4da",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572054,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:17.000Z",
              "updatedAt": "2026-09-25T09:02:17.000Z",
              "deletedAt": null,
              "id": 4572054,
              "name": "{{$.1.element.baseUrl}}/auth/login",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "jsonSchema": {
                  "type": "object",
                  "properties": {
                    "username": {
                      "type": "string"
                    },
                    "password": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "username",
                    "password"
                  ]
                },
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790410,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "c12e6ccd-8852-4293-81a5-d9da2c934a49",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572053,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:17.000Z",
              "updatedAt": "2026-09-25T09:02:17.000Z",
              "deletedAt": null,
              "id": 4572053,
              "name": "{{$.1.element.baseUrl}}/auth/login",
              "method": "get",
              "path": "{{base_url}}/auth/me",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "当前用户业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790410,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "8f882087-80d8-4b61-b4f7-539e4808eeab",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572052,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:17.000Z",
              "updatedAt": "2026-09-25T09:02:17.000Z",
              "deletedAt": null,
              "id": 4572052,
              "name": "{{$.1.element.baseUrl}}/auth/login",
              "method": "post",
              "path": "{{base_url}}/auth/refresh",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "刷新 Token 业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('刷新返回新 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790410,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "a0252b05-07d1-40de-b7ce-65c5c663938b",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572051,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:17.000Z",
              "updatedAt": "2026-09-25T09:02:17.000Z",
              "deletedAt": null,
              "id": 4572051,
              "name": "{{$.1.element.baseUrl}}/auth/login",
              "method": "post",
              "path": "{{base_url}}/auth/logout",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "退出登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790410,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "10f6ec17-1657-4d9c-ac34-f5f177bde1a3",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572050,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:17.000Z",
              "updatedAt": "2026-09-25T09:02:17.000Z",
              "deletedAt": null,
              "id": 4572050,
              "name": "{{$.1.element.baseUrl}}/auth/login",
              "method": "get",
              "path": "{{base_url}}/auth/me",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "注销后业务码 code=401",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "401",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 401', function () { pm.expect(pm.response.code).to.equal(401); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 401', function () { pm.expect(__json && __json.code).to.equal(401); });\npm.test('注销后 Token 已失效', function () { pm.expect(String(__json.message)).to.match(/token|登录|失效|unauthorized/i); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790410,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      },
      {
        "id": "2baae4f0-2361-47d1-80e8-4474a88f84df",
        "type": "customHttp",
        "disable": true,
        "parameters": {},
        "number": 3,
        "relatedId": 4571616,
        "customHttpRequest": {
          "createdAt": "2026-09-25T05:46:16.000Z",
          "updatedAt": "2026-09-25T05:46:16.000Z",
          "deletedAt": null,
          "id": 4571616,
          "name": "{{$.1.element.baseUrl}}/auth/me",
          "method": "get",
          "path": "{{$.1.element.baseUrl}}/auth/me",
          "requestBody": {
            "type": "none"
          },
          "parameters": {
            "header": [
              {
                "name": "Authorization",
                "value": "Bearer {{auth_token}}",
                "sampleValue": "Bearer {{auth_token}}",
                "enable": true
              }
            ]
          },
          "commonParameters": {
            "query": [],
            "body": [],
            "header": [],
            "cookie": []
          },
          "preProcessors": [
            {
              "id": "dynamicValueDivider",
              "type": "placeholder",
              "renderType": "dynamicValueDivider",
              "defaultEnable": false,
              "enable": false
            }
          ],
          "postProcessors": [],
          "auth": {},
          "securityScheme": {},
          "advancedSettings": {},
          "projectId": 8881630,
          "relatedId": 8790410,
          "creatorId": 450335,
          "editorId": 450335
        }
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T05:34:46.000Z",
    "updatedAt": "2026-09-25T09:05:45.000Z"
  },
  "8790427": {
    "id": 8790427,
    "name": "S01-首页与预警（双库）",
    "description": "学校端 S01 首页与预警双库场景。只读主流程自动执行；事件详情/处置保留为需要事件夹具的独立步骤；明厨亮灶仅以越权学校号验证 403，禁止真实第三方出站。",
    "priority": 2,
    "ordering": 10,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "42bef233-c3d0-4e69-8337-e83613509b2a",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "2607eb78-48c4-4403-9ba7-be62f06e3ec7",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572070,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572070,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S01_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "a9ef26ca-b2b1-43a8-a7ce-00f03bbdbd3a",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572069,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572069,
              "name": "首页总览",
              "method": "get",
              "path": "{{base_url}}/school/home/overview?schoolId=1&aiPeriod=week",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "21713291-1aa8-42cf-8fb7-d6e084ad7488",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572068,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572068,
              "name": "设备概览",
              "method": "get",
              "path": "{{base_url}}/school/devices?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "40596ef2-33b7-49c9-9bfe-13090ae86ddd",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572067,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572067,
              "name": "分析看板",
              "method": "get",
              "path": "{{base_url}}/school/analytics/dashboard?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "90248282-48e5-4cbc-a018-7a269e18e0bb",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572066,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572066,
              "name": "预警列表",
              "method": "get",
              "path": "{{base_url}}/school/analytics/alerts?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "2214b0ec-f4c7-4d80-916b-274b75e247db",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4572065,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572065,
              "name": "联网 AI 汇总",
              "method": "get",
              "path": "{{base_url}}/school/ai/home/summary/network?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "1aacbf61-99e5-4c11-8965-3bb7d64187d5",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 7,
            "relatedId": 4572064,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572064,
              "name": "本地 AI 汇总",
              "method": "get",
              "path": "{{base_url}}/school/ai/home/summary/local?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "8ee7e2ec-2388-4665-a995-d1739e217945",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 8,
            "relatedId": 4572063,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572063,
              "name": "AI 事件列表",
              "method": "get",
              "path": "{{base_url}}/school/ai/events?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "ai_event_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.items[0].id",
                    "extractSettings": {
                      "expression": "$.data.items[0].id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "6840af7f-ad53-466f-b4c4-279a1c9af7d1",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 9,
            "relatedId": 4572062,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572062,
              "name": "AI 事件详情（需夹具）",
              "method": "get",
              "path": "{{base_url}}/school/ai/events/detail?id={{ai_event_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "8e7deb11-0e58-4da7-8738-83fb882d28b6",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 10,
            "relatedId": 4572061,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572061,
              "name": "AI 事件处置（需夹具）",
              "method": "post",
              "path": "{{base_url}}/school/ai/events/handle",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"eventId\":\"{{ai_event_id}}\",\"decision\":\"已现场纠正\",\"note\":\"{{test_batch}} 自动化处置\",\"handledBy\":\"自动化管理员\"}",
                "example": "{\"eventId\":\"{{ai_event_id}}\",\"decision\":\"已现场纠正\",\"note\":\"{{test_batch}} 自动化处置\",\"handledBy\":\"自动化管理员\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "26f3d6f9-a805-4047-af25-ea02fc2ea8f5",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 11,
            "relatedId": 4572060,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572060,
              "name": "食堂列表",
              "method": "get",
              "path": "{{base_url}}/school/canteens?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "41044aaf-34ac-4c16-97f8-0d9ee65b6463",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 12,
            "relatedId": 4572059,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572059,
              "name": "食堂汇总",
              "method": "get",
              "path": "{{base_url}}/school/canteens/summary?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "acfa22eb-d791-48bf-beea-7e5a14598a5d",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 13,
            "relatedId": 4572058,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572058,
              "name": "本地 AI 事件",
              "method": "get",
              "path": "{{base_url}}/bright-local/ai/events?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7f08e1be-e4fa-4658-bdd6-63901f5d02df",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 14,
            "relatedId": 4572057,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572057,
              "name": "监管学校列表",
              "method": "get",
              "path": "{{base_url}}/reg/schools",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "46e0425d-888d-45e5-a19a-e5133a57aee3",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 15,
            "relatedId": 4572056,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572056,
              "name": "明厨亮灶越权安全拒绝",
              "method": "get",
              "path": "{{base_url}}/bright/school/cameras?schoolId=99999999",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=403",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "403",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 403', function () { pm.expect(pm.response.code).to.equal(403); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 403', function () { pm.expect(__json && __json.code).to.equal(403); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "9b31b62f-c19e-4d37-a880-2a61062494ab",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 16,
            "relatedId": 4572055,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:18.000Z",
              "updatedAt": "2026-09-25T09:02:18.000Z",
              "deletedAt": null,
              "id": 4572055,
              "name": "TrustIVS 越权安全拒绝",
              "method": "get",
              "path": "{{base_url}}/bright/school/trustivs-cameras?schoolId=99999999",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=403",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "403",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 403', function () { pm.expect(pm.response.code).to.equal(403); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 403', function () { pm.expect(__json && __json.code).to.equal(403); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790427,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T06:16:34.000Z",
    "updatedAt": "2026-09-25T09:06:31.000Z"
  },
  "8790428": {
    "id": 8790428,
    "name": "S02-晨检管理（双库真实写入）",
    "description": "学校端 S02 晨检双库真实写入场景：新增、列表/总览/历史回查、措施、处置、CSV 与删除。数据覆盖中文、DECIMAL(4,1)、日期时间和 JSON。",
    "priority": 2,
    "ordering": 20,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "a8b581ba-d45a-48bd-bad4-fa92bf6a4337",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "01a6b77f-507a-4f05-95bb-beea92e2e96b",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572079,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572079,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S02_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "fb94f785-e4c8-4682-ba7b-4a4e934d31cc",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572078,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572078,
              "name": "新增晨检",
              "method": "post",
              "path": "{{base_url}}/school/morning-checks",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"staff\":\"{{test_batch}}_张三\",\"temp\":36.7,\"at\":\"2026-09-25T08:30:00+08:00\",\"hygiene\":\"正常\",\"source\":\"manual\"}",
                "example": "{\"schoolId\":1,\"staff\":\"{{test_batch}}_张三\",\"temp\":36.7,\"at\":\"2026-09-25T08:30:00+08:00\",\"hygiene\":\"正常\",\"source\":\"manual\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "morning_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7c88714d-0f69-4ba4-9034-30e2dfe78db0",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572077,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572077,
              "name": "晨检列表回查",
              "method": "get",
              "path": "{{base_url}}/school/morning-checks?schoolId=1&staff={{test_batch}}_张三&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "995c2c9e-e616-4991-94f7-8208b1c82a55",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572076,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572076,
              "name": "晨检总览",
              "method": "get",
              "path": "{{base_url}}/school/morning-checks/overview?schoolId=1&date=2026-09-25",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "e266e822-93b4-46dd-a28c-fca165a5410f",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572075,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572075,
              "name": "晨检历史",
              "method": "get",
              "path": "{{base_url}}/school/morning-checks/history?schoolId=1&staff={{test_batch}}_张三&date=2026-09-25",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "067c4736-f45f-43d9-b480-cde2a677cd61",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4572074,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572074,
              "name": "更新晨检措施",
              "method": "patch",
              "path": "{{base_url}}/school/morning-checks/{{morning_id}}/measure",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"measure\":\"{{test_batch}} 复测正常，允许上岗\"}",
                "example": "{\"measure\":\"{{test_batch}} 复测正常，允许上岗\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "d4edaf08-fe87-437a-9e40-06a3f2d09ae8",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 7,
            "relatedId": 4572073,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572073,
              "name": "更新晨检处置",
              "method": "patch",
              "path": "{{base_url}}/school/morning-checks/{{morning_id}}/handle",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"decision\":\"allow\",\"note\":\"{{test_batch}} 中文处置：体温复测 36.6℃\"}",
                "example": "{\"decision\":\"allow\",\"note\":\"{{test_batch}} 中文处置：体温复测 36.6℃\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7668d07d-72bf-430d-aae7-922e62009d40",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 8,
            "relatedId": 4572072,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572072,
              "name": "导出晨检 CSV",
              "method": "get",
              "path": "{{base_url}}/school/morning-checks/export.csv?schoolId=1&staff={{test_batch}}_张三",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "172d5f91-06ef-4894-b768-3c0ca0bd2c87",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 9,
            "relatedId": 4572071,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:19.000Z",
              "updatedAt": "2026-09-25T09:02:19.000Z",
              "deletedAt": null,
              "id": 4572071,
              "name": "删除本轮晨检",
              "method": "delete",
              "path": "{{base_url}}/school/morning-checks/{{morning_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790428,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T06:17:51.000Z",
    "updatedAt": "2026-09-25T09:02:19.000Z"
  },
  "8790430": {
    "id": 8790430,
    "name": "S03-农残检测（双库真实写入）",
    "description": "学校端 S03 农残检测双库可审计场景：手工新增、字段级回查、处置后二次回查、CSV、模拟设备入站、分页、无 Token、跨校和缺字段零写入。每步后置脚本输出脱敏 APIFOX_EVIDENCE；SSE 因长连接单独执行。",
    "priority": 2,
    "ordering": 30,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "86a221f1-0e8c-40ec-9c59-bd7b3f4914cf",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "7c34de4d-69f3-49f6-9966-9d385aff7a74",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572092,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572092,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S03_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "8ebe7958-9661-40aa-9bb0-8fc350ab0f6a",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572091,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572091,
              "name": "新增农残检测并返回创建 ID",
              "method": "post",
              "path": "{{base_url}}/school/pesticide/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_油麦菜\",\"device\":\"NY-TEST-01\",\"tester\":\"自动化检测员\",\"jiancedidian\":\"第一食堂快检室\",\"lianxidianhua\":\"13800000000\",\"value\":\"12.345\",\"result\":\"不合格\",\"remark\":\"{{test_batch}} 中文；特殊字符（）\",\"at\":\"2026-09-25T09:15:00+08:00\"}",
                "example": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_油麦菜\",\"device\":\"NY-TEST-01\",\"tester\":\"自动化检测员\",\"jiancedidian\":\"第一食堂快检室\",\"lianxidianhua\":\"13800000000\",\"value\":\"12.345\",\"result\":\"不合格\",\"remark\":\"{{test_batch}} 中文；特殊字符（）\",\"at\":\"2026-09-25T09:15:00+08:00\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "pesticide_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('创建成功：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\npm.test('创建响应：样本名与本轮批次一致', function () { pm.expect(__json.data.sample).to.equal(pm.variables.get('test_batch') + '_油麦菜'); });\npm.test('创建响应：数值字符串 12.345 未丢失', function () { pm.expect(String(__json.data.value)).to.equal('12.345'); });\npm.test('创建响应：中文与特殊字符未乱码', function () { pm.expect(__json.data.remark).to.include('中文；特殊字符（）'); });\npm.test('创建响应：不合格记录 exception=true', function () { pm.expect(__json.data.exception).to.equal(true); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "c2548579-d39f-4af3-aa52-6968e9b44cc0",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572090,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572090,
              "name": "按批次回查刚创建的农残记录",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=1&q={{test_batch}}&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('回查响应：items 为数组且 total>=1', function () { pm.expect(__json.data.items).to.be.an('array'); pm.expect(Number(__json.data.total)).to.be.at.least(1); });\npm.test('回查响应：包含刚创建的 ID', function () { const id = Number(pm.variables.get('pesticide_id')); pm.expect(__json.data.items.some(function (x) { return Number(x.id) === id; })).to.equal(true); });\npm.test('回查响应：批次、数值、中文和结果一致', function () { const id = Number(pm.variables.get('pesticide_id')); const row = __json.data.items.find(function (x) { return Number(x.id) === id; }); pm.expect(row.sample).to.equal(pm.variables.get('test_batch') + '_油麦菜'); pm.expect(String(row.value)).to.equal('12.345'); pm.expect(row.result).to.equal('不合格'); pm.expect(row.remark).to.include('中文；特殊字符（）'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "e5e40b2c-5e5c-4e55-8d2e-1a67454d51c2",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572089,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572089,
              "name": "更新农残处置措施",
              "method": "patch",
              "path": "{{base_url}}/school/pesticide/records/{{pesticide_id}}/measure",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"measure\":\"{{test_batch}} 下架并复检\"}",
                "example": "{\"measure\":\"{{test_batch}} 下架并复检\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('更新响应：ok=true', function () { pm.expect(__json.data.ok).to.equal(true); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "6b848606-70bb-4540-8174-9959c9376677",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572088,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572088,
              "name": "处置后再次回查原记录",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=1&q={{test_batch}}&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('处置回查：措施已真实更新', function () { const id = Number(pm.variables.get('pesticide_id')); const row = __json.data.items.find(function (x) { return Number(x.id) === id; }); pm.expect(row).to.exist; pm.expect(row.measure).to.equal(pm.variables.get('test_batch') + ' 下架并复检'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "e202ec8d-b805-45d7-a00c-24cc7c5bb95b",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4572087,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572087,
              "name": "导出农残 CSV 并核对本轮数据",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records/export.csv?schoolId=1&q={{test_batch}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('CSV 响应：包含表头', function () { pm.expect(__json.data.csv).to.include('检测时间,检测样本,结果'); });\npm.test('CSV 响应：包含本轮批次与数值', function () { pm.expect(__json.data.csv).to.include(pm.variables.get('test_batch')); pm.expect(__json.data.csv).to.include('12.345'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "cca62cab-b629-40e9-a717-51b9786ecbb8",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 7,
            "relatedId": 4572086,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572086,
              "name": "模拟设备回调写入（不连接真实设备）",
              "method": "post",
              "path": "{{base_url}}/school/pesticide/device/callback",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_设备青菜\",\"device\":\"MOCK-DEVICE-01\",\"result\":\"合格\",\"remark\":\"{{test_batch}} 本地模拟设备入站\"}",
                "example": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_设备青菜\",\"device\":\"MOCK-DEVICE-01\",\"result\":\"合格\",\"remark\":\"{{test_batch}} 本地模拟设备入站\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "pesticide_device_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('设备回调：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\npm.test('设备回调：source=device', function () { pm.expect(__json.data.source).to.equal('device'); });\npm.test('设备回调：批次样本未串库', function () { pm.expect(__json.data.sample).to.equal(pm.variables.get('test_batch') + '_设备青菜'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "6878ef17-33e4-4711-9fa6-651ba0755387",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 8,
            "relatedId": 4572085,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572085,
              "name": "分页回查手工与模拟设备两条数据",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=1&q={{test_batch}}&page=1&pageSize=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('分页响应：pageSize=1 只返回一条', function () { pm.expect(__json.data.items).to.have.lengthOf(1); pm.expect(Number(__json.data.pageSize)).to.equal(1); });\npm.test('分页响应：本轮总数至少两条', function () { pm.expect(Number(__json.data.total)).to.be.at.least(2); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "27b0b834-3649-450d-a29c-b362f6123564",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 9,
            "relatedId": 4572084,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572084,
              "name": "缺检测员应 400 且不得写入",
              "method": "post",
              "path": "{{base_url}}/school/pesticide/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_NEG_NO_TESTER\",\"device\":\"NY-TEST-01\",\"result\":\"合格\",\"at\":\"2026-09-25T09:20:00+08:00\"}",
                "example": "{\"schoolId\":1,\"sample\":\"{{test_batch}}_NEG_NO_TESTER\",\"device\":\"NY-TEST-01\",\"result\":\"合格\",\"at\":\"2026-09-25T09:20:00+08:00\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=400",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "400",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 400', function () { pm.expect(pm.response.code).to.equal(400); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 400', function () { pm.expect(__json && __json.code).to.equal(400); });\npm.test('缺检测员：错误信息明确', function () { pm.expect(String(__json.message)).to.include('检测员必填'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "bf8b02c0-b694-497d-bfc7-939a47dff8ad",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 10,
            "relatedId": 4572083,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572083,
              "name": "缺字段失败后按批次确认零写入",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=1&q={{test_batch}}_NEG_NO_TESTER&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('失败请求零写入：total=0', function () { pm.expect(Number(__json.data.total)).to.equal(0); });\npm.test('失败请求零写入：items 为空', function () { pm.expect(__json.data.items).to.be.an('array').that.is.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "449aba58-9f22-4d2b-9d67-5e0c1bcbf425",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 11,
            "relatedId": 4572082,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572082,
              "name": "跨校查询应 403",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=99999999&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=403",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "403",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 403', function () { pm.expect(pm.response.code).to.equal(403); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 403', function () { pm.expect(__json && __json.code).to.equal(403); });\npm.test('跨校访问：错误信息明确且无业务数据', function () { pm.expect(String(__json.message)).to.match(/denied|拒绝|权限|学校/i); pm.expect(__json.data).to.not.exist; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "4781ec9c-75be-457f-a3f0-173057c69fb7",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 12,
            "relatedId": 4572081,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572081,
              "name": "无 Token 查询应 401",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/records?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": []
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=401",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "401",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 401', function () { pm.expect(pm.response.code).to.equal(401); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 401', function () { pm.expect(__json && __json.code).to.equal(401); });\npm.test('无 Token：明确返回 Missing token', function () { pm.expect(String(__json.message)).to.include('Missing token'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "fe55420b-146e-4070-99ec-f082a9f54845",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 13,
            "relatedId": 4572080,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:20.000Z",
              "updatedAt": "2026-09-25T09:02:20.000Z",
              "deletedAt": null,
              "id": 4572080,
              "name": "农残 SSE（长连接单测）",
              "method": "get",
              "path": "{{base_url}}/school/pesticide/stream?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790430,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T06:21:11.000Z",
    "updatedAt": "2026-09-25T09:07:09.000Z"
  },
  "8790462": {
    "id": 8790462,
    "name": "S04-消毒管理（双库真实写入）",
    "description": "学校端 S04 消毒管理双库真实写入场景：JSON 批量导入、新增、列表/详情回查和措施更新。SSE 长连接单独执行。",
    "priority": 2,
    "ordering": 40,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "b6ac542c-c574-42ed-9588-ab4a7745ed40",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "cc29c1ed-8fc2-42bb-b001-49e55f08f6e1",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572099,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572099,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S04_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7ff9f76f-619f-4922-9774-ef702d08d02c",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572098,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572098,
              "name": "批量导入消毒记录",
              "method": "post",
              "path": "{{base_url}}/school/disinfection/records/import?schoolId=1",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"items\":[{\"canteenId\":1,\"method\":\"紫外\",\"duration\":30,\"temperature\":25.5,\"items\":\"操作台、刀具\",\"responsible\":\"{{test_batch}}_李师傅\",\"at\":\"2026-09-25T10:00:00+08:00\"}]}",
                "example": "{\"items\":[{\"canteenId\":1,\"method\":\"紫外\",\"duration\":30,\"temperature\":25.5,\"items\":\"操作台、刀具\",\"responsible\":\"{{test_batch}}_李师傅\",\"at\":\"2026-09-25T10:00:00+08:00\"}]}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "bda8e3e7-763d-4cb6-814d-4b221b6d444b",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572097,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572097,
              "name": "新增消毒记录",
              "method": "post",
              "path": "{{base_url}}/school/disinfection/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":\"1\",\"canteenId\":1,\"method\":\"高温\",\"duration\":45,\"temperature\":121.25,\"items\":\"餐盘、汤勺\",\"responsible\":\"{{test_batch}}_王师傅\",\"at\":\"2026-09-25T10:30:00+08:00\"}",
                "example": "{\"schoolId\":\"1\",\"canteenId\":1,\"method\":\"高温\",\"duration\":45,\"temperature\":121.25,\"items\":\"餐盘、汤勺\",\"responsible\":\"{{test_batch}}_王师傅\",\"at\":\"2026-09-25T10:30:00+08:00\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "disinfection_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "47e5cbcd-7275-4e06-843a-bdc51bc9a5dd",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572096,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572096,
              "name": "消毒列表回查",
              "method": "get",
              "path": "{{base_url}}/school/disinfection/records?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "0580146e-b941-4ee2-8dcf-223e8d9bb65a",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572095,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572095,
              "name": "消毒详情回查",
              "method": "get",
              "path": "{{base_url}}/school/disinfection/records/{{disinfection_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "9f361dd9-a237-45e0-8f10-60e2de0df2d5",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4572094,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572094,
              "name": "更新消毒措施",
              "method": "patch",
              "path": "{{base_url}}/school/disinfection/records/{{disinfection_id}}/measure",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"measure\":\"{{test_batch}} 温度与时长复核通过\"}",
                "example": "{\"measure\":\"{{test_batch}} 温度与时长复核通过\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "a24e730c-787c-403f-831a-36c21241e841",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 7,
            "relatedId": 4572093,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:21.000Z",
              "updatedAt": "2026-09-25T09:02:21.000Z",
              "deletedAt": null,
              "id": 4572093,
              "name": "消毒 SSE（长连接单测）",
              "method": "get",
              "path": "{{base_url}}/school/disinfection/stream?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790462,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T08:19:16.000Z",
    "updatedAt": "2026-09-25T09:02:21.000Z"
  },
  "8790464": {
    "id": 8790464,
    "name": "S05-废弃物管理（双库真实写入）",
    "description": "学校端 S05 废弃物双库真实写入场景：分类和记录完整 CRUD、DECIMAL(18,3)、中文、日期与 CSV；只删除本轮自动化创建的数据。",
    "priority": 2,
    "ordering": 50,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "c740e501-aa26-483f-8168-42918cee33e1",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "def7e291-e15f-4ee9-aea6-8d4bbce74835",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572109,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572109,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S05_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "c078077d-93f9-472a-8494-60b939057396",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572108,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572108,
              "name": "新增废弃物分类",
              "method": "post",
              "path": "{{base_url}}/school/waste/categories",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"name\":\"{{test_batch}}_厨余分类\"}",
                "example": "{\"name\":\"{{test_batch}}_厨余分类\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "waste_category_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "d6cfbc56-aae3-4c7c-931a-20622b1d0519",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572107,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572107,
              "name": "废弃物分类列表",
              "method": "get",
              "path": "{{base_url}}/school/waste/categories?enabled=all",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "4d649127-421d-4a84-9364-8674e8416ccd",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572106,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572106,
              "name": "停用本轮分类",
              "method": "patch",
              "path": "{{base_url}}/school/waste/categories/{{waste_category_id}}/enable",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"enabled\":false}",
                "example": "{\"enabled\":false}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "65dd3d84-0f5f-4826-828b-0dc0142194d1",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572105,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572105,
              "name": "新增废弃物记录",
              "method": "post",
              "path": "{{base_url}}/school/waste/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"canteenId\":1,\"date\":\"2026-09-25\",\"category\":\"{{test_batch}}_厨余分类\",\"amount\":12.345,\"buyer\":\"{{test_batch}}_绿色回收公司\",\"person\":\"赵师傅\"}",
                "example": "{\"schoolId\":1,\"canteenId\":1,\"date\":\"2026-09-25\",\"category\":\"{{test_batch}}_厨余分类\",\"amount\":12.345,\"buyer\":\"{{test_batch}}_绿色回收公司\",\"person\":\"赵师傅\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "waste_record_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "e1c622a4-4e0d-4a4f-87e3-91fea28a4692",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4572104,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572104,
              "name": "废弃物记录列表",
              "method": "get",
              "path": "{{base_url}}/school/waste/records?schoolId=1&category={{test_batch}}_厨余分类&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "66893e31-e0a0-42e5-b42a-22b967682f50",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 7,
            "relatedId": 4572103,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572103,
              "name": "导出废弃物 CSV",
              "method": "get",
              "path": "{{base_url}}/school/waste/records/export.csv?schoolId=1&category={{test_batch}}_厨余分类",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "49afa2a1-44a5-44e8-a5b2-823705ac5ff6",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 8,
            "relatedId": 4572102,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572102,
              "name": "废弃物详情回查",
              "method": "get",
              "path": "{{base_url}}/school/waste/records/{{waste_record_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "d380aabe-b06e-494d-a1d3-a277089580b4",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 9,
            "relatedId": 4572101,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572101,
              "name": "删除本轮废弃物记录",
              "method": "delete",
              "path": "{{base_url}}/school/waste/records/{{waste_record_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "84fbb6f8-3e21-4cc6-84b2-5fbc47608f2a",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 10,
            "relatedId": 4572100,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:22.000Z",
              "updatedAt": "2026-09-25T09:02:22.000Z",
              "deletedAt": null,
              "id": 4572100,
              "name": "删除本轮废弃物分类",
              "method": "delete",
              "path": "{{base_url}}/school/waste/categories/{{waste_category_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790464,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T08:24:20.000Z",
    "updatedAt": "2026-09-25T09:02:22.000Z"
  },
  "8790465": {
    "id": 8790465,
    "name": "S06-设备安全（双库真实写入）",
    "description": "学校端 S06 设备安全双库真实写入场景：新增、列表、详情和更新，覆盖 JSON 数组、中文、空值和日期。接口没有删除能力，记录保留作数据库直查证据。",
    "priority": 2,
    "ordering": 60,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "9e10a8b7-6cdf-4ff7-86f9-a5f5df333931",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "e8f51eda-633d-4e2b-9f3d-4c20dcffc0c4",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4572114,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:23.000Z",
              "updatedAt": "2026-09-25T09:02:23.000Z",
              "deletedAt": null,
              "id": 4572114,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S06_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790465,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "566f50db-62a8-48cf-ab0f-4c5cddb01066",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4572113,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:23.000Z",
              "updatedAt": "2026-09-25T09:02:23.000Z",
              "deletedAt": null,
              "id": 4572113,
              "name": "新增设备安全检查",
              "method": "post",
              "path": "{{base_url}}/school/device-safety",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"canteenId\":1,\"deviceName\":\"{{test_batch}}_蒸箱\",\"items\":[\"电源线\",\"接地\",\"温控器\"],\"result\":\"异常\",\"description\":\"温控器读数偶发漂移\",\"measures\":\"停机复核并更换传感器\",\"handler\":\"{{test_batch}}_陈工\",\"checkDate\":\"2026-09-25\"}",
                "example": "{\"schoolId\":1,\"canteenId\":1,\"deviceName\":\"{{test_batch}}_蒸箱\",\"items\":[\"电源线\",\"接地\",\"温控器\"],\"result\":\"异常\",\"description\":\"温控器读数偶发漂移\",\"measures\":\"停机复核并更换传感器\",\"handler\":\"{{test_batch}}_陈工\",\"checkDate\":\"2026-09-25\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "device_safety_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790465,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "f1385bed-a7f2-4fdb-bd80-2d5dbc088daa",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4572112,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:23.000Z",
              "updatedAt": "2026-09-25T09:02:23.000Z",
              "deletedAt": null,
              "id": 4572112,
              "name": "设备安全列表回查",
              "method": "get",
              "path": "{{base_url}}/school/device-safety?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790465,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "91ee80a1-7e37-49d6-adfc-49357b5ab86c",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4572111,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:23.000Z",
              "updatedAt": "2026-09-25T09:02:23.000Z",
              "deletedAt": null,
              "id": 4572111,
              "name": "设备安全详情",
              "method": "get",
              "path": "{{base_url}}/school/device-safety/detail?id={{device_safety_id}}",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790465,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "e311b46b-46ce-4c76-8ba0-7d9a34fe91ed",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4572110,
            "customHttpRequest": {
              "createdAt": "2026-09-25T09:02:23.000Z",
              "updatedAt": "2026-09-25T09:02:23.000Z",
              "deletedAt": null,
              "id": 4572110,
              "name": "更新设备安全检查",
              "method": "patch",
              "path": "{{base_url}}/school/device-safety/{{device_safety_id}}",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"result\":\"正常\",\"description\":\"{{test_batch}} 复检通过\",\"measures\":null,\"handler\":null,\"items\":[\"电源线\",\"接地\",\"温控器\"],\"checkDate\":\"2026-09-25\"}",
                "example": "{\"result\":\"正常\",\"description\":\"{{test_batch}} 复检通过\",\"measures\":null,\"handler\":null,\"items\":[\"电源线\",\"接地\",\"温控器\"],\"checkDate\":\"2026-09-25\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8790465,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-25T08:24:21.000Z",
    "updatedAt": "2026-09-25T09:02:23.000Z"
  },
  "8793626": {
    "id": 8793626,
    "name": "S07-留样管理（双库真实写入）",
    "description": "学校端 S07 留样管理双库可审计场景：真实新增、列表回查、中文处置、取样状态与时间、CSV、非法重量与超长烹饪时间零写入、无 Token 和跨校拒绝。设备回调需可验证绑定，SSE 是长连接，两者默认关闭并独立执行。",
    "priority": 2,
    "ordering": 80,
    "projectId": 8881630,
    "folderId": 8019398,
    "steps": [
      {
        "id": "f6e7cdc0-02d7-40ca-8de9-d0314ef3a086",
        "type": "forEach",
        "disable": false,
        "parameters": {
          "array": "[\"http://127.0.0.1:3311\",\"http://127.0.0.1:3310\"]",
          "disableOnError": false
        },
        "children": [
          {
            "id": "aa8e26ba-07e1-4f59-b168-62c057cdf414",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 1,
            "relatedId": 4573451,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573451,
              "name": "登录并初始化双库测试变量",
              "method": "post",
              "path": "{{base_url}}/auth/login",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "example": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}",
                "data": "{\"username\":\"{{app_admin_username}}\",\"password\":\"{{app_admin_password}}\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "type": "customScript",
                  "data": "pm.variables.set('base_url', pm.variables.get('$.1.element'));\npm.variables.set('test_batch', 'APIFOX_S07_' + Date.now());\n",
                  "defaultEnable": false,
                  "enable": true,
                  "executionTiming": "prerequest"
                },
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "auth_token",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.token",
                    "extractSettings": {
                      "expression": "$.data.token",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "登录业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('登录返回临时 Token（报告脱敏）', function () { pm.expect(__json.data.token).to.be.a('string').and.not.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7c22e647-7181-4d75-8dc3-5e8e072641e6",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 2,
            "relatedId": 4573450,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573450,
              "name": "新增中文留样记录并返回 ID",
              "method": "post",
              "path": "{{base_url}}/school/sampling/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_香菇青菜炒肉\",\"weight\":125.5,\"imageUrl\":null,\"duration\":48,\"by\":\"张老师\",\"cabinet\":\"A-01留样柜\",\"cookTime\":\"11:30:00\",\"at\":\"2026-09-26 12:00:00\",\"endTime\":\"2026-09-28 12:00:00\",\"status\":\"ACTIVE\"}",
                "example": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_香菇青菜炒肉\",\"weight\":125.5,\"imageUrl\":null,\"duration\":48,\"by\":\"张老师\",\"cabinet\":\"A-01留样柜\",\"cookTime\":\"11:30:00\",\"at\":\"2026-09-26 12:00:00\",\"endTime\":\"2026-09-28 12:00:00\",\"status\":\"ACTIVE\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "extractor",
                  "data": {
                    "variableName": "sampling_id",
                    "variableType": "local",
                    "subject": "responseJson",
                    "template": "",
                    "expression": "$.data.id",
                    "extractSettings": {
                      "expression": "$.data.id",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('创建响应：样品名包含本轮批次', function () { pm.expect(__json.data.sample).to.equal(pm.variables.get('test_batch') + '_香菇青菜炒肉'); });\npm.test('创建响应：重量 125.5 未截断', function () { pm.expect(Number(__json.data.weight)).to.equal(125.5); });\npm.test('创建响应：留样人和柜位中文正常', function () { pm.expect(__json.data.by).to.equal('张老师'); pm.expect(__json.data.cabinet).to.equal('A-01留样柜'); });\npm.test('创建响应：NULL 图片未被伪造', function () { pm.expect(__json.data.imageUrl === null || __json.data.image_url === null).to.equal(true); });\npm.test('写入响应：返回正整数 ID', function () { pm.expect(Number(__json.data.id)).to.be.greaterThan(0); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "1e04b06d-951d-45e9-ac49-bb0360cae92e",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 3,
            "relatedId": 4573449,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573449,
              "name": "按批次回查刚创建的留样记录",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&canteenId=1&sample={{test_batch}}&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('列表回查：包含刚创建的 ID', function () { const id=Number(pm.variables.get('sampling_id')); pm.expect(__json.data.items.some(function(x){return Number(x.id)===id;})).to.equal(true); });\npm.test('列表回查：样品、重量、留样人一致', function () { const id=Number(pm.variables.get('sampling_id')); const row=__json.data.items.find(function(x){return Number(x.id)===id;}); pm.expect(row.sample).to.include(pm.variables.get('test_batch')); pm.expect(Number(row.weight)).to.equal(125.5); pm.expect(row.by).to.equal('张老师'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7cbcdc49-5884-49fc-a6ca-c9fb9105f37c",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 4,
            "relatedId": 4573448,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573448,
              "name": "更新留样处置措施",
              "method": "patch",
              "path": "{{base_url}}/school/sampling/records/{{sampling_id}}/measure",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"measure\":\"{{test_batch}} 中文处置：复核留样柜温度并完成登记\"}",
                "example": "{\"measure\":\"{{test_batch}} 中文处置：复核留样柜温度并完成登记\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('处置更新：ok=true', function () { pm.expect(__json.data.ok).to.equal(true); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "de8ae9bd-1eab-4a05-abf5-a315ae3c99b7",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 5,
            "relatedId": 4573447,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573447,
              "name": "处置后回查措施已持久化",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&sample={{test_batch}}&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('处置回查：中文措施与本轮批次一致', function () { const id=Number(pm.variables.get('sampling_id')); const row=__json.data.items.find(function(x){return Number(x.id)===id;}); pm.expect(row.measure).to.equal(pm.variables.get('test_batch') + ' 中文处置：复核留样柜温度并完成登记'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "fc6532db-5a1d-4cd0-a863-4640d5059bb6",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 6,
            "relatedId": 4573446,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573446,
              "name": "更新取样状态、取样人和北京时间",
              "method": "patch",
              "path": "{{base_url}}/school/sampling/records/{{sampling_id}}/status",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"status\":\"CLEARED\",\"quyangUserName\":\"王取样员\",\"takeTime\":\"2026-09-28 12:00:01\"}",
                "example": "{\"status\":\"CLEARED\",\"quyangUserName\":\"王取样员\",\"takeTime\":\"2026-09-28 12:00:01\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('状态更新：ok=true', function () { pm.expect(__json.data.ok).to.equal(true); });\npm.test('状态更新：业务响应不伪造完整记录', function () { pm.expect(__json.data.status).to.not.exist; pm.expect(__json.data.quyangUserName).to.not.exist; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "5527b727-c51d-4605-9fa2-782400922309",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 7,
            "relatedId": 4573445,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573445,
              "name": "状态更新后再次回查原记录",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&sample={{test_batch}}&status=CLEARED&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('状态回查：原 ID 为 CLEARED', function () { const id=Number(pm.variables.get('sampling_id')); const row=__json.data.items.find(function(x){return Number(x.id)===id;}); pm.expect(row).to.exist; pm.expect(row.status).to.equal('CLEARED'); });\npm.test('状态回查：取样人和时间已保存', function () { const id=Number(pm.variables.get('sampling_id')); const row=__json.data.items.find(function(x){return Number(x.id)===id;}); pm.expect(row.quyangUserName || row.quyang_user_name).to.equal('王取样员'); pm.expect(String(row.takeTime || row.take_time)).to.include('2026-09-28 12:00:01'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "284b8953-320c-47b5-bbce-cd3e6c7c65c7",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 8,
            "relatedId": 4573444,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573444,
              "name": "导出留样 CSV 并核对本轮数据",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records/export.csv?schoolId=1&sample={{test_batch}}&status=CLEARED",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('CSV 响应：包含中文表头', function () { pm.expect(__json.data.csv).to.include('留样时间,样品,所属食堂'); });\npm.test('CSV 响应：包含本轮批次和重量', function () { pm.expect(__json.data.csv).to.include(pm.variables.get('test_batch')); pm.expect(__json.data.csv).to.include('125.5'); });\npm.test('CSV 响应：包含中文处置措施', function () { pm.expect(__json.data.csv).to.include('复核留样柜温度'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "f7c77564-6378-4a65-a32b-2677ea47be36",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 9,
            "relatedId": 4573443,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573443,
              "name": "非法重量 0 应 400 且不得写入",
              "method": "post",
              "path": "{{base_url}}/school/sampling/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_NEG_ZERO_WEIGHT\",\"weight\":0,\"duration\":48,\"by\":\"非法重量测试员\",\"at\":\"2026-09-26 12:10:00\"}",
                "example": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_NEG_ZERO_WEIGHT\",\"weight\":0,\"duration\":48,\"by\":\"非法重量测试员\",\"at\":\"2026-09-26 12:10:00\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=400",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "400",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 400', function () { pm.expect(pm.response.code).to.equal(400); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 400', function () { pm.expect(__json && __json.code).to.equal(400); });\npm.test('非法重量：返回明确错误', function () { pm.expect(String(__json.message)).to.match(/重量|weight|positive/i); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "7e94a97e-9123-41ab-963e-f90f44ffc693",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 10,
            "relatedId": 4573442,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573442,
              "name": "非法重量失败后按批次确认零写入",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&sample={{test_batch}}_NEG_ZERO_WEIGHT&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('失败请求零写入：total=0', function () { pm.expect(Number(__json.data.total)).to.equal(0); });\npm.test('失败请求零写入：items 为空', function () { pm.expect(__json.data.items).to.be.an('array').that.is.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "c4942a68-16bc-454c-9fd2-38d96b4a3ee4",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 11,
            "relatedId": 4573441,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573441,
              "name": "19 字完整日期时间不得写入 cookTime",
              "method": "post",
              "path": "{{base_url}}/school/sampling/records",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_NEG_LONG_COOK_TIME\",\"weight\":125.5,\"duration\":48,\"by\":\"超长烹饪时间测试员\",\"cookTime\":\"2026-09-26 11:30:00\",\"at\":\"2026-09-26 12:10:00\"}",
                "example": "{\"schoolId\":1,\"canteenId\":1,\"sample\":\"{{test_batch}}_NEG_LONG_COOK_TIME\",\"weight\":125.5,\"duration\":48,\"by\":\"超长烹饪时间测试员\",\"cookTime\":\"2026-09-26 11:30:00\",\"at\":\"2026-09-26 12:10:00\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  },
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=400",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "400",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 400', function () { pm.expect(pm.response.code).to.equal(400); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 400', function () { pm.expect(__json && __json.code).to.equal(400); });\npm.test('超长 cookTime：两库统一返回字段长度错误', function () { pm.expect(String(__json.message)).to.match(/烹饪时间段|cook.?time|16/i); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "83226c7c-9099-44e3-90a3-764aa712bba6",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 12,
            "relatedId": 4573440,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573440,
              "name": "超长 cookTime 失败后确认零写入",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&sample={{test_batch}}_NEG_LONG_COOK_TIME&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\npm.test('超长 cookTime 零写入：total=0', function () { pm.expect(Number(__json.data.total)).to.equal(0); });\npm.test('超长 cookTime 零写入：items 为空', function () { pm.expect(__json.data.items).to.be.an('array').that.is.empty; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "219c2dd0-5596-4f07-9183-21df5f24dbcd",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 13,
            "relatedId": 4573439,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573439,
              "name": "跨校留样列表应 403",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=99999999&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=403",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "403",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 403', function () { pm.expect(pm.response.code).to.equal(403); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 403', function () { pm.expect(__json && __json.code).to.equal(403); });\npm.test('跨校访问：无业务数据', function () { pm.expect(__json.data).to.not.exist; });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "c5918399-a18e-4cd7-acc8-8d93d57d1a93",
            "type": "customHttp",
            "disable": false,
            "parameters": {},
            "number": 14,
            "relatedId": 4573438,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573438,
              "name": "无 Token 留样列表应 401",
              "method": "get",
              "path": "{{base_url}}/school/sampling/records?schoolId=1&page=1&pageSize=20",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": []
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=401",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "401",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 401', function () { pm.expect(pm.response.code).to.equal(401); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 401', function () { pm.expect(__json && __json.code).to.equal(401); });\npm.test('无 Token：明确返回 Missing token', function () { pm.expect(String(__json.message)).to.include('Missing token'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "9467720c-0928-4cd0-b91e-0ade22f16895",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 15,
            "relatedId": 4573437,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573437,
              "name": "设备回调（需可验证本地绑定）",
              "method": "post",
              "path": "{{base_url}}/school/sampling/device/callback",
              "requestBody": {
                "type": "application/json",
                "parameters": [],
                "data": "{\"instrument\":\"{{sampling_instrument}}\",\"schoolId\":99999999,\"sample\":\"{{test_batch}}_设备留样\",\"weight\":126.75,\"duration\":48,\"by\":\"本地模拟设备\",\"cabinet\":\"MOCK-01\"}",
                "example": "{\"instrument\":\"{{sampling_instrument}}\",\"schoolId\":99999999,\"sample\":\"{{test_batch}}_设备留样\",\"weight\":126.75,\"duration\":48,\"by\":\"本地模拟设备\",\"cabinet\":\"MOCK-01\"}"
              },
              "parameters": {
                "header": [
                  {
                    "name": "Content-Type",
                    "value": "application/json",
                    "sampleValue": "application/json",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 201', function () { pm.expect(pm.response.code).to.equal(201); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {},
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          },
          {
            "id": "738f2f50-98be-463d-aff3-c8ae4bd2bdcf",
            "type": "customHttp",
            "disable": true,
            "parameters": {},
            "number": 16,
            "relatedId": 4573436,
            "customHttpRequest": {
              "createdAt": "2026-09-26T01:28:55.000Z",
              "updatedAt": "2026-09-26T01:28:55.000Z",
              "deletedAt": null,
              "id": 4573436,
              "name": "留样 SSE（长连接独立测试）",
              "method": "get",
              "path": "{{base_url}}/school/sampling/stream?schoolId=1",
              "requestBody": {
                "type": "none",
                "parameters": [],
                "data": "",
                "example": ""
              },
              "parameters": {
                "header": [
                  {
                    "name": "Authorization",
                    "value": "Bearer {{auth_token}}",
                    "sampleValue": "Bearer {{auth_token}}",
                    "enable": true
                  }
                ]
              },
              "commonParameters": {
                "query": [],
                "body": [],
                "header": [],
                "cookie": []
              },
              "preProcessors": [
                {
                  "id": "dynamicValueDivider",
                  "type": "placeholder",
                  "renderType": "dynamicValueDivider",
                  "defaultEnable": false,
                  "enable": false
                }
              ],
              "postProcessors": [
                {
                  "type": "assertion",
                  "data": {
                    "name": "业务码 code=200",
                    "subject": "responseJson",
                    "comparison": "equal",
                    "value": "200",
                    "path": "$.code",
                    "multipleValue": [],
                    "extractSettings": {
                      "expression": "$.code",
                      "continueExtractorSettings": {
                        "isContinueExtractValue": false,
                        "JsonArrayValueIndexValue": ""
                      }
                    }
                  },
                  "defaultEnable": false,
                  "enable": true
                },
                {
                  "type": "customScript",
                  "data": "const __text = pm.response.text();\nlet __json = null;\ntry { __json = pm.response.json(); } catch (e) {}\npm.test('HTTP 状态码 = 200', function () { pm.expect(pm.response.code).to.equal(200); });\npm.test('响应正文存在', function () { pm.expect(__text.length).to.be.greaterThan(0); });\npm.test('响应正文是 JSON', function () { pm.expect(__json).to.be.an('object'); });\npm.test('业务码 code = 200', function () { pm.expect(__json && __json.code).to.equal(200); });\npm.test('响应包含 data 字段', function () { pm.expect(__json).to.have.property('data'); });\nfunction __summaryText(body) {\n  if (!body || typeof body !== 'object') return '非 JSON 响应';\n  const parts = ['code=' + String(body.code)];\n  if (body.message && body.message !== 'OK') parts.push('message=' + String(body.message).slice(0, 32));\n  const data = body.data;\n  if (Array.isArray(data)) parts.push('items=' + data.length);\n  else if (data && typeof data === 'object') {\n    ['id', 'result', 'value', 'source', 'exception', 'ok', 'total', 'page', 'pageSize'].forEach(function (key) {\n      if (data[key] !== undefined && data[key] !== null) parts.push(key + '=' + String(data[key]).slice(0, 24));\n    });\n    if (Array.isArray(data.items)) {\n      parts.push('items=' + data.items.length);\n      if (data.items[0] && data.items[0].id !== undefined) parts.push('firstId=' + data.items[0].id);\n    }\n    if (typeof data.csv === 'string') parts.push('csvChars=' + data.csv.length);\n    if (parts.length === 1) parts.push('dataKeys=' + Object.keys(data).filter(function (key) { return !/token|password|secret|authorization|access.?key/i.test(key); }).slice(0, 8).join(','));\n  }\n  return parts.join('，').slice(0, 88);\n}\npm.test('关键返回值｜' + __summaryText(__json), function () { pm.expect(__text.length).to.be.greaterThan(0); });\nfunction __redact(value) {\n  if (Array.isArray(value)) return value.slice(0, 20).map(__redact);\n  if (value && typeof value === 'object') {\n    const out = {};\n    Object.keys(value).slice(0, 80).forEach(function (key) {\n      if (/token|password|secret|authorization|access.?key/i.test(key)) out[key] = '[REDACTED]';\n      else out[key] = __redact(value[key]);\n    });\n    return out;\n  }\n  if (typeof value === 'string') {\n    const masked = value\n      .replace(/(\\\"(?:password|token|secret|authorization|access.?key)\\\"\\s*:\\s*\\\")[^\\\"]*/ig, '$1[REDACTED]')\n      .replace(/(Bearer\\s+)[A-Za-z0-9._-]+/ig, '$1[REDACTED]');\n    return masked.length > 2000 ? masked.slice(0, 2000) + '...[TRUNCATED]' : masked;\n  }\n  return value;\n}\nconst __evidence = {\n  step: pm.info.requestName,\n  method: pm.request.method,\n  url: pm.request.url.toString(),\n  httpStatus: pm.response.code,\n  responseTimeMs: pm.response.responseTime,\n  responseSize: pm.response.responseSize,\n  requestBody: pm.request.body ? __redact(pm.request.body.toJSON ? pm.request.body.toJSON() : String(pm.request.body)) : null,\n  responseBody: __redact(__json === null ? __text : __json)\n};\nconsole.log('APIFOX_EVIDENCE ' + JSON.stringify(__evidence));",
                  "defaultEnable": false,
                  "enable": true
                }
              ],
              "auth": {
                "type": "bearer",
                "bearer": {
                  "token": "{{auth_token}}"
                }
              },
              "securityScheme": {},
              "advancedSettings": {
                "disabledSystemHeaders": {},
                "isDefaultUrlEncoding": 2,
                "disableUrlEncoding": false
              },
              "projectId": 8881630,
              "relatedId": 8793626,
              "creatorId": 450335,
              "editorId": 450335
            }
          }
        ],
        "isOpen": true,
        "number": 1
      }
    ],
    "externalAssociationType": "",
    "options": {},
    "performanceTestOptions": {},
    "tags": [],
    "creatorId": 450335,
    "editorId": 450335,
    "preProcessors": [],
    "postProcessors": [],
    "createdAt": "2026-09-26T01:08:20.000Z",
    "updatedAt": "2026-09-26T01:30:27.000Z"
  }
}