repair-order-list-debug.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. const axios = require('axios');
  2. const colors = require('colors');
  3. // 测试配置
  4. const BASE_URL = 'http://localhost/dev-api';
  5. // 获取Token的方法(从之前的登录脚本导入)
  6. async function getToken() {
  7. try {
  8. const { getToken } = require('./quick-token-getter');
  9. return await getToken();
  10. } catch (error) {
  11. console.log('使用模拟Token进行测试'.yellow);
  12. return 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...'; // 模拟Token
  13. }
  14. }
  15. // 通用API测试方法
  16. async function testAPI(endpoint, method = 'GET', data = null, token = null) {
  17. try {
  18. const config = {
  19. method: method.toLowerCase(),
  20. url: `${BASE_URL}${endpoint}`,
  21. headers: {
  22. 'Content-Type': 'application/json;charset=utf-8',
  23. clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e',
  24. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  25. referer: 'http://localhost/login?redirect=%252Findex',
  26. },
  27. timeout: 10000,
  28. };
  29. if (token) {
  30. config.headers['Authorization'] = `Bearer ${token}`;
  31. }
  32. if (data && (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT')) {
  33. config.data = data;
  34. } else if (data && method.toUpperCase() === 'GET') {
  35. config.params = data;
  36. }
  37. const response = await axios(config);
  38. return {
  39. success: true,
  40. data: response.data,
  41. status: response.status,
  42. };
  43. } catch (error) {
  44. return {
  45. success: false,
  46. error: error.response?.data || error.message,
  47. status: error.response?.status,
  48. };
  49. }
  50. }
  51. // 测试报修工单列表接口
  52. async function testRepairOrderList(token) {
  53. console.log('\n📋 测试报修工单列表接口'.blue.bold);
  54. console.log('='.repeat(60).blue);
  55. // 1. 测试基本列表查询
  56. console.log('\n1. 测试基本列表查询(无参数)'.cyan);
  57. const basicResult = await testAPI('/pm/repairOrder/list', 'GET', null, token);
  58. if (basicResult.success) {
  59. console.log('✅ 接口调用成功'.green);
  60. console.log(`📊 响应状态: ${basicResult.status}`.green);
  61. console.log(`📝 响应消息: ${basicResult.data.msg}`.green);
  62. if (basicResult.data.data) {
  63. if (basicResult.data.data.rows) {
  64. // 分页格式
  65. console.log(`📈 总记录数: ${basicResult.data.data.total || 0}`.yellow);
  66. console.log(`📄 当前页记录数: ${basicResult.data.data.rows.length}`.yellow);
  67. if (basicResult.data.data.rows.length > 0) {
  68. console.log('📋 第一条数据示例:'.yellow);
  69. console.log(
  70. JSON.stringify(basicResult.data.data.rows[0], null, 2).substring(0, 500) +
  71. '...',
  72. );
  73. } else {
  74. console.log('⚠️ 数据库中没有记录'.yellow);
  75. }
  76. } else if (Array.isArray(basicResult.data.data)) {
  77. // 直接数组格式
  78. console.log(`📄 记录数: ${basicResult.data.data.length}`.yellow);
  79. if (basicResult.data.data.length > 0) {
  80. console.log('📋 第一条数据示例:'.yellow);
  81. console.log(
  82. JSON.stringify(basicResult.data.data[0], null, 2).substring(0, 500) + '...',
  83. );
  84. } else {
  85. console.log('⚠️ 数据库中没有记录'.yellow);
  86. }
  87. } else {
  88. console.log('⚠️ 数据格式异常:'.yellow, typeof basicResult.data.data);
  89. console.log(JSON.stringify(basicResult.data.data, null, 2));
  90. }
  91. } else {
  92. console.log('⚠️ 响应中没有data字段'.yellow);
  93. }
  94. } else {
  95. console.log('❌ 接口调用失败'.red);
  96. console.log(`📊 错误状态: ${basicResult.status}`.red);
  97. console.log(`📝 错误信息: ${JSON.stringify(basicResult.error, null, 2)}`.red);
  98. }
  99. // 2. 测试分页查询
  100. console.log('\n2. 测试分页查询'.cyan);
  101. const pageResult = await testAPI(
  102. '/pm/repairOrder/list',
  103. 'GET',
  104. {
  105. pageNum: 1,
  106. pageSize: 10,
  107. },
  108. token,
  109. );
  110. if (pageResult.success) {
  111. console.log('✅ 分页查询成功'.green);
  112. if (pageResult.data.data && pageResult.data.data.rows) {
  113. console.log(`📈 分页总数: ${pageResult.data.data.total}`.yellow);
  114. console.log(`📄 当前页数据量: ${pageResult.data.data.rows.length}`.yellow);
  115. }
  116. } else {
  117. console.log('❌ 分页查询失败'.red);
  118. console.log(`📝 错误: ${JSON.stringify(pageResult.error, null, 2)}`.red);
  119. }
  120. // 3. 测试带条件查询
  121. console.log('\n3. 测试带条件查询'.cyan);
  122. const conditionResult = await testAPI(
  123. '/pm/repairOrder/list',
  124. 'GET',
  125. {
  126. pageNum: 1,
  127. pageSize: 10,
  128. orderStatus: '1', // 查询待分派状态的工单
  129. },
  130. token,
  131. );
  132. if (conditionResult.success) {
  133. console.log('✅ 条件查询成功'.green);
  134. if (conditionResult.data.data && conditionResult.data.data.rows) {
  135. console.log(`📈 条件查询结果数: ${conditionResult.data.data.total}`.yellow);
  136. }
  137. } else {
  138. console.log('❌ 条件查询失败'.red);
  139. }
  140. return basicResult;
  141. }
  142. // 测试数据库连接和基础接口
  143. async function testDatabaseConnection(token) {
  144. console.log('\n🔗 测试数据库连接和基础接口'.blue.bold);
  145. console.log('='.repeat(60).blue);
  146. // 测试维修分类接口(检查数据库连接)
  147. console.log('\n1. 测试维修分类接口'.cyan);
  148. const categoryResult = await testAPI(
  149. '/pm/repairCategory/list',
  150. 'GET',
  151. {
  152. pageNum: 1,
  153. pageSize: 10,
  154. },
  155. token,
  156. );
  157. if (categoryResult.success) {
  158. console.log('✅ 维修分类接口正常'.green);
  159. if (categoryResult.data.data && categoryResult.data.data.rows) {
  160. console.log(`📈 维修分类数量: ${categoryResult.data.data.total}`.yellow);
  161. }
  162. } else {
  163. console.log('❌ 维修分类接口失败'.red);
  164. }
  165. // 测试用户信息接口(检查认证)
  166. console.log('\n2. 测试用户信息接口'.cyan);
  167. const userResult = await testAPI('/system/user/getInfo', 'GET', null, token);
  168. if (userResult.success) {
  169. console.log('✅ 用户认证正常'.green);
  170. if (userResult.data.data && userResult.data.data.user) {
  171. console.log(`👤 当前用户: ${userResult.data.data.user.userName}`.yellow);
  172. console.log(`🔑 用户权限: ${userResult.data.data.permissions.join(', ')}`.yellow);
  173. }
  174. } else {
  175. console.log('❌ 用户认证失败'.red);
  176. }
  177. return {
  178. categoryResult,
  179. userResult,
  180. };
  181. }
  182. // 创建测试数据
  183. async function createTestData(token) {
  184. console.log('\n➕ 创建测试数据'.blue.bold);
  185. console.log('='.repeat(60).blue);
  186. // 首先获取维修分类
  187. const categoryResult = await testAPI('/pm/repairCategory/options', 'GET', null, token);
  188. let categoryId = 1; // 默认分类ID
  189. if (categoryResult.success && categoryResult.data.data && categoryResult.data.data.length > 0) {
  190. categoryId = categoryResult.data.data[0].value;
  191. console.log(`✅ 获取到维修分类ID: ${categoryId}`.green);
  192. } else {
  193. console.log('⚠️ 使用默认分类ID: 1'.yellow);
  194. }
  195. // 创建测试工单数据
  196. const testOrderData = {
  197. title: '测试报修工单 - 办公室空调故障',
  198. description: '办公室空调不制冷,温度显示异常,需要维修检查。',
  199. repairLocation: '行政楼二楼201办公室',
  200. categoryId: categoryId,
  201. priorityLevel: 2,
  202. reporterName: '测试用户',
  203. reporterPhone: '13900139001',
  204. reporterDept: '信息技术部',
  205. remark: '紧急处理,影响办公',
  206. };
  207. console.log('\n1. 创建测试工单'.cyan);
  208. const createResult = await testAPI('/pm/repairOrder', 'POST', testOrderData, token);
  209. if (createResult.success) {
  210. console.log('✅ 测试工单创建成功'.green);
  211. console.log(`📝 响应: ${JSON.stringify(createResult.data, null, 2)}`.green);
  212. return true;
  213. } else {
  214. console.log('❌ 测试工单创建失败'.red);
  215. console.log(`📝 错误: ${JSON.stringify(createResult.error, null, 2)}`.red);
  216. return false;
  217. }
  218. }
  219. // 主调试函数
  220. async function debugRepairOrderList() {
  221. console.log('🔍 报修管理列表数据调试工具'.rainbow.bold);
  222. console.log('='.repeat(80).rainbow);
  223. const startTime = new Date();
  224. try {
  225. // 1. 获取认证Token
  226. console.log('\n🔐 步骤1: 获取认证Token'.magenta.bold);
  227. const token = await getToken();
  228. if (token.includes('模拟') || token.length < 50) {
  229. console.log('⚠️ 使用模拟Token,可能影响测试结果'.yellow);
  230. } else {
  231. console.log('✅ 获取到有效Token'.green);
  232. }
  233. // 2. 测试数据库连接和基础接口
  234. const dbTest = await testDatabaseConnection(token);
  235. // 3. 测试报修工单列表接口
  236. const listTest = await testRepairOrderList(token);
  237. // 4. 如果没有数据,尝试创建测试数据
  238. if (listTest.success && listTest.data.data) {
  239. let dataCount = 0;
  240. if (listTest.data.data.rows) {
  241. dataCount = listTest.data.data.total || 0;
  242. } else if (Array.isArray(listTest.data.data)) {
  243. dataCount = listTest.data.data.length;
  244. }
  245. if (dataCount === 0) {
  246. console.log('\n📝 检测到数据库中没有报修工单数据,尝试创建测试数据...'.yellow.bold);
  247. const created = await createTestData(token);
  248. if (created) {
  249. console.log('\n🔄 重新测试列表接口...'.cyan);
  250. await testRepairOrderList(token);
  251. }
  252. }
  253. }
  254. // 5. 生成调试报告
  255. const endTime = new Date();
  256. const duration = endTime - startTime;
  257. console.log('\n📊 调试结果汇总'.rainbow.bold);
  258. console.log('='.repeat(80).rainbow);
  259. const summary = {
  260. 认证状态: token.length > 50 ? '✅ 正常' : '⚠️ 模拟Token',
  261. 数据库连接: dbTest.categoryResult.success ? '✅ 正常' : '❌ 异常',
  262. 用户权限: dbTest.userResult.success ? '✅ 正常' : '❌ 异常',
  263. 列表接口: listTest.success ? '✅ 正常' : '❌ 异常',
  264. 调试耗时: `${duration}ms`,
  265. };
  266. for (const [key, value] of Object.entries(summary)) {
  267. console.log(`${key}: ${value}`);
  268. }
  269. // 6. 问题诊断和建议
  270. console.log('\n💡 问题诊断和建议'.yellow.bold);
  271. console.log('='.repeat(60).yellow);
  272. if (!listTest.success) {
  273. console.log('🔧 接口调用失败,请检查:');
  274. console.log(' - 后端服务是否正常启动');
  275. console.log(' - 接口路径是否正确');
  276. console.log(' - 权限配置是否正确');
  277. } else if (listTest.data.data) {
  278. let dataCount = 0;
  279. if (listTest.data.data.rows) {
  280. dataCount = listTest.data.data.total || 0;
  281. } else if (Array.isArray(listTest.data.data)) {
  282. dataCount = listTest.data.data.length;
  283. }
  284. if (dataCount === 0) {
  285. console.log('🔧 数据库中没有报修工单数据,建议:');
  286. console.log(' - 检查数据库表是否存在');
  287. console.log(' - 手动添加一些测试数据');
  288. console.log(' - 检查数据权限过滤是否过于严格');
  289. } else {
  290. console.log('✅ 接口和数据都正常,前端可能存在问题:');
  291. console.log(' - 检查前端数据处理逻辑');
  292. console.log(' - 检查浏览器控制台错误');
  293. console.log(' - 验证前端API调用代码');
  294. }
  295. }
  296. } catch (error) {
  297. console.error('\n💥 调试过程出错:'.red.bold, error.message);
  298. }
  299. }
  300. // 如果直接运行此脚本
  301. if (require.main === module) {
  302. debugRepairOrderList()
  303. .then(() => {
  304. console.log('\n👋 调试完成'.cyan);
  305. })
  306. .catch((error) => {
  307. console.error('调试脚本执行失败:', error);
  308. process.exit(1);
  309. });
  310. }
  311. module.exports = {
  312. debugRepairOrderList,
  313. testRepairOrderList,
  314. testDatabaseConnection,
  315. createTestData,
  316. };