{ "info": { "_postman_id": "5b90b987-503f-484c-b8d7-a0974674e95d", "name": "t-erp-auto-test", "description": "T系列ERP自动化测试集合\\[for Jenkins\\]", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "3170378" }, "item": [ { "name": "登录", "item": [ { "name": "登录", "event": [ { "listen": "test", "script": { "exec": [ "// 登录测试脚本", "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));", "", "var jsonData = pm.response.json();", "", "pm.test(\"✅ 必需字段存在\", () => {", " pm.expect(jsonData).to.include.all.keys(", " 'LoginId', 'CompNo', 'UserNo', 'LoginIdExpiry'", " );", "});", "", "pm.test(\"✅ 字段值正确\", () => {", " pm.expect(jsonData.CompNo).to.equal('TAPI');", " pm.expect(jsonData.UserNo).to.equal('API');", " pm.expect(jsonData.ClientType).to.equal('JksAutoTestApi');", " pm.expect(jsonData.LoginIdExpiry).to.equal(604800);", "});", "", "pm.test(\"✅ 保存登录令牌\", () => {", " pm.expect(jsonData.LoginId).to.be.a('string').and.not.empty;", " pm.environment.set(\"t-erp-api-login-id\", jsonData.LoginId);", " console.log(`✅ 令牌已保存: ${jsonData.LoginId.substring(0, 15)}...`);", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [ { "key": "LanguageId", "value": "{{t-erp-api-language}}", "description": "0:简体;1:繁体;2:英文" }, { "key": "Authorization", "value": "{{t-erp-api-authorization}}", "description": "服务:237;账套:TAPI;用户:API" }, { "key": "ClientType", "value": "{{t-erp-api-client-type}}", "description": "JksAutoTestApi" }, { "key": "Content-Type", "value": "{{t-erp-api-content-type}}", "description": "application/json" }, { "key": "X-Tiansi-Auth-Bypass", "value": "{{t-erp-api-x-tiansi-bypass}}", "description": "跳过接口注册检验", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "description": "用于Linker定位ERP服务", "type": "text" } ], "url": { "raw": "{{t-erp-api-url}}/User/login", "host": [ "{{t-erp-api-url}}" ], "path": [ "User", "login" ] }, "description": "登录系统" }, "response": [] } ], "description": "登录" }, { "name": "部门资料", "item": [ { "name": "新增部门", "event": [ { "listen": "test", "script": { "exec": [ "// 完整可用的部门接口测试脚本\r", "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));\r", "\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 1. 验证响应结构\r", "pm.test(\"📋 响应结构验证\", () => {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 2. 验证请求数据(修正后的正确写法)\r", "pm.test(\"✅ 请求部门数据验证\", () => {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((dept, idx) => {\r", " const deptNum = idx + 1;\r", " \r", " // 验证必填字段存在\r", " pm.expect(dept, `部门${deptNum}`).to.include.keys('DEP', 'NAME');\r", " \r", " // 验证字段类型和值\r", " pm.expect(dept.DEP, `部门${deptNum}的部门代码`).to.be.a('string').that.is.not.empty;\r", " pm.expect(dept.NAME, `部门${deptNum}的部门名称`).to.be.a('string').that.is.not.empty;\r", " \r", " // 可选字段验证\r", " if (dept.ENG_NAME !== undefined) {\r", " pm.expect(dept.ENG_NAME).to.be.a('string');\r", " }\r", " \r", " if (dept.UP !== undefined) {\r", " pm.expect(dept.UP).to.be.a('string');\r", " }\r", " });\r", "});\r", "\r", "// 3. 验证业务结果\r", "pm.test(\"📊 操作结果验证\", () => {\r", " const total = requestData.length;\r", " \r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " if (responseData.ErrorCount === 0) {\r", " pm.expect(responseData.OkCount).to.equal(total);\r", " pm.expect(responseData.ErrorData).to.eql([]);\r", " console.log(`✅ 成功处理 ${responseData.OkCount} 个部门`);\r", " } else {\r", " console.log(`⚠️ 部分失败: ${responseData.OkCount} 成功, ${responseData.ErrorCount} 失败`);\r", " \r", " // 验证错误数据\r", " responseData.ErrorData.forEach(error => {\r", " pm.expect(error).to.include.keys('Index', 'DEP', 'ErrorMessage');\r", " pm.expect(error.Index).to.be.within(0, total - 1);\r", " });\r", " }\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"DEP\": \"0001\", // 必须,部门代号,该部门代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"0001部门\", // 必须,部门名称\r\n \"ENG_NAME\": \"0001Dep\", // 非必须,英文名称\r\n \"UP\": \"0000\" // 非必须,上层部门代号\r\n },\r\n {\r\n \"DEP\": \"0002\", // 必须,部门代号,该部门代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"0002部门\", // 必须,部门名称\r\n \"ENG_NAME\": \"0002Dep\", // 非必须,英文名称\r\n \"UP\": \"0001\" // 非必须,上层部门代号\r\n },\r\n {\r\n \"DEP\": \"0003\", // 必须,部门代号,该部门代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"0003部门\", // 必须,部门名称\r\n \"ENG_NAME\": \"0003Dep\", // 非必须,英文名称\r\n \"UP\": \"0002\" // 非必须,上层部门代号\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Dept/AppendToDept", "host": [ "{{t-erp-api-url}}" ], "path": [ "Dept", "AppendToDept" ] }, "description": "新增部门资料" }, "response": [] }, { "name": "删除部门", "event": [ { "listen": "test", "script": { "exec": [ "// 简化版删除部门测试脚本\r", "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));\r", "\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 基础验证\r", "pm.test(\"✅ 响应结构验证\", () => {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", "});\r", "\r", "// 请求数据验证\r", "pm.test(\"✅ 删除请求数据验证\", () => {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((item, index) => {\r", " pm.expect(item).to.have.property('DEP');\r", " pm.expect(item.DEP).to.be.a('string').and.not.empty;\r", " });\r", " \r", " console.log(`🗑️ 请求删除 ${requestData.length} 个部门`);\r", "});\r", "\r", "// 业务结果验证\r", "pm.test(\"📊 删除结果验证\", () => {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount).to.equal(0);\r", " pm.expect(responseData.OkCount).to.equal(total);\r", " pm.expect(responseData.ErrorData).to.eql([]);\r", " \r", " console.log(`✅ 成功删除 ${responseData.OkCount} 个部门`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"DEP\": \"0003\" // 必须,部门代号,删除该笔部门资料\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Dept/DeleteForDept", "host": [ "{{t-erp-api-url}}" ], "path": [ "Dept", "DeleteForDept" ] }, "description": "删除部门资料" }, "response": [] } ], "description": "部门资料" }, { "name": "员工资料", "item": [ { "name": "新增员工", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 员工数据验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((employee, index) => {\r", " const empNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(employee, `员工${empNum}`).to.include.keys('SAL_NO', 'NAME', 'DEP');\r", " pm.expect(employee.SAL_NO, `员工${empNum}工号`).to.be.a('string').and.not.empty;\r", " pm.expect(employee.NAME, `员工${empNum}姓名`).to.be.a('string').and.not.empty;\r", " pm.expect(employee.DEP, `员工${empNum}部门`).to.be.a('string').and.not.empty;\r", " \r", " // 可选字段类型验证(如果存在)\r", " if (employee.POS !== undefined) {\r", " pm.expect(employee.POS).to.be.a('string');\r", " }\r", " if (employee.UP_SAL_NO !== undefined) {\r", " pm.expect(employee.UP_SAL_NO).to.be.a('string');\r", " }\r", " if (employee.TOPSWD !== undefined) {\r", " pm.expect(employee.TOPSWD).to.be.a('string');\r", " }\r", " if (employee.REM !== undefined) {\r", " pm.expect(employee.REM).to.be.a('string');\r", " }\r", " });\r", " \r", " console.log(`✅ 已验证 ${requestData.length} 个员工数据`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 操作结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个员工`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"SAL_NO\": \"ZS\", // 必须,员工代号,该员工代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"张三\", // 必须,员工名称 \r\n \"POS\": \"机床操作主管\", // 非必须,职称\r\n \"DEP\": \"0001\", // 部门代号\r\n \"TOPSWD\": \"T\", // 非必须,同步到登录用户\r\n \"REM\": \"机床操作主管\" // 非必须,摘要\r\n },\r\n {\r\n \"SAL_NO\": \"LS\", // 必须,员工代号,该员工代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"李四\", // 必须,员工名称 \r\n \"POS\": \"机床操作工\", // 非必须,职称\r\n \"DEP\": \"0001\", // 部门代号\r\n \"UP_SAL_NO\": \"ZS\", // 上级主管\r\n \"TOPSWD\": \"T\", // 非必须,同步到登录用户\r\n \"REM\": \"机床操作工\" // 非必须,摘要\r\n },\r\n {\r\n \"SAL_NO\": \"WW\", // 必须,员工代号,该员工代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"王五\", // 必须,员工名称 \r\n \"POS\": \"机床操作工\", // 非必须,职称\r\n \"DEP\": \"0001\", // 部门代号\r\n \"REM\": \"机床操作工\" // 非必须,摘要\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Salm/AppendToSalm", "host": [ "{{t-erp-api-url}}" ], "path": [ "Salm", "AppendToSalm" ] }, "description": "新增员工资料" }, "response": [] }, { "name": "删除员工", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 删除请求验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((item, index) => {\r", " const itemNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(item, `删除项${itemNum}`).to.have.property('SAL_NO');\r", " pm.expect(item.SAL_NO, `员工${itemNum}工号`).to.be.a('string').and.not.empty;\r", " });\r", " \r", " console.log(`🗑️ 请求删除 ${requestData.length} 个员工`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 删除结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个员工`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"SAL_NO\": \"WW\" // 必须,员工代号,删除该笔员工资料\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Salm/DeleteForSalm", "host": [ "{{t-erp-api-url}}" ], "path": [ "Salm", "DeleteForSalm" ] }, "description": "删除员工资料" }, "response": [] } ], "description": "员工资料" }, { "name": "仓库资料", "item": [ { "name": "新增仓库", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 仓库数据验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((warehouse, index) => {\r", " const whNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(warehouse, `仓库${whNum}`).to.include.keys('WH', 'NAME');\r", " pm.expect(warehouse.WH, `仓库${whNum}代号`).to.be.a('string').and.not.empty;\r", " pm.expect(warehouse.NAME, `仓库${whNum}名称`).to.be.a('string').and.not.empty;\r", " \r", " // 可选字段类型验证(如果存在)\r", " const optionalFields = ['ATTRIB', 'UP_WH', 'INVALID', 'VMIVALID', 'LOC_ID', 'OUT_ID'];\r", " optionalFields.forEach(field => {\r", " if (warehouse[field] !== undefined) {\r", " pm.expect(warehouse[field]).to.be.a('string');\r", " }\r", " });\r", " });\r", " \r", " console.log(`✅ 已验证 ${requestData.length} 个仓库数据`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 操作结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个仓库`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"WH\": \"0001\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"原料仓\", // 必须,仓库名称 \r\n \"ATTRIB\": \"2\", // 非必须,属性\r\n \"UP_WH\": \"0000\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0002\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"半成品仓\", // 必须,仓库名称 \r\n \"ATTRIB\": \"3\", // 非必须,属性\r\n \"UP_WH\": \"0001\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0003\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"制成品仓\", // 必须,仓库名称 \r\n \"ATTRIB\": \"5\", // 非必须,属性\r\n \"UP_WH\": \"0002\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0004\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"废品仓\", // 必须,仓库名称\r\n \"INVALID\": \"T\", // 是否勾选废品仓\r\n \"UP_WH\": \"0000\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0005\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"寄售仓\", // 必须,仓库名称\r\n \"VMIVALID\": \"T\", // 是否勾选寄售仓\r\n \"UP_WH\": \"0000\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0006\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"储位仓\", // 必须,仓库名称\r\n \"LOC_ID\": \"T\", // 是否勾选寄售仓\r\n \"OUT_ID\": \"1\", // 出库规则\r\n \"UP_WH\": \"0000\" // 非必须,上层仓库\r\n },\r\n {\r\n \"WH\": \"0007\", // 必须,仓库代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"原料仓2\", // 必须,仓库名称 \r\n \"ATTRIB\": \"2\", // 非必须,属性\r\n \"UP_WH\": \"0000\" // 非必须,上层仓库\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Wh/AppendToWh", "host": [ "{{t-erp-api-url}}" ], "path": [ "Wh", "AppendToWh" ] }, "description": "新增仓库资料" }, "response": [] } ], "description": "仓库资料" }, { "name": "货品资料", "item": [ { "name": "新增货品", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 货品数据验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((product, index) => {\r", " const prodNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(product, `货品${prodNum}`).to.include.keys('PRD_NO', 'NAME', 'UT');\r", " pm.expect(product.PRD_NO, `货品${prodNum}代号`).to.be.a('string').and.not.empty;\r", " pm.expect(product.NAME, `货品${prodNum}名称`).to.be.a('string').and.not.empty;\r", " pm.expect(product.UT, `货品${prodNum}单位`).to.be.a('string').and.not.empty;\r", " \r", " // 可选字段类型验证(如果存在)\r", " const optionalFields = ['WH', 'REM', 'CHK_BAT', 'CHK_MARK'];\r", " optionalFields.forEach(field => {\r", " if (product[field] !== undefined) {\r", " pm.expect(product[field]).to.be.a('string');\r", " }\r", " });\r", " });\r", " \r", " console.log(`✅ 已验证 ${requestData.length} 个货品数据`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 操作结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个货品`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"PRD_NO\": \"YL0001\", // 必须,货品代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"原料0001\", // 必须,货品名称\r\n \"UT\": \"个\", // 必须,主单位\r\n \"WH\": \"0001\", // 非必须,预入仓库\r\n \"REM\": \"原料0001摘要,API测试\" // 非必须,摘要\r\n },\r\n {\r\n \"PRD_NO\": \"YL0002\", // 必须,货品代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"原料0002\", // 必须,货品名称\r\n \"UT\": \"个\", // 必须,主单位\r\n \"WH\": \"0001\", // 非必须,预入仓库\r\n \"REM\": \"原料0002摘要,API测试\" // 非必须,摘要\r\n },\r\n {\r\n \"PRD_NO\": \"BCP0001\", // 必须,货品代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"半成品0001\", // 必须,货品名称\r\n \"UT\": \"KG\", // 必须,主单位\r\n \"WH\": \"0002\", // 非必须,预入仓库\r\n \"CHK_BAT\": \"T\", // 批号管制\r\n \"REM\": \"半成品0001摘要,API测试\" // 非必须,摘要\r\n },\r\n {\r\n \"PRD_NO\": \"ZCP0001\", // 必须,货品代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"制成品0001\", // 必须,货品名称\r\n \"UT\": \"KG\", // 必须,主单位\r\n \"WH\": \"0003\", // 非必须,预入仓库\r\n \"CHK_MARK\": \"T\", // 特征管制\r\n \"REM\": \"制成品0001摘要,API测试\" // 非必须,摘要\r\n },\r\n {\r\n \"PRD_NO\": \"ZCP0002\", // 必须,货品代号,该货品代号在资料中存在即为修改原数据,不存在为新增\r\n \"NAME\": \"制成品0002\", // 必须,货品名称\r\n \"UT\": \"KG\", // 必须,主单位\r\n \"WH\": \"0003\", // 非必须,预入仓库\r\n \"CHK_BAT\": \"T\", // 批号管制\r\n \"CHK_MARK\": \"T\", // 特征管制\r\n \"REM\": \"制成品0002摘要,API测试\" // 非必须,摘要\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Prdt/AppendToPrdt", "host": [ "{{t-erp-api-url}}" ], "path": [ "Prdt", "AppendToPrdt" ] }, "description": "新增货品" }, "response": [] }, { "name": "删除货品", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 删除请求验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((item, index) => {\r", " const itemNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(item, `删除项${itemNum}`).to.have.property('PRD_NO');\r", " pm.expect(item.PRD_NO, `货品${itemNum}代号`).to.be.a('string').and.not.empty;\r", " });\r", " \r", " console.log(`🗑️ 请求删除 ${requestData.length} 个货品`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 删除结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个货品`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"PRD_NO\": \"YL0002\" // 必须,货品代号,删除该笔货品资料\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Prdt/DeleteForPrdt", "host": [ "{{t-erp-api-url}}" ], "path": [ "Prdt", "DeleteForPrdt" ] }, "description": "删除货品资料" }, "response": [] } ], "description": "货品资料" }, { "name": "客户厂商资料", "item": [ { "name": "新增客户", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 客户数据验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((customer, index) => {\r", " const custNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(customer, `客户${custNum}`).to.include.keys('CUS_NO', 'OBJ_ID', 'NAME');\r", " pm.expect(customer.CUS_NO, `客户${custNum}代号`).to.be.a('string').and.not.empty;\r", " pm.expect(customer.NAME, `客户${custNum}名称`).to.be.a('string').and.not.empty;\r", " pm.expect(customer.OBJ_ID, `客户${custNum}对象别`).to.be.a('string');\r", " \r", " // 验证OBJ_ID取值范围\r", " const validObjIds = ['1', '2', '3'];\r", " if (customer.OBJ_ID && customer.OBJ_ID !== '') {\r", " pm.expect(validObjIds).to.include(\r", " customer.OBJ_ID,\r", " `客户${custNum}的OBJ_ID应为1、2或3,当前值为:${customer.OBJ_ID}`\r", " );\r", " }\r", " \r", " // 可选字段类型验证(如果存在)\r", " const optionalFields = ['SAL', 'ID1_TAX', 'MAS_CUS', 'REM'];\r", " optionalFields.forEach(field => {\r", " if (customer[field] !== undefined) {\r", " pm.expect(customer[field]).to.be.a('string');\r", " }\r", " });\r", " });\r", " \r", " console.log(`✅ 已验证 ${requestData.length} 个客户数据`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 操作结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个客户`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"CUS_NO\": \"KH0001\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"1\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"客户A\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"REM\": \"这是客户A备注\" // 非必须,备注\r\n },\r\n {\r\n \"CUS_NO\": \"KH0002\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"3\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"客户B\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"MAS_CUS\": \"KH0001\", // 非必须,归属客户\r\n \"REM\": \"这是客户B备注\" // 非必须,备注\r\n },\r\n {\r\n \"CUS_NO\": \"KH0003\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"1\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"客户C\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"REM\": \"这是客户C备注\" // 非必须,备注\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Cust/AppendToCust", "host": [ "{{t-erp-api-url}}" ], "path": [ "Cust", "AppendToCust" ] }, "description": "新增客户资料" }, "response": [] }, { "name": "删除客户", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 删除请求验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((item, index) => {\r", " const itemNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(item, `删除项${itemNum}`).to.have.property('CUS_NO');\r", " pm.expect(item.CUS_NO, `客户${itemNum}代号`).to.be.a('string').and.not.empty;\r", " });\r", " \r", " console.log(`🗑️ 请求删除 ${requestData.length} 个客户`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 删除结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个客户`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"CUS_NO\": \"KH0003\" // 必须,客户厂商代号,删除该笔客户厂商资料\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Cust/DeleteForCust", "host": [ "{{t-erp-api-url}}" ], "path": [ "Cust", "DeleteForCust" ] }, "description": "删除客户资料" }, "response": [] }, { "name": "新增厂商", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 厂商数据验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((supplier, index) => {\r", " const supNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(supplier, `厂商${supNum}`).to.include.keys('CUS_NO', 'OBJ_ID', 'NAME');\r", " pm.expect(supplier.CUS_NO, `厂商${supNum}代号`).to.be.a('string').and.not.empty;\r", " pm.expect(supplier.NAME, `厂商${supNum}名称`).to.be.a('string').and.not.empty;\r", " pm.expect(supplier.OBJ_ID, `厂商${supNum}对象别`).to.be.a('string');\r", " \r", " // 验证OBJ_ID取值范围(这里厂商应该是2或3,但根据接口说明,1、2、3都允许)\r", " const validObjIds = ['1', '2', '3'];\r", " if (supplier.OBJ_ID && supplier.OBJ_ID !== '') {\r", " pm.expect(validObjIds).to.include(\r", " supplier.OBJ_ID,\r", " `厂商${supNum}的OBJ_ID应为1、2或3,当前值为:${supplier.OBJ_ID}`\r", " );\r", " }\r", " \r", " // 可选字段类型验证(如果存在)\r", " const optionalFields = ['SAL', 'ID1_TAX', 'MAS_CUS', 'REM'];\r", " optionalFields.forEach(field => {\r", " if (supplier[field] !== undefined) {\r", " pm.expect(supplier[field]).to.be.a('string');\r", " }\r", " });\r", " });\r", " \r", " console.log(`✅ 已验证 ${requestData.length} 个厂商数据`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 操作结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个厂商`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"CUS_NO\": \"CS0001\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"2\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"厂商A\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"REM\": \"这是厂商A备注\" // 非必须,备注\r\n },\r\n {\r\n \"CUS_NO\": \"CS0002\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"3\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"厂商B\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"MAS_CUS\": \"CS0001\", // 非必须,归属厂商\r\n \"REM\": \"这是厂商B备注\" // 非必须,备注\r\n },\r\n {\r\n \"CUS_NO\": \"CS0003\", // 必须,客户厂商代号,该客户厂商代号在资料中存在即为修改原数据,不存在为新增\r\n \"OBJ_ID\": \"2\", // 必须,对象别,1:客户,2:厂商,3 :客户厂商;为空时默认取3\r\n \"NAME\": \"厂商C\", // 必须,全称\r\n \"SAL\": \"ZS\", // 非必须,责任业务\r\n \"ID1_TAX\": \"2\", // 非必须,扣税类别\r\n \"REM\": \"这是厂商C备注\" // 非必须,备注\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Cust/AppendToCust", "host": [ "{{t-erp-api-url}}" ], "path": [ "Cust", "AppendToCust" ] }, "description": "新增厂商资料" }, "response": [] }, { "name": "删除厂商", "event": [ { "listen": "test", "script": { "exec": [ "// 1. 基础响应验证\r", "pm.test(\"✅ 状态码 200\", function() {\r", " pm.response.to.have.status(200);\r", "});\r", "\r", "// 2. 获取数据\r", "var requestData = JSON.parse(pm.request.body.raw);\r", "var responseData = pm.response.json();\r", "\r", "// 3. 响应结构验证\r", "pm.test(\"📋 响应结构验证\", function() {\r", " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r", " pm.expect(responseData.OkCount).to.be.a('number');\r", " pm.expect(responseData.ErrorCount).to.be.a('number');\r", " pm.expect(responseData.ErrorData).to.be.an('array');\r", "});\r", "\r", "// 4. 请求数据验证\r", "pm.test(\"✅ 删除请求验证\", function() {\r", " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r", " \r", " requestData.forEach((item, index) => {\r", " const itemNum = index + 1;\r", " \r", " // 必填字段验证\r", " pm.expect(item, `删除项${itemNum}`).to.have.property('CUS_NO');\r", " pm.expect(item.CUS_NO, `厂商${itemNum}代号`).to.be.a('string').and.not.empty;\r", " });\r", " \r", " console.log(`🗑️ 请求删除 ${requestData.length} 个厂商`);\r", "});\r", "\r", "// 5. 业务结果验证\r", "pm.test(\"📊 删除结果验证\", function() {\r", " const total = requestData.length;\r", " \r", " // 验证计数逻辑\r", " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r", " \r", " // 根据成功示例验证\r", " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r", " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r", " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r", " \r", " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个厂商`);\r", "});" ], "type": "text/javascript", "packages": {}, "requests": {} } } ], "request": { "method": "POST", "header": [ { "key": "LoginId", "value": "{{t-erp-api-login-id}}", "type": "text" }, { "key": "sn", "value": "{{t-erp-api-sn}}", "type": "text" } ], "body": { "mode": "raw", "raw": "[\r\n {\r\n \"CUS_NO\": \"CS0003\" // 必须,客户厂商代号,删除该笔客户厂商资料\r\n }\r\n]", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{t-erp-api-url}}/Cust/DeleteForCust", "host": [ "{{t-erp-api-url}}" ], "path": [ "Cust", "DeleteForCust" ] }, "description": "删除厂商资料" }, "response": [] } ], "description": "客户/厂商资料" } ], "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "packages": {}, "requests": {}, "exec": [ "" ] } }, { "listen": "test", "script": { "type": "text/javascript", "packages": {}, "requests": {}, "exec": [ "" ] } } ] }