Files
hzdyjs/test/进度更新功能验证脚本.js
T
2025-06-30 20:33:58 +08:00

306 lines
10 KiB
JavaScript

/**
* 进度更新功能验证测试脚本
* 用于验证维修进度更新和状态自动流转功能
*
* 使用方法:
* cd test
* npm install axios colors
* node 进度更新功能验证脚本.js
*/
const axios = require('axios');
const colors = require('colors');
// 配置信息
const CONFIG = {
baseURL: 'http://localhost/dev-api',
timeout: 10000,
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',
},
};
// 测试用的工单ID
const TEST_ORDER_ID = 8;
// 进度更新测试数据
const progressTestData = {
orderId: TEST_ORDER_ID,
progressType: '5',
progressStatus: '现场检查中',
progressDetail: '已到达教学楼A座201室,正在检查电路设备状态,发现部分线路老化需要更换',
locationInfo: '教学楼A座201室',
estimatedDuration: 60,
nextStep: '更换老化线路和插座',
issuesEncountered: '发现部分线路老化,需要更换',
materialsNeeded: '电线2米、插座1个、绝缘胶带',
remark: '设备老化较严重,建议后续定期检查',
};
/**
* 获取登录Token
*/
async function getLoginToken() {
const { getToken } = require('./quick-token-getter');
return await getToken('zwc007', '123456');
}
/**
* 创建带Token的请求配置
*/
function createRequestConfig(token) {
return {
...CONFIG,
headers: {
...CONFIG.headers,
Authorization: `Bearer ${token}`,
},
};
}
/**
* 查询工单详情
*/
async function getOrderDetail(token, orderId) {
const config = createRequestConfig(token);
const response = await axios.get(`${config.baseURL}/pm/repairOrder/${orderId}`, {
headers: config.headers,
timeout: config.timeout,
});
return response.data;
}
/**
* 获取工单进度列表
*/
async function getOrderProgress(token, orderId) {
const config = createRequestConfig(token);
const response = await axios.get(`${config.baseURL}/pm/repairOrder/${orderId}/progress`, {
headers: config.headers,
timeout: config.timeout,
});
return response.data;
}
/**
* 更新工单进度
*/
async function updateOrderProgress(token, progressData) {
const config = createRequestConfig(token);
const response = await axios.post(`${config.baseURL}/pm/repairOrder/progress`, progressData, {
headers: config.headers,
timeout: config.timeout,
});
return response.data;
}
/**
* 验证状态流转
*/
async function verifyStatusTransition(token, orderId, expectedStatus) {
const result = await getOrderDetail(token, orderId);
if (result.code === 200 && result.data) {
const currentStatus = result.data.orderStatus;
return {
success: currentStatus === expectedStatus,
currentStatus: currentStatus,
expectedStatus: expectedStatus,
statusName: getStatusName(currentStatus),
};
}
return { success: false, error: result.msg };
}
/**
* 获取状态名称
*/
function getStatusName(status) {
const statusMap = {
1: '待分派',
2: '已分派',
3: '进行中',
4: '已完成',
5: '已评价',
6: '已归档',
9: '已取消',
};
return statusMap[status] || '未知状态';
}
/**
* 验证进度记录
*/
async function verifyProgressRecord(token, orderId) {
const result = await getOrderProgress(token, orderId);
if (result.code === 200 && result.data) {
return {
success: true,
progressCount: result.data.length,
latestProgress: result.data[result.data.length - 1] || null,
};
}
return { success: false, error: result.msg };
}
/**
* 格式化测试结果
*/
function formatTestResult(testName, result, details = null) {
if (result.success) {
console.log(colors.green(`✅ ${testName}: 通过`));
if (details) {
console.log(colors.gray(` ${details}`));
}
} else {
console.log(colors.red(`❌ ${testName}: 失败`));
if (result.error) {
console.log(colors.red(` 错误: ${result.error}`));
}
if (details) {
console.log(colors.gray(` ${details}`));
}
}
}
/**
* 主测试函数
*/
async function runProgressUpdateTest() {
console.log(colors.cyan('🧪 进度更新功能验证测试'));
console.log(colors.cyan('='.repeat(50)));
try {
// 1. 获取登录Token
console.log(colors.yellow('📋 步骤1: 获取登录Token...'));
const token = await getLoginToken();
console.log(colors.green(`✅ Token获取成功: ${token.substring(0, 20)}...`));
// 2. 查询工单初始状态
console.log(colors.yellow(`\n📋 步骤2: 查询工单${TEST_ORDER_ID}初始状态...`));
const initialOrder = await getOrderDetail(token, TEST_ORDER_ID);
if (initialOrder.code !== 200) {
throw new Error(`工单查询失败: ${initialOrder.msg}`);
}
const initialStatus = initialOrder.data.orderStatus;
const initialStatusName = getStatusName(initialStatus);
console.log(colors.blue(`📊 工单初始状态: ${initialStatus} (${initialStatusName})`));
// 3. 查询初始进度记录数
console.log(colors.yellow('\n📋 步骤3: 查询初始进度记录...'));
const initialProgress = await verifyProgressRecord(token, TEST_ORDER_ID);
const initialProgressCount = initialProgress.success ? initialProgress.progressCount : 0;
console.log(colors.blue(`📊 初始进度记录数: ${initialProgressCount}`));
// 4. 更新工单进度
console.log(colors.yellow('\n📋 步骤4: 更新工单进度...'));
const updateResult = await updateOrderProgress(token, progressTestData);
formatTestResult(
'进度更新接口调用',
{ success: updateResult.code === 200 },
updateResult.code === 200 ? '接口返回成功' : `错误: ${updateResult.msg}`,
);
if (updateResult.code !== 200) {
throw new Error(`进度更新失败: ${updateResult.msg}`);
}
// 等待2秒,确保数据库更新完成
console.log(colors.gray('⏳ 等待2秒,确保数据库更新完成...'));
await new Promise((resolve) => setTimeout(resolve, 2000));
// 5. 验证状态流转
console.log(colors.yellow('\n📋 步骤5: 验证工单状态流转...'));
const statusCheck = await verifyStatusTransition(token, TEST_ORDER_ID, '3');
if (initialStatus === '2') {
// 如果初始状态是"已分派",应该自动流转为"进行中"
formatTestResult(
'状态自动流转 (已分派→进行中)',
statusCheck,
`状态变化: ${getStatusName(initialStatus)} → ${statusCheck.statusName}`,
);
} else {
// 如果初始状态不是"已分派",状态应该保持不变
console.log(
colors.blue(
`📊 工单当前状态: ${statusCheck.currentStatus} (${statusCheck.statusName})`,
),
);
console.log(colors.gray('💡 由于工单初始状态不是"已分派",不会触发状态自动流转'));
}
// 6. 验证进度记录保存
console.log(colors.yellow('\n📋 步骤6: 验证进度记录保存...'));
const finalProgress = await verifyProgressRecord(token, TEST_ORDER_ID);
if (finalProgress.success) {
const newProgressCount = finalProgress.progressCount;
const progressIncreased = newProgressCount > initialProgressCount;
formatTestResult(
'进度记录保存到数据库',
{ success: progressIncreased },
`进度记录数变化: ${initialProgressCount} → ${newProgressCount}`,
);
if (finalProgress.latestProgress) {
const latest = finalProgress.latestProgress;
console.log(colors.blue('📊 最新进度记录:'));
console.log(colors.gray(` - 状态: ${latest.progressStatus}`));
console.log(colors.gray(` - 详情: ${latest.progressDetail}`));
console.log(colors.gray(` - 操作人: ${latest.operatorName}`));
console.log(colors.gray(` - 时间: ${latest.operationTime}`));
}
} else {
formatTestResult('进度记录保存到数据库', finalProgress);
}
// 7. 测试总结
console.log(colors.cyan('\n🎯 测试总结'));
console.log(colors.cyan('-'.repeat(50)));
const allTests = [
{ name: '登录认证', passed: !!token },
{ name: '工单查询', passed: initialOrder.code === 200 },
{ name: '进度更新', passed: updateResult.code === 200 },
{ name: '状态流转', passed: initialStatus !== '2' || statusCheck.success },
{
name: '数据保存',
passed: finalProgress.success && finalProgress.progressCount > initialProgressCount,
},
];
const passedCount = allTests.filter((test) => test.passed).length;
const totalCount = allTests.length;
console.log(colors.green(`✅ 通过测试: ${passedCount}/${totalCount}`));
console.log(colors.gray(`❌ 失败测试: ${totalCount - passedCount}/${totalCount}`));
if (passedCount === totalCount) {
console.log(colors.green('🎉 所有测试均通过!进度更新功能正常工作。'));
} else {
console.log(colors.yellow('⚠️ 部分测试未通过,请检查相关功能。'));
}
} catch (error) {
console.log(colors.red(`❌ 测试执行失败: ${error.message}`));
console.log(colors.gray(`错误堆栈: ${error.stack}`));
}
}
// 执行测试
if (require.main === module) {
runProgressUpdateTest().catch(console.error);
}
module.exports = {
runProgressUpdateTest,
getLoginToken,
updateOrderProgress,
verifyStatusTransition,
verifyProgressRecord,
};