t-erp-auto-test.json 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. {
  2. "info": {
  3. "_postman_id": "5b90b987-503f-484c-b8d7-a0974674e95d",
  4. "name": "t-erp-auto-test",
  5. "description": "T系列ERP自动化测试集合\\[for Jenkins\\]",
  6. "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
  7. "_exporter_id": "3170378"
  8. },
  9. "item": [
  10. {
  11. "name": "登录",
  12. "item": [
  13. {
  14. "name": "登录",
  15. "event": [
  16. {
  17. "listen": "test",
  18. "script": {
  19. "exec": [
  20. "// 登录测试脚本",
  21. "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));",
  22. "",
  23. "var jsonData = pm.response.json();",
  24. "",
  25. "pm.test(\"✅ 必需字段存在\", () => {",
  26. " pm.expect(jsonData).to.include.all.keys(",
  27. " 'LoginId', 'CompNo', 'UserNo', 'LoginIdExpiry'",
  28. " );",
  29. "});",
  30. "",
  31. "pm.test(\"✅ 字段值正确\", () => {",
  32. " pm.expect(jsonData.CompNo).to.equal('TAPI');",
  33. " pm.expect(jsonData.UserNo).to.equal('API');",
  34. " pm.expect(jsonData.ClientType).to.equal('JksAutoTestApi');",
  35. " pm.expect(jsonData.LoginIdExpiry).to.equal(604800);",
  36. "});",
  37. "",
  38. "pm.test(\"✅ 保存登录令牌\", () => {",
  39. " pm.expect(jsonData.LoginId).to.be.a('string').and.not.empty;",
  40. " pm.environment.set(\"t-erp-api-login-id\", jsonData.LoginId);",
  41. " console.log(`✅ 令牌已保存: ${jsonData.LoginId.substring(0, 15)}...`);",
  42. "});"
  43. ],
  44. "type": "text/javascript",
  45. "packages": {},
  46. "requests": {}
  47. }
  48. }
  49. ],
  50. "request": {
  51. "auth": {
  52. "type": "noauth"
  53. },
  54. "method": "POST",
  55. "header": [
  56. {
  57. "key": "LanguageId",
  58. "value": "{{t-erp-api-language}}",
  59. "description": "0:简体;1:繁体;2:英文"
  60. },
  61. {
  62. "key": "Authorization",
  63. "value": "{{t-erp-api-authorization}}",
  64. "description": "服务:237;账套:TAPI;用户:API"
  65. },
  66. {
  67. "key": "ClientType",
  68. "value": "{{t-erp-api-client-type}}",
  69. "description": "JksAutoTestApi"
  70. },
  71. {
  72. "key": "Content-Type",
  73. "value": "{{t-erp-api-content-type}}",
  74. "description": "application/json"
  75. },
  76. {
  77. "key": "X-Tiansi-Auth-Bypass",
  78. "value": "{{t-erp-api-x-tiansi-bypass}}",
  79. "description": "跳过接口注册检验",
  80. "type": "text"
  81. },
  82. {
  83. "key": "sn",
  84. "value": "{{t-erp-api-sn}}",
  85. "description": "用于Linker定位ERP服务",
  86. "type": "text"
  87. }
  88. ],
  89. "url": {
  90. "raw": "{{t-erp-api-url}}/User/login",
  91. "host": [
  92. "{{t-erp-api-url}}"
  93. ],
  94. "path": [
  95. "User",
  96. "login"
  97. ]
  98. },
  99. "description": "登录系统"
  100. },
  101. "response": []
  102. }
  103. ],
  104. "description": "登录"
  105. },
  106. {
  107. "name": "部门资料",
  108. "item": [
  109. {
  110. "name": "新增部门",
  111. "event": [
  112. {
  113. "listen": "test",
  114. "script": {
  115. "exec": [
  116. "// 完整可用的部门接口测试脚本\r",
  117. "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));\r",
  118. "\r",
  119. "var requestData = JSON.parse(pm.request.body.raw);\r",
  120. "var responseData = pm.response.json();\r",
  121. "\r",
  122. "// 1. 验证响应结构\r",
  123. "pm.test(\"📋 响应结构验证\", () => {\r",
  124. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  125. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  126. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  127. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  128. "});\r",
  129. "\r",
  130. "// 2. 验证请求数据(修正后的正确写法)\r",
  131. "pm.test(\"✅ 请求部门数据验证\", () => {\r",
  132. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  133. " \r",
  134. " requestData.forEach((dept, idx) => {\r",
  135. " const deptNum = idx + 1;\r",
  136. " \r",
  137. " // 验证必填字段存在\r",
  138. " pm.expect(dept, `部门${deptNum}`).to.include.keys('DEP', 'NAME');\r",
  139. " \r",
  140. " // 验证字段类型和值\r",
  141. " pm.expect(dept.DEP, `部门${deptNum}的部门代码`).to.be.a('string').that.is.not.empty;\r",
  142. " pm.expect(dept.NAME, `部门${deptNum}的部门名称`).to.be.a('string').that.is.not.empty;\r",
  143. " \r",
  144. " // 可选字段验证\r",
  145. " if (dept.ENG_NAME !== undefined) {\r",
  146. " pm.expect(dept.ENG_NAME).to.be.a('string');\r",
  147. " }\r",
  148. " \r",
  149. " if (dept.UP !== undefined) {\r",
  150. " pm.expect(dept.UP).to.be.a('string');\r",
  151. " }\r",
  152. " });\r",
  153. "});\r",
  154. "\r",
  155. "// 3. 验证业务结果\r",
  156. "pm.test(\"📊 操作结果验证\", () => {\r",
  157. " const total = requestData.length;\r",
  158. " \r",
  159. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  160. " \r",
  161. " if (responseData.ErrorCount === 0) {\r",
  162. " pm.expect(responseData.OkCount).to.equal(total);\r",
  163. " pm.expect(responseData.ErrorData).to.eql([]);\r",
  164. " console.log(`✅ 成功处理 ${responseData.OkCount} 个部门`);\r",
  165. " } else {\r",
  166. " console.log(`⚠️ 部分失败: ${responseData.OkCount} 成功, ${responseData.ErrorCount} 失败`);\r",
  167. " \r",
  168. " // 验证错误数据\r",
  169. " responseData.ErrorData.forEach(error => {\r",
  170. " pm.expect(error).to.include.keys('Index', 'DEP', 'ErrorMessage');\r",
  171. " pm.expect(error.Index).to.be.within(0, total - 1);\r",
  172. " });\r",
  173. " }\r",
  174. "});"
  175. ],
  176. "type": "text/javascript",
  177. "packages": {},
  178. "requests": {}
  179. }
  180. }
  181. ],
  182. "request": {
  183. "method": "POST",
  184. "header": [
  185. {
  186. "key": "LoginId",
  187. "value": "{{t-erp-api-login-id}}",
  188. "type": "text"
  189. },
  190. {
  191. "key": "sn",
  192. "value": "{{t-erp-api-sn}}",
  193. "type": "text"
  194. }
  195. ],
  196. "body": {
  197. "mode": "raw",
  198. "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]",
  199. "options": {
  200. "raw": {
  201. "language": "json"
  202. }
  203. }
  204. },
  205. "url": {
  206. "raw": "{{t-erp-api-url}}/Dept/AppendToDept",
  207. "host": [
  208. "{{t-erp-api-url}}"
  209. ],
  210. "path": [
  211. "Dept",
  212. "AppendToDept"
  213. ]
  214. },
  215. "description": "新增部门资料"
  216. },
  217. "response": []
  218. },
  219. {
  220. "name": "删除部门",
  221. "event": [
  222. {
  223. "listen": "test",
  224. "script": {
  225. "exec": [
  226. "// 简化版删除部门测试脚本\r",
  227. "pm.test(\"✅ 状态码 200\", () => pm.response.to.have.status(200));\r",
  228. "\r",
  229. "var requestData = JSON.parse(pm.request.body.raw);\r",
  230. "var responseData = pm.response.json();\r",
  231. "\r",
  232. "// 基础验证\r",
  233. "pm.test(\"✅ 响应结构验证\", () => {\r",
  234. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  235. "});\r",
  236. "\r",
  237. "// 请求数据验证\r",
  238. "pm.test(\"✅ 删除请求数据验证\", () => {\r",
  239. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  240. " \r",
  241. " requestData.forEach((item, index) => {\r",
  242. " pm.expect(item).to.have.property('DEP');\r",
  243. " pm.expect(item.DEP).to.be.a('string').and.not.empty;\r",
  244. " });\r",
  245. " \r",
  246. " console.log(`🗑️ 请求删除 ${requestData.length} 个部门`);\r",
  247. "});\r",
  248. "\r",
  249. "// 业务结果验证\r",
  250. "pm.test(\"📊 删除结果验证\", () => {\r",
  251. " const total = requestData.length;\r",
  252. " \r",
  253. " // 验证计数逻辑\r",
  254. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  255. " \r",
  256. " // 根据成功示例验证\r",
  257. " pm.expect(responseData.ErrorCount).to.equal(0);\r",
  258. " pm.expect(responseData.OkCount).to.equal(total);\r",
  259. " pm.expect(responseData.ErrorData).to.eql([]);\r",
  260. " \r",
  261. " console.log(`✅ 成功删除 ${responseData.OkCount} 个部门`);\r",
  262. "});"
  263. ],
  264. "type": "text/javascript",
  265. "packages": {},
  266. "requests": {}
  267. }
  268. }
  269. ],
  270. "request": {
  271. "method": "POST",
  272. "header": [
  273. {
  274. "key": "LoginId",
  275. "value": "{{t-erp-api-login-id}}",
  276. "type": "text"
  277. },
  278. {
  279. "key": "sn",
  280. "value": "{{t-erp-api-sn}}",
  281. "type": "text"
  282. }
  283. ],
  284. "body": {
  285. "mode": "raw",
  286. "raw": "[\r\n {\r\n \"DEP\": \"0003\" // 必须,部门代号,删除该笔部门资料\r\n }\r\n]",
  287. "options": {
  288. "raw": {
  289. "language": "json"
  290. }
  291. }
  292. },
  293. "url": {
  294. "raw": "{{t-erp-api-url}}/Dept/DeleteForDept",
  295. "host": [
  296. "{{t-erp-api-url}}"
  297. ],
  298. "path": [
  299. "Dept",
  300. "DeleteForDept"
  301. ]
  302. },
  303. "description": "删除部门资料"
  304. },
  305. "response": []
  306. }
  307. ],
  308. "description": "部门资料"
  309. },
  310. {
  311. "name": "员工资料",
  312. "item": [
  313. {
  314. "name": "新增员工",
  315. "event": [
  316. {
  317. "listen": "test",
  318. "script": {
  319. "exec": [
  320. "// 1. 基础响应验证\r",
  321. "pm.test(\"✅ 状态码 200\", function() {\r",
  322. " pm.response.to.have.status(200);\r",
  323. "});\r",
  324. "\r",
  325. "// 2. 获取数据\r",
  326. "var requestData = JSON.parse(pm.request.body.raw);\r",
  327. "var responseData = pm.response.json();\r",
  328. "\r",
  329. "// 3. 响应结构验证\r",
  330. "pm.test(\"📋 响应结构验证\", function() {\r",
  331. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  332. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  333. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  334. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  335. "});\r",
  336. "\r",
  337. "// 4. 请求数据验证\r",
  338. "pm.test(\"✅ 员工数据验证\", function() {\r",
  339. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  340. " \r",
  341. " requestData.forEach((employee, index) => {\r",
  342. " const empNum = index + 1;\r",
  343. " \r",
  344. " // 必填字段验证\r",
  345. " pm.expect(employee, `员工${empNum}`).to.include.keys('SAL_NO', 'NAME', 'DEP');\r",
  346. " pm.expect(employee.SAL_NO, `员工${empNum}工号`).to.be.a('string').and.not.empty;\r",
  347. " pm.expect(employee.NAME, `员工${empNum}姓名`).to.be.a('string').and.not.empty;\r",
  348. " pm.expect(employee.DEP, `员工${empNum}部门`).to.be.a('string').and.not.empty;\r",
  349. " \r",
  350. " // 可选字段类型验证(如果存在)\r",
  351. " if (employee.POS !== undefined) {\r",
  352. " pm.expect(employee.POS).to.be.a('string');\r",
  353. " }\r",
  354. " if (employee.UP_SAL_NO !== undefined) {\r",
  355. " pm.expect(employee.UP_SAL_NO).to.be.a('string');\r",
  356. " }\r",
  357. " if (employee.TOPSWD !== undefined) {\r",
  358. " pm.expect(employee.TOPSWD).to.be.a('string');\r",
  359. " }\r",
  360. " if (employee.REM !== undefined) {\r",
  361. " pm.expect(employee.REM).to.be.a('string');\r",
  362. " }\r",
  363. " });\r",
  364. " \r",
  365. " console.log(`✅ 已验证 ${requestData.length} 个员工数据`);\r",
  366. "});\r",
  367. "\r",
  368. "// 5. 业务结果验证\r",
  369. "pm.test(\"📊 操作结果验证\", function() {\r",
  370. " const total = requestData.length;\r",
  371. " \r",
  372. " // 验证计数逻辑\r",
  373. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  374. " \r",
  375. " // 根据成功示例验证\r",
  376. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  377. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  378. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  379. " \r",
  380. " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个员工`);\r",
  381. "});"
  382. ],
  383. "type": "text/javascript",
  384. "packages": {},
  385. "requests": {}
  386. }
  387. }
  388. ],
  389. "request": {
  390. "method": "POST",
  391. "header": [
  392. {
  393. "key": "LoginId",
  394. "value": "{{t-erp-api-login-id}}",
  395. "type": "text"
  396. },
  397. {
  398. "key": "sn",
  399. "value": "{{t-erp-api-sn}}",
  400. "type": "text"
  401. }
  402. ],
  403. "body": {
  404. "mode": "raw",
  405. "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]",
  406. "options": {
  407. "raw": {
  408. "language": "json"
  409. }
  410. }
  411. },
  412. "url": {
  413. "raw": "{{t-erp-api-url}}/Salm/AppendToSalm",
  414. "host": [
  415. "{{t-erp-api-url}}"
  416. ],
  417. "path": [
  418. "Salm",
  419. "AppendToSalm"
  420. ]
  421. },
  422. "description": "新增员工资料"
  423. },
  424. "response": []
  425. },
  426. {
  427. "name": "删除员工",
  428. "event": [
  429. {
  430. "listen": "test",
  431. "script": {
  432. "exec": [
  433. "// 1. 基础响应验证\r",
  434. "pm.test(\"✅ 状态码 200\", function() {\r",
  435. " pm.response.to.have.status(200);\r",
  436. "});\r",
  437. "\r",
  438. "// 2. 获取数据\r",
  439. "var requestData = JSON.parse(pm.request.body.raw);\r",
  440. "var responseData = pm.response.json();\r",
  441. "\r",
  442. "// 3. 响应结构验证\r",
  443. "pm.test(\"📋 响应结构验证\", function() {\r",
  444. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  445. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  446. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  447. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  448. "});\r",
  449. "\r",
  450. "// 4. 请求数据验证\r",
  451. "pm.test(\"✅ 删除请求验证\", function() {\r",
  452. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  453. " \r",
  454. " requestData.forEach((item, index) => {\r",
  455. " const itemNum = index + 1;\r",
  456. " \r",
  457. " // 必填字段验证\r",
  458. " pm.expect(item, `删除项${itemNum}`).to.have.property('SAL_NO');\r",
  459. " pm.expect(item.SAL_NO, `员工${itemNum}工号`).to.be.a('string').and.not.empty;\r",
  460. " });\r",
  461. " \r",
  462. " console.log(`🗑️ 请求删除 ${requestData.length} 个员工`);\r",
  463. "});\r",
  464. "\r",
  465. "// 5. 业务结果验证\r",
  466. "pm.test(\"📊 删除结果验证\", function() {\r",
  467. " const total = requestData.length;\r",
  468. " \r",
  469. " // 验证计数逻辑\r",
  470. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  471. " \r",
  472. " // 根据成功示例验证\r",
  473. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  474. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  475. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  476. " \r",
  477. " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个员工`);\r",
  478. "});"
  479. ],
  480. "type": "text/javascript",
  481. "packages": {},
  482. "requests": {}
  483. }
  484. }
  485. ],
  486. "request": {
  487. "method": "POST",
  488. "header": [
  489. {
  490. "key": "LoginId",
  491. "value": "{{t-erp-api-login-id}}",
  492. "type": "text"
  493. },
  494. {
  495. "key": "sn",
  496. "value": "{{t-erp-api-sn}}",
  497. "type": "text"
  498. }
  499. ],
  500. "body": {
  501. "mode": "raw",
  502. "raw": "[\r\n {\r\n \"SAL_NO\": \"WW\" // 必须,员工代号,删除该笔员工资料\r\n }\r\n]",
  503. "options": {
  504. "raw": {
  505. "language": "json"
  506. }
  507. }
  508. },
  509. "url": {
  510. "raw": "{{t-erp-api-url}}/Salm/DeleteForSalm",
  511. "host": [
  512. "{{t-erp-api-url}}"
  513. ],
  514. "path": [
  515. "Salm",
  516. "DeleteForSalm"
  517. ]
  518. },
  519. "description": "删除员工资料"
  520. },
  521. "response": []
  522. }
  523. ],
  524. "description": "员工资料"
  525. },
  526. {
  527. "name": "仓库资料",
  528. "item": [
  529. {
  530. "name": "新增仓库",
  531. "event": [
  532. {
  533. "listen": "test",
  534. "script": {
  535. "exec": [
  536. "// 1. 基础响应验证\r",
  537. "pm.test(\"✅ 状态码 200\", function() {\r",
  538. " pm.response.to.have.status(200);\r",
  539. "});\r",
  540. "\r",
  541. "// 2. 获取数据\r",
  542. "var requestData = JSON.parse(pm.request.body.raw);\r",
  543. "var responseData = pm.response.json();\r",
  544. "\r",
  545. "// 3. 响应结构验证\r",
  546. "pm.test(\"📋 响应结构验证\", function() {\r",
  547. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  548. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  549. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  550. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  551. "});\r",
  552. "\r",
  553. "// 4. 请求数据验证\r",
  554. "pm.test(\"✅ 仓库数据验证\", function() {\r",
  555. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  556. " \r",
  557. " requestData.forEach((warehouse, index) => {\r",
  558. " const whNum = index + 1;\r",
  559. " \r",
  560. " // 必填字段验证\r",
  561. " pm.expect(warehouse, `仓库${whNum}`).to.include.keys('WH', 'NAME');\r",
  562. " pm.expect(warehouse.WH, `仓库${whNum}代号`).to.be.a('string').and.not.empty;\r",
  563. " pm.expect(warehouse.NAME, `仓库${whNum}名称`).to.be.a('string').and.not.empty;\r",
  564. " \r",
  565. " // 可选字段类型验证(如果存在)\r",
  566. " const optionalFields = ['ATTRIB', 'UP_WH', 'INVALID', 'VMIVALID', 'LOC_ID', 'OUT_ID'];\r",
  567. " optionalFields.forEach(field => {\r",
  568. " if (warehouse[field] !== undefined) {\r",
  569. " pm.expect(warehouse[field]).to.be.a('string');\r",
  570. " }\r",
  571. " });\r",
  572. " });\r",
  573. " \r",
  574. " console.log(`✅ 已验证 ${requestData.length} 个仓库数据`);\r",
  575. "});\r",
  576. "\r",
  577. "// 5. 业务结果验证\r",
  578. "pm.test(\"📊 操作结果验证\", function() {\r",
  579. " const total = requestData.length;\r",
  580. " \r",
  581. " // 验证计数逻辑\r",
  582. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  583. " \r",
  584. " // 根据成功示例验证\r",
  585. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  586. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  587. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  588. " \r",
  589. " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个仓库`);\r",
  590. "});"
  591. ],
  592. "type": "text/javascript",
  593. "packages": {},
  594. "requests": {}
  595. }
  596. }
  597. ],
  598. "request": {
  599. "method": "POST",
  600. "header": [
  601. {
  602. "key": "LoginId",
  603. "value": "{{t-erp-api-login-id}}",
  604. "type": "text"
  605. },
  606. {
  607. "key": "sn",
  608. "value": "{{t-erp-api-sn}}",
  609. "type": "text"
  610. }
  611. ],
  612. "body": {
  613. "mode": "raw",
  614. "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]",
  615. "options": {
  616. "raw": {
  617. "language": "json"
  618. }
  619. }
  620. },
  621. "url": {
  622. "raw": "{{t-erp-api-url}}/Wh/AppendToWh",
  623. "host": [
  624. "{{t-erp-api-url}}"
  625. ],
  626. "path": [
  627. "Wh",
  628. "AppendToWh"
  629. ]
  630. },
  631. "description": "新增仓库资料"
  632. },
  633. "response": []
  634. }
  635. ],
  636. "description": "仓库资料"
  637. },
  638. {
  639. "name": "货品资料",
  640. "item": [
  641. {
  642. "name": "新增货品",
  643. "event": [
  644. {
  645. "listen": "test",
  646. "script": {
  647. "exec": [
  648. "// 1. 基础响应验证\r",
  649. "pm.test(\"✅ 状态码 200\", function() {\r",
  650. " pm.response.to.have.status(200);\r",
  651. "});\r",
  652. "\r",
  653. "// 2. 获取数据\r",
  654. "var requestData = JSON.parse(pm.request.body.raw);\r",
  655. "var responseData = pm.response.json();\r",
  656. "\r",
  657. "// 3. 响应结构验证\r",
  658. "pm.test(\"📋 响应结构验证\", function() {\r",
  659. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  660. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  661. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  662. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  663. "});\r",
  664. "\r",
  665. "// 4. 请求数据验证\r",
  666. "pm.test(\"✅ 货品数据验证\", function() {\r",
  667. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  668. " \r",
  669. " requestData.forEach((product, index) => {\r",
  670. " const prodNum = index + 1;\r",
  671. " \r",
  672. " // 必填字段验证\r",
  673. " pm.expect(product, `货品${prodNum}`).to.include.keys('PRD_NO', 'NAME', 'UT');\r",
  674. " pm.expect(product.PRD_NO, `货品${prodNum}代号`).to.be.a('string').and.not.empty;\r",
  675. " pm.expect(product.NAME, `货品${prodNum}名称`).to.be.a('string').and.not.empty;\r",
  676. " pm.expect(product.UT, `货品${prodNum}单位`).to.be.a('string').and.not.empty;\r",
  677. " \r",
  678. " // 可选字段类型验证(如果存在)\r",
  679. " const optionalFields = ['WH', 'REM', 'CHK_BAT', 'CHK_MARK'];\r",
  680. " optionalFields.forEach(field => {\r",
  681. " if (product[field] !== undefined) {\r",
  682. " pm.expect(product[field]).to.be.a('string');\r",
  683. " }\r",
  684. " });\r",
  685. " });\r",
  686. " \r",
  687. " console.log(`✅ 已验证 ${requestData.length} 个货品数据`);\r",
  688. "});\r",
  689. "\r",
  690. "// 5. 业务结果验证\r",
  691. "pm.test(\"📊 操作结果验证\", function() {\r",
  692. " const total = requestData.length;\r",
  693. " \r",
  694. " // 验证计数逻辑\r",
  695. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  696. " \r",
  697. " // 根据成功示例验证\r",
  698. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  699. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  700. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  701. " \r",
  702. " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个货品`);\r",
  703. "});"
  704. ],
  705. "type": "text/javascript",
  706. "packages": {},
  707. "requests": {}
  708. }
  709. }
  710. ],
  711. "request": {
  712. "method": "POST",
  713. "header": [
  714. {
  715. "key": "LoginId",
  716. "value": "{{t-erp-api-login-id}}",
  717. "type": "text"
  718. },
  719. {
  720. "key": "sn",
  721. "value": "{{t-erp-api-sn}}",
  722. "type": "text"
  723. }
  724. ],
  725. "body": {
  726. "mode": "raw",
  727. "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]",
  728. "options": {
  729. "raw": {
  730. "language": "json"
  731. }
  732. }
  733. },
  734. "url": {
  735. "raw": "{{t-erp-api-url}}/Prdt/AppendToPrdt",
  736. "host": [
  737. "{{t-erp-api-url}}"
  738. ],
  739. "path": [
  740. "Prdt",
  741. "AppendToPrdt"
  742. ]
  743. },
  744. "description": "新增货品"
  745. },
  746. "response": []
  747. },
  748. {
  749. "name": "删除货品",
  750. "event": [
  751. {
  752. "listen": "test",
  753. "script": {
  754. "exec": [
  755. "// 1. 基础响应验证\r",
  756. "pm.test(\"✅ 状态码 200\", function() {\r",
  757. " pm.response.to.have.status(200);\r",
  758. "});\r",
  759. "\r",
  760. "// 2. 获取数据\r",
  761. "var requestData = JSON.parse(pm.request.body.raw);\r",
  762. "var responseData = pm.response.json();\r",
  763. "\r",
  764. "// 3. 响应结构验证\r",
  765. "pm.test(\"📋 响应结构验证\", function() {\r",
  766. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  767. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  768. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  769. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  770. "});\r",
  771. "\r",
  772. "// 4. 请求数据验证\r",
  773. "pm.test(\"✅ 删除请求验证\", function() {\r",
  774. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  775. " \r",
  776. " requestData.forEach((item, index) => {\r",
  777. " const itemNum = index + 1;\r",
  778. " \r",
  779. " // 必填字段验证\r",
  780. " pm.expect(item, `删除项${itemNum}`).to.have.property('PRD_NO');\r",
  781. " pm.expect(item.PRD_NO, `货品${itemNum}代号`).to.be.a('string').and.not.empty;\r",
  782. " });\r",
  783. " \r",
  784. " console.log(`🗑️ 请求删除 ${requestData.length} 个货品`);\r",
  785. "});\r",
  786. "\r",
  787. "// 5. 业务结果验证\r",
  788. "pm.test(\"📊 删除结果验证\", function() {\r",
  789. " const total = requestData.length;\r",
  790. " \r",
  791. " // 验证计数逻辑\r",
  792. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  793. " \r",
  794. " // 根据成功示例验证\r",
  795. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  796. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  797. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  798. " \r",
  799. " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个货品`);\r",
  800. "});"
  801. ],
  802. "type": "text/javascript",
  803. "packages": {},
  804. "requests": {}
  805. }
  806. }
  807. ],
  808. "request": {
  809. "method": "POST",
  810. "header": [
  811. {
  812. "key": "LoginId",
  813. "value": "{{t-erp-api-login-id}}",
  814. "type": "text"
  815. },
  816. {
  817. "key": "sn",
  818. "value": "{{t-erp-api-sn}}",
  819. "type": "text"
  820. }
  821. ],
  822. "body": {
  823. "mode": "raw",
  824. "raw": "[\r\n {\r\n \"PRD_NO\": \"YL0002\" // 必须,货品代号,删除该笔货品资料\r\n }\r\n]",
  825. "options": {
  826. "raw": {
  827. "language": "json"
  828. }
  829. }
  830. },
  831. "url": {
  832. "raw": "{{t-erp-api-url}}/Prdt/DeleteForPrdt",
  833. "host": [
  834. "{{t-erp-api-url}}"
  835. ],
  836. "path": [
  837. "Prdt",
  838. "DeleteForPrdt"
  839. ]
  840. },
  841. "description": "删除货品资料"
  842. },
  843. "response": []
  844. }
  845. ],
  846. "description": "货品资料"
  847. },
  848. {
  849. "name": "客户厂商资料",
  850. "item": [
  851. {
  852. "name": "新增客户",
  853. "event": [
  854. {
  855. "listen": "test",
  856. "script": {
  857. "exec": [
  858. "// 1. 基础响应验证\r",
  859. "pm.test(\"✅ 状态码 200\", function() {\r",
  860. " pm.response.to.have.status(200);\r",
  861. "});\r",
  862. "\r",
  863. "// 2. 获取数据\r",
  864. "var requestData = JSON.parse(pm.request.body.raw);\r",
  865. "var responseData = pm.response.json();\r",
  866. "\r",
  867. "// 3. 响应结构验证\r",
  868. "pm.test(\"📋 响应结构验证\", function() {\r",
  869. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  870. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  871. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  872. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  873. "});\r",
  874. "\r",
  875. "// 4. 请求数据验证\r",
  876. "pm.test(\"✅ 客户数据验证\", function() {\r",
  877. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  878. " \r",
  879. " requestData.forEach((customer, index) => {\r",
  880. " const custNum = index + 1;\r",
  881. " \r",
  882. " // 必填字段验证\r",
  883. " pm.expect(customer, `客户${custNum}`).to.include.keys('CUS_NO', 'OBJ_ID', 'NAME');\r",
  884. " pm.expect(customer.CUS_NO, `客户${custNum}代号`).to.be.a('string').and.not.empty;\r",
  885. " pm.expect(customer.NAME, `客户${custNum}名称`).to.be.a('string').and.not.empty;\r",
  886. " pm.expect(customer.OBJ_ID, `客户${custNum}对象别`).to.be.a('string');\r",
  887. " \r",
  888. " // 验证OBJ_ID取值范围\r",
  889. " const validObjIds = ['1', '2', '3'];\r",
  890. " if (customer.OBJ_ID && customer.OBJ_ID !== '') {\r",
  891. " pm.expect(validObjIds).to.include(\r",
  892. " customer.OBJ_ID,\r",
  893. " `客户${custNum}的OBJ_ID应为1、2或3,当前值为:${customer.OBJ_ID}`\r",
  894. " );\r",
  895. " }\r",
  896. " \r",
  897. " // 可选字段类型验证(如果存在)\r",
  898. " const optionalFields = ['SAL', 'ID1_TAX', 'MAS_CUS', 'REM'];\r",
  899. " optionalFields.forEach(field => {\r",
  900. " if (customer[field] !== undefined) {\r",
  901. " pm.expect(customer[field]).to.be.a('string');\r",
  902. " }\r",
  903. " });\r",
  904. " });\r",
  905. " \r",
  906. " console.log(`✅ 已验证 ${requestData.length} 个客户数据`);\r",
  907. "});\r",
  908. "\r",
  909. "// 5. 业务结果验证\r",
  910. "pm.test(\"📊 操作结果验证\", function() {\r",
  911. " const total = requestData.length;\r",
  912. " \r",
  913. " // 验证计数逻辑\r",
  914. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  915. " \r",
  916. " // 根据成功示例验证\r",
  917. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  918. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  919. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  920. " \r",
  921. " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个客户`);\r",
  922. "});"
  923. ],
  924. "type": "text/javascript",
  925. "packages": {},
  926. "requests": {}
  927. }
  928. }
  929. ],
  930. "request": {
  931. "method": "POST",
  932. "header": [
  933. {
  934. "key": "LoginId",
  935. "value": "{{t-erp-api-login-id}}",
  936. "type": "text"
  937. },
  938. {
  939. "key": "sn",
  940. "value": "{{t-erp-api-sn}}",
  941. "type": "text"
  942. }
  943. ],
  944. "body": {
  945. "mode": "raw",
  946. "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]",
  947. "options": {
  948. "raw": {
  949. "language": "json"
  950. }
  951. }
  952. },
  953. "url": {
  954. "raw": "{{t-erp-api-url}}/Cust/AppendToCust",
  955. "host": [
  956. "{{t-erp-api-url}}"
  957. ],
  958. "path": [
  959. "Cust",
  960. "AppendToCust"
  961. ]
  962. },
  963. "description": "新增客户资料"
  964. },
  965. "response": []
  966. },
  967. {
  968. "name": "删除客户",
  969. "event": [
  970. {
  971. "listen": "test",
  972. "script": {
  973. "exec": [
  974. "// 1. 基础响应验证\r",
  975. "pm.test(\"✅ 状态码 200\", function() {\r",
  976. " pm.response.to.have.status(200);\r",
  977. "});\r",
  978. "\r",
  979. "// 2. 获取数据\r",
  980. "var requestData = JSON.parse(pm.request.body.raw);\r",
  981. "var responseData = pm.response.json();\r",
  982. "\r",
  983. "// 3. 响应结构验证\r",
  984. "pm.test(\"📋 响应结构验证\", function() {\r",
  985. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  986. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  987. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  988. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  989. "});\r",
  990. "\r",
  991. "// 4. 请求数据验证\r",
  992. "pm.test(\"✅ 删除请求验证\", function() {\r",
  993. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  994. " \r",
  995. " requestData.forEach((item, index) => {\r",
  996. " const itemNum = index + 1;\r",
  997. " \r",
  998. " // 必填字段验证\r",
  999. " pm.expect(item, `删除项${itemNum}`).to.have.property('CUS_NO');\r",
  1000. " pm.expect(item.CUS_NO, `客户${itemNum}代号`).to.be.a('string').and.not.empty;\r",
  1001. " });\r",
  1002. " \r",
  1003. " console.log(`🗑️ 请求删除 ${requestData.length} 个客户`);\r",
  1004. "});\r",
  1005. "\r",
  1006. "// 5. 业务结果验证\r",
  1007. "pm.test(\"📊 删除结果验证\", function() {\r",
  1008. " const total = requestData.length;\r",
  1009. " \r",
  1010. " // 验证计数逻辑\r",
  1011. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  1012. " \r",
  1013. " // 根据成功示例验证\r",
  1014. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  1015. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  1016. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  1017. " \r",
  1018. " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个客户`);\r",
  1019. "});"
  1020. ],
  1021. "type": "text/javascript",
  1022. "packages": {},
  1023. "requests": {}
  1024. }
  1025. }
  1026. ],
  1027. "request": {
  1028. "method": "POST",
  1029. "header": [
  1030. {
  1031. "key": "LoginId",
  1032. "value": "{{t-erp-api-login-id}}",
  1033. "type": "text"
  1034. },
  1035. {
  1036. "key": "sn",
  1037. "value": "{{t-erp-api-sn}}",
  1038. "type": "text"
  1039. }
  1040. ],
  1041. "body": {
  1042. "mode": "raw",
  1043. "raw": "[\r\n {\r\n \"CUS_NO\": \"KH0003\" // 必须,客户厂商代号,删除该笔客户厂商资料\r\n }\r\n]",
  1044. "options": {
  1045. "raw": {
  1046. "language": "json"
  1047. }
  1048. }
  1049. },
  1050. "url": {
  1051. "raw": "{{t-erp-api-url}}/Cust/DeleteForCust",
  1052. "host": [
  1053. "{{t-erp-api-url}}"
  1054. ],
  1055. "path": [
  1056. "Cust",
  1057. "DeleteForCust"
  1058. ]
  1059. },
  1060. "description": "删除客户资料"
  1061. },
  1062. "response": []
  1063. },
  1064. {
  1065. "name": "新增厂商",
  1066. "event": [
  1067. {
  1068. "listen": "test",
  1069. "script": {
  1070. "exec": [
  1071. "// 1. 基础响应验证\r",
  1072. "pm.test(\"✅ 状态码 200\", function() {\r",
  1073. " pm.response.to.have.status(200);\r",
  1074. "});\r",
  1075. "\r",
  1076. "// 2. 获取数据\r",
  1077. "var requestData = JSON.parse(pm.request.body.raw);\r",
  1078. "var responseData = pm.response.json();\r",
  1079. "\r",
  1080. "// 3. 响应结构验证\r",
  1081. "pm.test(\"📋 响应结构验证\", function() {\r",
  1082. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  1083. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  1084. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  1085. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  1086. "});\r",
  1087. "\r",
  1088. "// 4. 请求数据验证\r",
  1089. "pm.test(\"✅ 厂商数据验证\", function() {\r",
  1090. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  1091. " \r",
  1092. " requestData.forEach((supplier, index) => {\r",
  1093. " const supNum = index + 1;\r",
  1094. " \r",
  1095. " // 必填字段验证\r",
  1096. " pm.expect(supplier, `厂商${supNum}`).to.include.keys('CUS_NO', 'OBJ_ID', 'NAME');\r",
  1097. " pm.expect(supplier.CUS_NO, `厂商${supNum}代号`).to.be.a('string').and.not.empty;\r",
  1098. " pm.expect(supplier.NAME, `厂商${supNum}名称`).to.be.a('string').and.not.empty;\r",
  1099. " pm.expect(supplier.OBJ_ID, `厂商${supNum}对象别`).to.be.a('string');\r",
  1100. " \r",
  1101. " // 验证OBJ_ID取值范围(这里厂商应该是2或3,但根据接口说明,1、2、3都允许)\r",
  1102. " const validObjIds = ['1', '2', '3'];\r",
  1103. " if (supplier.OBJ_ID && supplier.OBJ_ID !== '') {\r",
  1104. " pm.expect(validObjIds).to.include(\r",
  1105. " supplier.OBJ_ID,\r",
  1106. " `厂商${supNum}的OBJ_ID应为1、2或3,当前值为:${supplier.OBJ_ID}`\r",
  1107. " );\r",
  1108. " }\r",
  1109. " \r",
  1110. " // 可选字段类型验证(如果存在)\r",
  1111. " const optionalFields = ['SAL', 'ID1_TAX', 'MAS_CUS', 'REM'];\r",
  1112. " optionalFields.forEach(field => {\r",
  1113. " if (supplier[field] !== undefined) {\r",
  1114. " pm.expect(supplier[field]).to.be.a('string');\r",
  1115. " }\r",
  1116. " });\r",
  1117. " });\r",
  1118. " \r",
  1119. " console.log(`✅ 已验证 ${requestData.length} 个厂商数据`);\r",
  1120. "});\r",
  1121. "\r",
  1122. "// 5. 业务结果验证\r",
  1123. "pm.test(\"📊 操作结果验证\", function() {\r",
  1124. " const total = requestData.length;\r",
  1125. " \r",
  1126. " // 验证计数逻辑\r",
  1127. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  1128. " \r",
  1129. " // 根据成功示例验证\r",
  1130. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  1131. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  1132. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  1133. " \r",
  1134. " console.log(`✅ 成功处理 ${responseData.OkCount}/${total} 个厂商`);\r",
  1135. "});"
  1136. ],
  1137. "type": "text/javascript",
  1138. "packages": {},
  1139. "requests": {}
  1140. }
  1141. }
  1142. ],
  1143. "request": {
  1144. "method": "POST",
  1145. "header": [
  1146. {
  1147. "key": "LoginId",
  1148. "value": "{{t-erp-api-login-id}}",
  1149. "type": "text"
  1150. },
  1151. {
  1152. "key": "sn",
  1153. "value": "{{t-erp-api-sn}}",
  1154. "type": "text"
  1155. }
  1156. ],
  1157. "body": {
  1158. "mode": "raw",
  1159. "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]",
  1160. "options": {
  1161. "raw": {
  1162. "language": "json"
  1163. }
  1164. }
  1165. },
  1166. "url": {
  1167. "raw": "{{t-erp-api-url}}/Cust/AppendToCust",
  1168. "host": [
  1169. "{{t-erp-api-url}}"
  1170. ],
  1171. "path": [
  1172. "Cust",
  1173. "AppendToCust"
  1174. ]
  1175. },
  1176. "description": "新增厂商资料"
  1177. },
  1178. "response": []
  1179. },
  1180. {
  1181. "name": "删除厂商",
  1182. "event": [
  1183. {
  1184. "listen": "test",
  1185. "script": {
  1186. "exec": [
  1187. "// 1. 基础响应验证\r",
  1188. "pm.test(\"✅ 状态码 200\", function() {\r",
  1189. " pm.response.to.have.status(200);\r",
  1190. "});\r",
  1191. "\r",
  1192. "// 2. 获取数据\r",
  1193. "var requestData = JSON.parse(pm.request.body.raw);\r",
  1194. "var responseData = pm.response.json();\r",
  1195. "\r",
  1196. "// 3. 响应结构验证\r",
  1197. "pm.test(\"📋 响应结构验证\", function() {\r",
  1198. " pm.expect(responseData).to.have.all.keys('OkCount', 'ErrorCount', 'ErrorData');\r",
  1199. " pm.expect(responseData.OkCount).to.be.a('number');\r",
  1200. " pm.expect(responseData.ErrorCount).to.be.a('number');\r",
  1201. " pm.expect(responseData.ErrorData).to.be.an('array');\r",
  1202. "});\r",
  1203. "\r",
  1204. "// 4. 请求数据验证\r",
  1205. "pm.test(\"✅ 删除请求验证\", function() {\r",
  1206. " pm.expect(requestData).to.be.an('array').that.is.not.empty;\r",
  1207. " \r",
  1208. " requestData.forEach((item, index) => {\r",
  1209. " const itemNum = index + 1;\r",
  1210. " \r",
  1211. " // 必填字段验证\r",
  1212. " pm.expect(item, `删除项${itemNum}`).to.have.property('CUS_NO');\r",
  1213. " pm.expect(item.CUS_NO, `厂商${itemNum}代号`).to.be.a('string').and.not.empty;\r",
  1214. " });\r",
  1215. " \r",
  1216. " console.log(`🗑️ 请求删除 ${requestData.length} 个厂商`);\r",
  1217. "});\r",
  1218. "\r",
  1219. "// 5. 业务结果验证\r",
  1220. "pm.test(\"📊 删除结果验证\", function() {\r",
  1221. " const total = requestData.length;\r",
  1222. " \r",
  1223. " // 验证计数逻辑\r",
  1224. " pm.expect(responseData.OkCount + responseData.ErrorCount).to.equal(total);\r",
  1225. " \r",
  1226. " // 根据成功示例验证\r",
  1227. " pm.expect(responseData.ErrorCount, \"失败数量\").to.equal(0);\r",
  1228. " pm.expect(responseData.OkCount, \"成功数量\").to.equal(total);\r",
  1229. " pm.expect(responseData.ErrorData, \"错误数据\").to.eql([]);\r",
  1230. " \r",
  1231. " console.log(`✅ 成功删除 ${responseData.OkCount}/${total} 个厂商`);\r",
  1232. "});"
  1233. ],
  1234. "type": "text/javascript",
  1235. "packages": {},
  1236. "requests": {}
  1237. }
  1238. }
  1239. ],
  1240. "request": {
  1241. "method": "POST",
  1242. "header": [
  1243. {
  1244. "key": "LoginId",
  1245. "value": "{{t-erp-api-login-id}}",
  1246. "type": "text"
  1247. },
  1248. {
  1249. "key": "sn",
  1250. "value": "{{t-erp-api-sn}}",
  1251. "type": "text"
  1252. }
  1253. ],
  1254. "body": {
  1255. "mode": "raw",
  1256. "raw": "[\r\n {\r\n \"CUS_NO\": \"CS0003\" // 必须,客户厂商代号,删除该笔客户厂商资料\r\n }\r\n]",
  1257. "options": {
  1258. "raw": {
  1259. "language": "json"
  1260. }
  1261. }
  1262. },
  1263. "url": {
  1264. "raw": "{{t-erp-api-url}}/Cust/DeleteForCust",
  1265. "host": [
  1266. "{{t-erp-api-url}}"
  1267. ],
  1268. "path": [
  1269. "Cust",
  1270. "DeleteForCust"
  1271. ]
  1272. },
  1273. "description": "删除厂商资料"
  1274. },
  1275. "response": []
  1276. }
  1277. ],
  1278. "description": "客户/厂商资料"
  1279. }
  1280. ],
  1281. "event": [
  1282. {
  1283. "listen": "prerequest",
  1284. "script": {
  1285. "type": "text/javascript",
  1286. "packages": {},
  1287. "requests": {},
  1288. "exec": [
  1289. ""
  1290. ]
  1291. }
  1292. },
  1293. {
  1294. "listen": "test",
  1295. "script": {
  1296. "type": "text/javascript",
  1297. "packages": {},
  1298. "requests": {},
  1299. "exec": [
  1300. ""
  1301. ]
  1302. }
  1303. }
  1304. ]
  1305. }