const axios = require('axios'); const colors = require('colors'); // 测试配置 const CONFIG = { baseURL: 'http://localhost/dev-api', orderNo: 'RO20250126008', username: 'zwc007', password: 'admin123', // 需要根据实际密码调整 timeout: 10000, }; /** * 获取Token的通用函数 */ async function getToken(username, password) { const { getToken } = require('./quick-token-getter'); return await getToken(username, password); } /** * 测试API调用的通用函数 */ async function testAPI(endpoint, data, options = {}) { try { const response = await axios({ method: options.method || 'GET', url: `${CONFIG.baseURL}${endpoint}`, data: data, headers: { 'Content-Type': 'application/json;charset=utf-8', clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', referer: 'http://localhost/login?redirect=%252Findex', Authorization: options.token ? `Bearer ${options.token}` : undefined, ...options.headers, }, timeout: CONFIG.timeout, }); return { success: true, data: response.data, status: response.status, }; } catch (error) { return { success: false, error: error.response?.data || error.message, status: error.response?.status, }; } } /** * 测试工单RO20250126008的更新进度按钮 */ async function testRO20250126008UpdateProgressButton() { console.log('\n' + '='.repeat(80)); console.log(colors.cyan.bold(' 工单RO20250126008更新进度按钮测试')); console.log('='.repeat(80)); console.log(colors.yellow(`测试时间: ${new Date().toLocaleString()}`)); console.log(colors.yellow(`目标工单: ${CONFIG.orderNo}`)); console.log(colors.yellow(`测试用户: ${CONFIG.username}`)); console.log('='.repeat(80)); const results = { login: null, userInfo: null, targetOrder: null, permissionCheck: null, buttonDisplayConditions: null, apiTest: null, }; try { // 步骤1:用户登录 console.log(colors.blue('\n【步骤1】用户登录验证')); console.log('----------------------------------------'); try { const token = await getToken(CONFIG.username, CONFIG.password); results.login = { success: true, token: token.substring(0, 50) + '...' }; console.log(colors.green('✓ 登录成功')); console.log(`Token: ${token.substring(0, 50)}...`); } catch (error) { results.login = { success: false, error: error.message }; console.log(colors.red('✗ 登录失败: ' + error.message)); return results; } // 步骤2:获取用户信息和权限 console.log(colors.blue('\n【步骤2】用户权限检查')); console.log('----------------------------------------'); const userInfoResult = await testAPI('/system/user/getInfo', null, { method: 'GET', token: await getToken(CONFIG.username, CONFIG.password), }); if (userInfoResult.success) { const userInfo = userInfoResult.data.data || userInfoResult.data; results.userInfo = { userId: userInfo.user?.userId, userName: userInfo.user?.userName, nickName: userInfo.user?.nickName, roles: userInfo.roles?.map((r) => r.roleKey) || [], permissions: userInfo.permissions || [], }; console.log(colors.green('✓ 用户信息获取成功')); console.log(`用户ID: ${results.userInfo.userId}`); console.log(`用户名: ${results.userInfo.userName}`); console.log(`昵称: ${results.userInfo.nickName}`); // 检查关键权限 const hasMaintenanceRole = results.userInfo.roles.includes('maintenance_worker'); const hasUpdateProgressPerm = results.userInfo.permissions.includes( 'pm:repairOrder:updateProgress', ); console.log( `维修人员角色: ${ hasMaintenanceRole ? colors.green('✓ 已配置') : colors.red('✗ 缺少') }`, ); console.log( `更新进度权限: ${ hasUpdateProgressPerm ? colors.green('✓ 已配置') : colors.red('✗ 缺少') }`, ); results.permissionCheck = { hasMaintenanceRole, hasUpdateProgressPerm, }; } else { console.log(colors.red('✗ 用户信息获取失败: ' + JSON.stringify(userInfoResult.error))); } // 步骤3:查找目标工单 console.log(colors.blue('\n【步骤3】查找目标工单RO20250126008')); console.log('----------------------------------------'); const orderListResult = await testAPI('/pm/repairOrder/list', null, { method: 'GET', token: await getToken(CONFIG.username, CONFIG.password), }); if (orderListResult.success) { const orderData = orderListResult.data; const orders = orderData.rows || orderData.data || []; console.log(colors.green('✓ 工单列表获取成功')); console.log(`可见工单总数: ${orderData.total || orders.length}`); // 查找目标工单 const targetOrder = orders.find((order) => order.orderNo === CONFIG.orderNo); if (targetOrder) { results.targetOrder = { id: targetOrder.id, orderNo: targetOrder.orderNo, title: targetOrder.title, orderStatus: targetOrder.orderStatus, assigneeId: targetOrder.assigneeId, assigneeName: targetOrder.assigneeName, repairLocation: targetOrder.repairLocation, createTime: targetOrder.createTime, }; console.log(colors.green(`✓ 找到目标工单: ${CONFIG.orderNo}`)); console.log(`工单标题: ${targetOrder.title}`); console.log(`工单状态: ${getStatusText(targetOrder.orderStatus)}`); console.log( `维修负责人: ${targetOrder.assigneeName || '未分派'} (ID: ${ targetOrder.assigneeId || 'null' })`, ); console.log(`报修地点: ${targetOrder.repairLocation}`); // 检查按钮显示条件 const isStatus2 = targetOrder.orderStatus === '2' || targetOrder.orderStatus === 2; const isAssignedToZwc007 = targetOrder.assigneeId === results.userInfo?.userId; console.log('\n按钮显示条件检查:'); console.log( `工单状态为已分派(2): ${ isStatus2 ? colors.green('✓ 满足') : colors.red('✗ 不满足') } (当前: ${targetOrder.orderStatus})`, ); console.log( `zwc007是负责人: ${ isAssignedToZwc007 ? colors.green('✓ 满足') : colors.red('✗ 不满足') } (负责人ID: ${targetOrder.assigneeId})`, ); console.log( `维修人员角色: ${ results.permissionCheck?.hasMaintenanceRole ? colors.green('✓ 满足') : colors.red('✗ 不满足') }`, ); console.log( `更新进度权限: ${ results.permissionCheck?.hasUpdateProgressPerm ? colors.green('✓ 满足') : colors.red('✗ 不满足') }`, ); const allConditionsMet = isStatus2 && isAssignedToZwc007 && results.permissionCheck?.hasMaintenanceRole && results.permissionCheck?.hasUpdateProgressPerm; console.log( `\n更新进度按钮应该显示: ${ allConditionsMet ? colors.green('是 🎉') : colors.red('否 ❌') }`, ); results.buttonDisplayConditions = { isStatus2, isAssignedToZwc007, allConditionsMet, }; } else { console.log(colors.red(`✗ 未找到工单${CONFIG.orderNo}`)); console.log(colors.yellow('可能原因:')); console.log(colors.yellow('1. 工单不存在')); console.log(colors.yellow('2. zwc007没有查看该工单的权限')); console.log(colors.yellow('3. 数据权限过滤导致工单不可见')); results.targetOrder = { found: false }; } } else { console.log(colors.red('✗ 工单列表获取失败: ' + JSON.stringify(orderListResult.error))); } // 步骤4:测试更新进度API(如果工单存在且条件满足) console.log(colors.blue('\n【步骤4】更新进度API测试')); console.log('----------------------------------------'); if (results.targetOrder?.found !== false && results.targetOrder?.id) { console.log(`测试工单: ${results.targetOrder.orderNo} (ID: ${results.targetOrder.id})`); // 构造测试用的进度数据 const progressData = { orderId: results.targetOrder.id, progressType: '5', // 维修进度 progressStatus: '测试进度状态', progressDetail: `工单${ CONFIG.orderNo }进度更新测试 - ${new Date().toLocaleString()}`, progressTime: new Date().toISOString().slice(0, 19).replace('T', ' '), locationInfo: results.targetOrder.repairLocation || '测试位置', estimatedDuration: 60, nextStep: '继续测试验证', remark: 'API权限验证测试', }; const apiResult = await testAPI('/pm/repairOrder/updateProgress', progressData, { method: 'POST', token: await getToken(CONFIG.username, CONFIG.password), }); if (apiResult.success) { console.log(colors.green('✓ 更新进度API调用成功')); console.log('响应数据:', JSON.stringify(apiResult.data, null, 2)); results.apiTest = { success: true, response: apiResult.data, }; } else { console.log(colors.red('✗ 更新进度API调用失败')); console.log('错误信息:', JSON.stringify(apiResult.error, null, 2)); results.apiTest = { success: false, error: apiResult.error, }; } } else { console.log(colors.yellow('⚠ 跳过API测试:工单不存在或条件不满足')); results.apiTest = { skipped: true, reason: '工单不存在或条件不满足' }; } // 步骤5:生成测试总结 console.log(colors.blue('\n【步骤5】测试结果总结')); console.log('----------------------------------------'); console.log(colors.cyan('测试结果汇总:')); console.log( `1. 用户登录: ${ results.login?.success ? colors.green('✓ 成功') : colors.red('✗ 失败') }`, ); console.log( `2. 权限配置: ${ results.permissionCheck?.hasMaintenanceRole && results.permissionCheck?.hasUpdateProgressPerm ? colors.green('✓ 完整') : colors.red('✗ 缺失') }`, ); console.log( `3. 目标工单: ${ results.targetOrder?.found !== false ? colors.green('✓ 找到') : colors.red('✗ 未找到') }`, ); console.log( `4. 按钮显示: ${ results.buttonDisplayConditions?.allConditionsMet ? colors.green('✓ 应显示') : colors.red('✗ 不显示') }`, ); console.log( `5. API权限: ${ results.apiTest?.success ? colors.green('✓ 正常') : results.apiTest?.skipped ? colors.yellow('⚠ 跳过') : colors.red('✗ 失败') }`, ); // 提供修复建议 if (!results.buttonDisplayConditions?.allConditionsMet) { console.log(colors.yellow('\n修复建议:')); if (!results.permissionCheck?.hasMaintenanceRole) { console.log(colors.yellow('- 需要为zwc007分配maintenance_worker角色')); } if (!results.permissionCheck?.hasUpdateProgressPerm) { console.log( colors.yellow('- 需要为维修人员角色分配pm:repairOrder:updateProgress权限'), ); } if (!results.buttonDisplayConditions?.isStatus2) { console.log(colors.yellow(`- 需要将工单${CONFIG.orderNo}状态设置为已分派(2)`)); } if (!results.buttonDisplayConditions?.isAssignedToZwc007) { console.log(colors.yellow(`- 需要将工单${CONFIG.orderNo}分派给zwc007`)); } console.log( colors.yellow('- 执行 test/RO20250126008-update-progress-fix.sql 脚本进行修复'), ); } } catch (error) { console.log(colors.red('测试过程中发生错误: ' + error.message)); results.error = error.message; } console.log('\n' + '='.repeat(80)); console.log(colors.cyan.bold(' 测试完成')); console.log('='.repeat(80)); return results; } /** * 获取状态文本 */ function getStatusText(status) { const statusMap = { 1: '待分派', 2: '已分派', 3: '进行中', 4: '已完成', 5: '已评价', 6: '已归档', 9: '已取消', }; return statusMap[status] || `状态${status}`; } // 执行测试 if (require.main === module) { testRO20250126008UpdateProgressButton() .then((results) => { console.log('\n测试结果已保存'); // 输出最终结论 const success = results.buttonDisplayConditions?.allConditionsMet && results.apiTest?.success; if (success) { console.log( colors.green.bold( '\n🎉 测试通过!工单RO20250126008的更新进度按钮应该可以正常显示和使用。', ), ); } else { console.log(colors.red.bold('\n❌ 测试未通过!需要执行修复脚本解决问题。')); } }) .catch((error) => { console.error(colors.red('测试执行失败:'), error); }); } module.exports = { testRO20250126008UpdateProgressButton, };