const { chromium } = require('playwright'); const fs = require('fs'); async function testDeviceApi() { const browser = await chromium.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const context = await browser.newContext({ viewport: { width: 1920, height: 2000 } }); const page = await context.newPage(); try { const baseUrl = 'http://localhost:18080'; // Step 1: 登录获取token console.log('[Step 1] 登录获取token...'); const loginRes = await page.evaluate(async (baseUrl) => { const res = await fetch(`${baseUrl}/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'admin', password: 'admin123' }) }); return res.json(); }, baseUrl); console.log('[Step 1] 登录结果:', loginRes.code === 200 ? '成功' : '失败'); if (loginRes.code !== 200) { console.error('[Error] 登录失败:', loginRes.msg); return; } // Step 2: 调用getDeviceList API console.log('[Step 2] 调用耗材列表API...'); const apiRes = await page.evaluate(async (baseUrl) => { const res = await fetch(`${baseUrl}/data-dictionary/device/information-page?pageNo=1&pageSize=100&searchKey=&statusEnum=2`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem('token') } }); return res.json(); }, baseUrl); console.log('[Step 2] API响应状态:', apiRes.code); if (apiRes.code === 200 && apiRes.data && apiRes.data.records) { console.log(`\n[Step 3] 获取到 ${apiRes.data.records.length} 条耗材记录`); // 保存完整数据到文件 fs.writeFileSync('device_api_response.json', JSON.stringify(apiRes.data, null, 2)); console.log('[Step 3] 完整数据已保存到 device_api_response.json'); // 分析前5条记录 console.log('\n[Step 4] 分析前5条记录的价格字段:'); apiRes.data.records.slice(0, 5).forEach((item, index) => { console.log(`\n记录 ${index + 1}:`); console.log(' - name:', item.name); console.log(' - busNo:', item.busNo); console.log(' - price:', item.price); console.log(' - retailPrice:', item.retailPrice); console.log(' - purchasePrice:', item.purchasePrice); console.log(' - maximumRetailPrice:', item.maximumRetailPrice); // 检查所有包含price的字段 const priceFields = Object.keys(item).filter(k => k.toLowerCase().includes('price') || k.toLowerCase().includes('amount') ); console.log(' - 所有价格相关字段:', priceFields); }); // 统计有多少条记录有价格 const withRetailPrice = apiRes.data.records.filter(item => item.retailPrice !== undefined && item.retailPrice !== null && item.retailPrice !== '' ).length; const withPrice = apiRes.data.records.filter(item => item.price !== undefined && item.price !== null && item.price !== '' ).length; console.log(`\n[Step 5] 数据统计:`); console.log(` - 总记录数: ${apiRes.data.records.length}`); console.log(` - 有retailPrice的记录: ${withRetailPrice}`); console.log(` - 有price的记录: ${withPrice}`); console.log(` - 无任何价格的记录: ${apiRes.data.records.length - Math.max(withRetailPrice, withPrice)}`); } else { console.error('[Error] API调用失败:', apiRes.msg || '未知错误'); } } catch (error) { console.error('[Error]', error.message); } finally { await browser.close(); } } testDeviceApi();