306 lines
10 KiB
JavaScript
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,
|
|
};
|