You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
186 KiB

function cov_1kbb7fz0lp(){var path="D:\\wechatapp\\SH\\SH\\Reject.js";var hash="0949a5d7e06e37b0d3d9929399aaaff6f267dbef";var global=new Function("return this")();var gcv="__coverage__";var coverageData={path:"D:\\wechatapp\\SH\\SH\\Reject.js",statementMap:{"0":{start:{line:1,column:16},end:{line:1,column:34}},"1":{start:{line:2,column:19},end:{line:2,column:41}},"2":{start:{line:3,column:13},end:{line:3,column:28}},"3":{start:{line:4,column:14},end:{line:4,column:39}},"4":{start:{line:5,column:13},end:{line:5,column:28}},"5":{start:{line:6,column:12},end:{line:6,column:21}},"6":{start:{line:7,column:13},end:{line:7,column:37}},"7":{start:{line:10,column:0},end:{line:10,column:16}},"8":{start:{line:11,column:0},end:{line:20,column:3}},"9":{start:{line:12,column:4},end:{line:12,column:51}},"10":{start:{line:13,column:4},end:{line:13,column:82}},"11":{start:{line:14,column:4},end:{line:14,column:78}},"12":{start:{line:15,column:4},end:{line:18,column:5}},"13":{start:{line:16,column:8},end:{line:16,column:30}},"14":{start:{line:17,column:8},end:{line:17,column:15}},"15":{start:{line:19,column:4},end:{line:19,column:11}},"16":{start:{line:21,column:0},end:{line:21,column:27}},"17":{start:{line:22,column:0},end:{line:22,column:46}},"18":{start:{line:25,column:17},end:{line:33,column:1}},"19":{start:{line:36,column:26},end:{line:44,column:1}},"20":{start:{line:52,column:4},end:{line:80,column:5}},"21":{start:{line:53,column:8},end:{line:53,column:42}},"22":{start:{line:54,column:8},end:{line:54,column:44}},"23":{start:{line:57,column:8},end:{line:57,column:60}},"24":{start:{line:58,column:8},end:{line:58,column:43}},"25":{start:{line:61,column:27},end:{line:61,column:53}},"26":{start:{line:62,column:8},end:{line:62,column:43}},"27":{start:{line:63,column:8},end:{line:63,column:29}},"28":{start:{line:66,column:36},end:{line:66,column:71}},"29":{start:{line:67,column:8},end:{line:67,column:42}},"30":{start:{line:68,column:8},end:{line:68,column:38}},"31":{start:{line:71,column:8},end:{line:71,column:37}},"32":{start:{line:73,column:8},end:{line:73,column:50}},"33":{start:{line:74,column:8},end:{line:74,column:38}},"34":{start:{line:76,column:8},end:{line:79,column:17}},"35":{start:{line:77,column:12},end:{line:77,column:43}},"36":{start:{line:78,column:12},end:{line:78,column:27}},"37":{start:{line:85,column:4},end:{line:89,column:7}},"38":{start:{line:93,column:0},end:{line:206,column:3}},"39":{start:{line:94,column:4},end:{line:94,column:42}},"40":{start:{line:95,column:4},end:{line:205,column:5}},"41":{start:{line:96,column:27},end:{line:96,column:53}},"42":{start:{line:98,column:84},end:{line:98,column:93}},"43":{start:{line:100,column:29},end:{line:100,column:46}},"44":{start:{line:101,column:23},end:{line:101,column:44}},"45":{start:{line:104,column:20},end:{line:104,column:118}},"46":{start:{line:105,column:25},end:{line:105,column:110}},"47":{start:{line:106,column:26},end:{line:106,column:28}},"48":{start:{line:107,column:21},end:{line:107,column:23}},"49":{start:{line:110,column:8},end:{line:113,column:9}},"50":{start:{line:111,column:12},end:{line:111,column:96}},"51":{start:{line:112,column:12},end:{line:112,column:87}},"52":{start:{line:116,column:8},end:{line:120,column:9}},"53":{start:{line:117,column:12},end:{line:117,column:60}},"54":{start:{line:118,column:12},end:{line:118,column:41}},"55":{start:{line:119,column:12},end:{line:119,column:32}},"56":{start:{line:123,column:26},end:{line:126,column:9}},"57":{start:{line:129,column:31},end:{line:132,column:9}},"58":{start:{line:134,column:8},end:{line:134,column:29}},"59":{start:{line:137,column:33},end:{line:192,column:10}},"60":{start:{line:139,column:28},end:{line:139,column:30}},"61":{start:{line:141,column:12},end:{line:176,column:13}},"62":{start:{line:142,column:16},end:{line:175,column:17}},"63":{start:{line:144,column:20},end:{line:168,column:21}},"64":{start:{line:145,column:43},end:{line:145,column:72}},"65":{start:{line:148,column:24},end:{line:152,column:25}},"66":{start:{line:151,column:28},end:{line:151,column:68}},"67":{start:{line:154,column:24},
cov_1kbb7fz0lp=function(){return actualCoverage;};}return actualCoverage;}cov_1kbb7fz0lp();const express=(cov_1kbb7fz0lp().s[0]++,require('express'));const bodyParser=(cov_1kbb7fz0lp().s[1]++,require('body-parser'));const cors=(cov_1kbb7fz0lp().s[2]++,require('cors'));const mysql=(cov_1kbb7fz0lp().s[3]++,require('mysql2/promise'));const path=(cov_1kbb7fz0lp().s[4]++,require('path'));const app=(cov_1kbb7fz0lp().s[5]++,express());const PORT=(cov_1kbb7fz0lp().s[6]++,(cov_1kbb7fz0lp().b[0][0]++,process.env.PORT)||(cov_1kbb7fz0lp().b[0][1]++,3000));// 配置CORS
cov_1kbb7fz0lp().s[7]++;app.use(cors());cov_1kbb7fz0lp().s[8]++;app.use((req,res,next)=>{cov_1kbb7fz0lp().f[0]++;cov_1kbb7fz0lp().s[9]++;res.header('Access-Control-Allow-Origin','*');cov_1kbb7fz0lp().s[10]++;res.header('Access-Control-Allow-Methods','GET, POST, PUT, DELETE, OPTIONS');cov_1kbb7fz0lp().s[11]++;res.header('Access-Control-Allow-Headers','Content-Type, Authorization');cov_1kbb7fz0lp().s[12]++;if(req.method==='OPTIONS'){cov_1kbb7fz0lp().b[1][0]++;cov_1kbb7fz0lp().s[13]++;res.status(200).end();cov_1kbb7fz0lp().s[14]++;return;}else{cov_1kbb7fz0lp().b[1][1]++;}cov_1kbb7fz0lp().s[15]++;next();});cov_1kbb7fz0lp().s[16]++;app.use(bodyParser.json());cov_1kbb7fz0lp().s[17]++;app.use(express.static(path.join(__dirname)));// 数据库配置
const dbConfig=(cov_1kbb7fz0lp().s[18]++,{host:'1.95.162.61',user:'root',password:'schl@2025',// 请替换为实际的数据库密码
database:'wechat_app',// 连接到wechat_app数据库
waitForConnections:true,connectionLimit:10,queueLimit:0});// userlogin数据库配置
const userLoginDbConfig=(cov_1kbb7fz0lp().s[19]++,{host:'1.95.162.61',user:'root',password:'schl@2025',// 请替换为实际的数据库密码
database:'userlogin',// 连接到userlogin数据库
waitForConnections:true,connectionLimit:10,queueLimit:0});// 创建数据库连接池
let pool;let userLoginPool;// 初始化数据库连接
async function initDatabase(){cov_1kbb7fz0lp().f[1]++;cov_1kbb7fz0lp().s[20]++;try{cov_1kbb7fz0lp().s[21]++;pool=mysql.createPool(dbConfig);cov_1kbb7fz0lp().s[22]++;console.log('wechat_app数据库连接池创建成功');// 初始化userlogin数据库连接池
cov_1kbb7fz0lp().s[23]++;userLoginPool=mysql.createPool(userLoginDbConfig);cov_1kbb7fz0lp().s[24]++;console.log('userlogin数据库连接池创建成功');// 测试wechat_app连接
const connection=(cov_1kbb7fz0lp().s[25]++,await pool.getConnection());cov_1kbb7fz0lp().s[26]++;console.log('wechat_app数据库连接测试成功');cov_1kbb7fz0lp().s[27]++;connection.release();// 测试userlogin连接
const userLoginConnection=(cov_1kbb7fz0lp().s[28]++,await userLoginPool.getConnection());cov_1kbb7fz0lp().s[29]++;console.log('userlogin数据库连接测试成功');cov_1kbb7fz0lp().s[30]++;userLoginConnection.release();// 确保数据库结构
cov_1kbb7fz0lp().s[31]++;await ensureDatabaseSchema();}catch(error){cov_1kbb7fz0lp().s[32]++;console.error('数据库初始化失败:',error.message);cov_1kbb7fz0lp().s[33]++;console.error('错误详情:',error);// 如果初始化失败,尝试重新初始化
cov_1kbb7fz0lp().s[34]++;setTimeout(()=>{cov_1kbb7fz0lp().f[2]++;cov_1kbb7fz0lp().s[35]++;console.log('尝试重新初始化数据库连接...');cov_1kbb7fz0lp().s[36]++;initDatabase();},5000);}}// 通用响应函数
function sendResponse(res,success,data=(cov_1kbb7fz0lp().b[2][0]++,null),message=(cov_1kbb7fz0lp().b[3][0]++,'')){cov_1kbb7fz0lp().f[3]++;cov_1kbb7fz0lp().s[37]++;res.json({success,data,message});}// 获取货源列表API
cov_1kbb7fz0lp().s[38]++;app.get('/api/supplies',async(req,res)=>{cov_1kbb7fz0lp().f[4]++;cov_1kbb7fz0lp().s[39]++;console.log('收到获取货源列表请求:',req.query);cov_1kbb7fz0lp().s[40]++;try{const connection=(cov_1kbb7fz0lp().s[41]++,await pool.getConnection());// 支持search和keyword两种参数名,确保兼容性
const{page=(cov_1kbb7fz0lp().b[4][0]++,1),pageSize=(cov_1kbb7fz0lp().b[5][0]++,10),search=(cov_1kbb7fz0lp().b[6][0]++,''),keyword=(cov_1kbb7fz0lp().b[7][0]++,''),status=(cov_1kbb7fz0lp().b[8][0]++,'')}=(cov_1kbb7fz0lp().s[42]++,req.query);// 如果提供了keyword参数,优先使用keyword
const actualSearch=(cov_1kbb7fz0lp().s[43]++,(cov_1kbb7fz0lp().b[9][0]++,keyword)||(cov_1kbb7fz0lp().b[9][1]++,search));const offset=(cov_1kbb7fz0lp().s[44]++,(page-1)*pageSize);// 构建基础查询,添加LEFT JOIN获取用户信息
let query=(cov_1kbb7fz0lp().s[45]++,'SELECT p.*, u.phoneNumber, u.nickName FROM products p LEFT JOIN users u ON p.sellerId = u.userId');let countQuery=(cov_1kbb7fz0lp().s[46]++,'SELECT COUNT(*) as total FROM products p LEFT JOIN users u ON p.sellerId = u.userId');let whereClause=(cov_1kbb7fz0lp().s[47]++,'');let params=(cov_1kbb7fz0lp().s[48]++,[]);// 添加搜索条件
cov_1kbb7fz0lp().s[49]++;if(actualSearch){cov_1kbb7fz0lp().b[10][0]++;cov_1kbb7fz0lp().s[50]++;whereClause+=` WHERE (p.id LIKE ? OR p.productId LIKE ? OR p.productName LIKE ?)`;cov_1kbb7fz0lp().s[51]++;params.push(`%${actualSearch}%`,`%${actualSearch}%`,`%${actualSearch}%`);}else{cov_1kbb7fz0lp().b[10][1]++;}// 添加状态筛选
cov_1kbb7fz0lp().s[52]++;if(status){cov_1kbb7fz0lp().b[11][0]++;cov_1kbb7fz0lp().s[53]++;whereClause+=actualSearch?(cov_1kbb7fz0lp().b[12][0]++,' AND'):(cov_1kbb7fz0lp().b[12][1]++,' WHERE');cov_1kbb7fz0lp().s[54]++;whereClause+=` status = ?`;cov_1kbb7fz0lp().s[55]++;params.push(status);}else{cov_1kbb7fz0lp().b[11][1]++;}// 执行查询
const[results]=(cov_1kbb7fz0lp().s[56]++,await connection.query(`${query}${whereClause} ORDER BY p.id DESC LIMIT ? OFFSET ?`,[...params,parseInt(pageSize),offset]));// 获取总数
const[countResults]=(cov_1kbb7fz0lp().s[57]++,await connection.query(`${countQuery}${whereClause}`,params));cov_1kbb7fz0lp().s[58]++;connection.release();// 处理返回结果中的imageUrls字段
const processedResults=(cov_1kbb7fz0lp().s[59]++,results.map(product=>{cov_1kbb7fz0lp().f[5]++;// 处理imageUrls字段
let imageUrls=(cov_1kbb7fz0lp().s[60]++,[]);cov_1kbb7fz0lp().s[61]++;if(product.imageUrls){cov_1kbb7fz0lp().b[13][0]++;cov_1kbb7fz0lp().s[62]++;if(typeof product.imageUrls==='string'){cov_1kbb7fz0lp().b[14][0]++;cov_1kbb7fz0lp().s[63]++;// 尝试解析为JSON数组
try{let parsedImages=(cov_1kbb7fz0lp().s[64]++,JSON.parse(product.imageUrls));// 检查是否是JSON字符串的字符串表示(转义的JSON)
cov_1kbb7fz0lp().s[65]++;if((cov_1kbb7fz0lp().b[16][0]++,typeof parsedImages==='string')&&((cov_1kbb7fz0lp().b[16][1]++,parsedImages.startsWith('['))||(cov_1kbb7fz0lp().b[16][2]++,parsedImages.startsWith('{')))){cov_1kbb7fz0lp().b[15][0]++;cov_1kbb7fz0lp().s[66]++;// 进行第二次解析
parsedImages=JSON.parse(parsedImages);}else{cov_1kbb7fz0lp().b[15][1]++;}cov_1kbb7fz0lp().s[67]++;if(Array.isArray(parsedImages)){cov_1kbb7fz0lp().b[17][0]++;cov_1kbb7fz0lp().s[68]++;imageUrls=parsedImages;}else{cov_1kbb7fz0lp().b[17][1]++;cov_1kbb7fz0lp().s[69]++;if(typeof parsedImages==='string'){cov_1kbb7fz0lp().b[18][0]++;cov_1kbb7fz0lp().s[70]++;// 如果解析结果是字符串,可能是单个URL
imageUrls=[parsedImages];}else{cov_1kbb7fz0lp().b[18][1]++;}}}catch(e){cov_1kbb7fz0lp().s[71]++;// 解析失败,尝试按逗号分隔
if(product.imageUrls.includes(',')){cov_1kbb7fz0lp().b[19][0]++;cov_1kbb7fz0lp().s[72]++;imageUrls=product.imageUrls.split(',').map(url=>{cov_1kbb7fz0lp().f[6]++;cov_1kbb7fz0lp().s[73]++;return url.trim();});}else{cov_1kbb7fz0lp().b[19][1]++;cov_1kbb7fz0lp().s[74]++;// 作为单个URL处理
imageUrls=[product.imageUrls.trim()];}}}else{cov_1kbb7fz0lp().b[14][1]++;cov_1kbb7fz0lp().s[75]++;if(Array.isArray(product.imageUrls)){cov_1kbb7fz0lp().b[20][0]++;cov_1kbb7fz0lp().s[76]++;// 已经是数组,直接使用
imageUrls=product.imageUrls;}else{cov_1kbb7fz0lp().b[20][1]++;cov_1kbb7fz0lp().s[77]++;// 其他类型,转换为字符串数组
imageUrls=[String(product.imageUrls)];}}}else{cov_1kbb7fz0lp().b[13][1]++;}// 过滤并处理无效的URL:移除反引号并验证
cov_1kbb7fz0lp().s[78]++;imageUrls=imageUrls.filter(url=>{cov_1kbb7fz0lp().f[7]++;cov_1kbb7fz0lp().s[79]++;if(!url){cov_1kbb7fz0lp().b[21][0]++;cov_1kbb7fz0lp().s[80]++;return false;}else{cov_1kbb7fz0lp().b[21][1]++;}const processedUrl=(cov_1kbb7fz0lp().s[81]++,url.replace(/`/g,'').trim());cov_1kbb7fz0lp().s[82]++;return(cov_1kbb7fz0lp().b[22][0]++,processedUrl.startsWith('http://'))||(cov_1kbb7fz0lp().b[22][1]++,processedUrl.startsWith('https://'));})// 对每个有效URL进行处理,移除反引号
.map(url=>{cov_1kbb7fz0lp().f[8]++;cov_1kbb7fz0lp().s[83]++;return url.replace(/`/g,'').trim();});cov_1kbb7fz0lp().s[84]++;return{...product,imageUrls};}));// 返回结果
cov_1kbb7fz0lp().s[85]++;sendResponse(res,true,{list:processedResults,total:countResults[0].total,page:parseInt(page),pageSize:parseInt(pageSize)},'获取货源列表成功');}catch(error){cov_1kbb7fz0lp().s[86]++;console.error('获取货源列表失败:',error.message);cov_1kbb7fz0lp().s[87]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[88]++;sendResponse(res,false,null,'获取货源列表失败');}});// 审核通过API
cov_1kbb7fz0lp().s[89]++;app.post('/api/supplies/:id/approve',async(req,res)=>{cov_1kbb7fz0lp().f[9]++;cov_1kbb7fz0lp().s[90]++;console.log('收到审核通过请求:',req.params.id,req.body);cov_1kbb7fz0lp().s[91]++;try{const connection=(cov_1kbb7fz0lp().s[92]++,await pool.getConnection());const{remark=(cov_1kbb7fz0lp().b[23][0]++,'')}=(cov_1kbb7fz0lp().s[93]++,req.body);const productId=(cov_1kbb7fz0lp().s[94]++,req.params.id);// 开始事务
cov_1kbb7fz0lp().s[95]++;await connection.beginTransaction();// 检查当前状态
const[currentProduct]=(cov_1kbb7fz0lp().s[96]++,await connection.query('SELECT status FROM products WHERE id = ?',[productId]));cov_1kbb7fz0lp().s[97]++;if(currentProduct.length===0){cov_1kbb7fz0lp().b[24][0]++;cov_1kbb7fz0lp().s[98]++;await connection.rollback();cov_1kbb7fz0lp().s[99]++;connection.release();cov_1kbb7fz0lp().s[100]++;return sendResponse(res,false,null,'货源不存在');}else{cov_1kbb7fz0lp().b[24][1]++;}// 检查状态是否可审核,增加对多种待审核状态的支持
cov_1kbb7fz0lp().s[101]++;if(!['pending','draft','pending_review','underreview','待审核'].includes(currentProduct[0].status)){cov_1kbb7fz0lp().b[25][0]++;cov_1kbb7fz0lp().s[102]++;await connection.rollback();cov_1kbb7fz0lp().s[103]++;connection.release();cov_1kbb7fz0lp().s[104]++;return sendResponse(res,false,null,'该货源已审核,无需重复操作');}else{cov_1kbb7fz0lp().b[25][1]++;}// 更新状态
cov_1kbb7fz0lp().s[105]++;await connection.query('UPDATE products SET status = ?, audit_time = ? WHERE id = ?',['published',new Date(),productId]);// 记录日志
cov_1kbb7fz0lp().s[106]++;await connection.query('INSERT INTO audit_logs (supply_id, action, user_id, remark, created_at) VALUES (?, ?, ?, ?, ?)',[productId,'approve','system',remark,new Date()]);// 提交事务
cov_1kbb7fz0lp().s[107]++;await connection.commit();cov_1kbb7fz0lp().s[108]++;connection.release();cov_1kbb7fz0lp().s[109]++;sendResponse(res,true,null,'审核通过成功');}catch(error){cov_1kbb7fz0lp().s[110]++;console.error('审核通过失败:',error.message);cov_1kbb7fz0lp().s[111]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[112]++;sendResponse(res,false,null,'审核通过失败');}});cov_1kbb7fz0lp().s[113]++;console.log('正在注册拒绝审核API路由: /api/supplies/:id/reject');// 审核拒绝API
cov_1kbb7fz0lp().s[114]++;app.post('/api/supplies/:id/reject',async(req,res)=>{cov_1kbb7fz0lp().f[10]++;cov_1kbb7fz0lp().s[115]++;console.log('收到审核拒绝请求:',req.params.id,req.body);cov_1kbb7fz0lp().s[116]++;try{const connection=(cov_1kbb7fz0lp().s[117]++,await pool.getConnection());// 同时支持reason和rejectReason参数,保持向后兼容
const{reason,rejectReason=(cov_1kbb7fz0lp().b[26][0]++,''),remark=(cov_1kbb7fz0lp().b[27][0]++,'')}=(cov_1kbb7fz0lp().s[118]++,req.body);// 如果有reason参数,则使用reason,否则使用rejectReason
const actualRejectReason=(cov_1kbb7fz0lp().s[119]++,(cov_1kbb7fz0lp().b[28][0]++,reason)||(cov_1kbb7fz0lp().b[28][1]++,rejectReason));const productId=(cov_1kbb7fz0lp().s[120]++,req.params.id);// 开始事务
cov_1kbb7fz0lp().s[121]++;await connection.beginTransaction();// 检查当前状态
const[currentProduct]=(cov_1kbb7fz0lp().s[122]++,await connection.query('SELECT status FROM products WHERE id = ?',[productId]));cov_1kbb7fz0lp().s[123]++;if(currentProduct.length===0){cov_1kbb7fz0lp().b[29][0]++;cov_1kbb7fz0lp().s[124]++;await connection.rollback();cov_1kbb7fz0lp().s[125]++;connection.release();cov_1kbb7fz0lp().s[126]++;return sendResponse(res,false,null,'货源不存在');}else{cov_1kbb7fz0lp().b[29][1]++;}cov_1kbb7fz0lp().s[127]++;if((cov_1kbb7fz0lp().b[31][0]++,currentProduct[0].status!=='underreview')&&(cov_1kbb7fz0lp().b[31][1]++,currentProduct[0].status!=='pending_review')){cov_1kbb7fz0lp().b[30][0]++;cov_1kbb7fz0lp().s[128]++;await connection.rollback();cov_1kbb7fz0lp().s[129]++;connection.release();cov_1kbb7fz0lp().s[130]++;return sendResponse(res,false,null,'当前状态不允许审核拒绝');}else{cov_1kbb7fz0lp().b[30][1]++;}// 更新状态和拒绝理由
cov_1kbb7fz0lp().s[131]++;await connection.query('UPDATE products SET status = ?, rejectReason = ?, audit_time = ? WHERE id = ?',['reviewfailed',actualRejectReason,new Date(),productId]);// 记录日志
cov_1kbb7fz0lp().s[132]++;await connection.query('INSERT INTO audit_logs (supply_id, action, user_id, remark, created_at) VALUES (?, ?, ?, ?, ?)',[productId,'reject','system',remark,new Date()]);// 提交事务
cov_1kbb7fz0lp().s[133]++;await connection.commit();cov_1kbb7fz0lp().s[134]++;connection.release();cov_1kbb7fz0lp().s[135]++;sendResponse(res,true,null,'审核拒绝成功');}catch(error){cov_1kbb7fz0lp().s[136]++;console.error('审核拒绝失败:',error.message);cov_1kbb7fz0lp().s[137]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[138]++;sendResponse(res,false,null,'审核拒绝失败');}});// 获取供应商列表API已删除
// 供应商审核通过API已删除
// 供应商审核拒绝API已删除
// 供应商开始合作API已删除
// 供应商终止合作API已删除
cov_1kbb7fz0lp().s[139]++;console.log('正在注册测试API路由: /api/test-db');// 测试数据库连接API
cov_1kbb7fz0lp().s[140]++;app.get('/api/test-db',async(req,res)=>{cov_1kbb7fz0lp().f[11]++;cov_1kbb7fz0lp().s[141]++;console.log('收到数据库连接测试请求');cov_1kbb7fz0lp().s[142]++;try{const connection=(cov_1kbb7fz0lp().s[143]++,await pool.getConnection());const[results]=(cov_1kbb7fz0lp().s[144]++,await connection.query('SELECT 1 + 1 as solution'));cov_1kbb7fz0lp().s[145]++;connection.release();cov_1kbb7fz0lp().s[146]++;sendResponse(res,true,results[0],'数据库连接成功');}catch(error){cov_1kbb7fz0lp().s[147]++;console.error('数据库连接测试失败:',error.message);cov_1kbb7fz0lp().s[148]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[149]++;sendResponse(res,false,null,'数据库连接测试失败');}});// 获取联系人数据API
cov_1kbb7fz0lp().s[150]++;app.get('/api/contacts',async(req,res)=>{cov_1kbb7fz0lp().f[12]++;cov_1kbb7fz0lp().s[151]++;try{// 从userlogin数据库获取销售员信息
const userLoginConnection=(cov_1kbb7fz0lp().s[152]++,await userLoginPool.getConnection());const[salesPersons]=(cov_1kbb7fz0lp().s[153]++,await userLoginConnection.query('SELECT DISTINCT projectName, userName FROM login WHERE projectName = "销售员"'));cov_1kbb7fz0lp().s[154]++;userLoginConnection.release();cov_1kbb7fz0lp().s[155]++;if(salesPersons.length===0){cov_1kbb7fz0lp().b[32][0]++;cov_1kbb7fz0lp().s[156]++;sendResponse(res,true,[],'没有找到销售员信息');cov_1kbb7fz0lp().s[157]++;return;}else{cov_1kbb7fz0lp().b[32][1]++;}// 从wechat_app数据库获取用户电话号码
const connection=(cov_1kbb7fz0lp().s[158]++,await pool.getConnection());// 创建用户名数组用于批量查询
const userNames=(cov_1kbb7fz0lp().s[159]++,salesPersons.map(person=>{cov_1kbb7fz0lp().f[13]++;cov_1kbb7fz0lp().s[160]++;return person.userName;}));// 使用IN语句批量查询用户信息,提高效率
const[userResults]=(cov_1kbb7fz0lp().s[161]++,await connection.query('SELECT nickName, company, phoneNumber FROM users WHERE nickName IN (?) OR company IN (?)',[userNames,userNames]));cov_1kbb7fz0lp().s[162]++;connection.release();// 创建联系人数据数组
const contacts=(cov_1kbb7fz0lp().s[163]++,[]);const processedUsers=(cov_1kbb7fz0lp().s[164]++,new Set());// 用于避免重复记录
// 遍历销售员列表
cov_1kbb7fz0lp().s[165]++;for(const salesPerson of salesPersons){const{userName}=(cov_1kbb7fz0lp().s[166]++,salesPerson);// 查找匹配的用户
const matchedUsers=(cov_1kbb7fz0lp().s[167]++,userResults.filter(user=>{cov_1kbb7fz0lp().f[14]++;cov_1kbb7fz0lp().s[168]++;return(cov_1kbb7fz0lp().b[33][0]++,user.nickName===userName)||(cov_1kbb7fz0lp().b[33][1]++,user.company===userName);}));cov_1kbb7fz0lp().s[169]++;if(matchedUsers.length>0){cov_1kbb7fz0lp().b[34][0]++;cov_1kbb7fz0lp().s[170]++;for(const user of matchedUsers){cov_1kbb7fz0lp().s[171]++;// 只添加有电话号码的联系人,并且避免重复
if((cov_1kbb7fz0lp().b[36][0]++,user.phoneNumber)&&(cov_1kbb7fz0lp().b[36][1]++,user.phoneNumber.trim()!=='')){cov_1kbb7fz0lp().b[35][0]++;const userKey=(cov_1kbb7fz0lp().s[172]++,`${userName}-${user.phoneNumber}`);cov_1kbb7fz0lp().s[173]++;if(!processedUsers.has(userKey)){cov_1kbb7fz0lp().b[37][0]++;cov_1kbb7fz0lp().s[174]++;processedUsers.add(userKey);cov_1kbb7fz0lp().s[175]++;contacts.push({id:contacts.length+1,salesPerson:salesPerson.projectName,name:userName,phoneNumber:user.phoneNumber});}else{cov_1kbb7fz0lp().b[37][1]++;}}else{cov_1kbb7fz0lp().b[35][1]++;}}}else{cov_1kbb7fz0lp().b[34][1]++;}// 如果没有找到匹配的用户或匹配的用户没有电话号码,跳过此销售员
}cov_1kbb7fz0lp().s[176]++;sendResponse(res,true,contacts,'联系人数据获取成功');}catch(error){cov_1kbb7fz0lp().s[177]++;console.error('获取联系人数据失败:',error.message);cov_1kbb7fz0lp().s[178]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[179]++;sendResponse(res,false,null,'获取联系人数据失败');}});// 更新产品联系人API
cov_1kbb7fz0lp().s[180]++;app.put('/api/supplies/:id/contact',async(req,res)=>{cov_1kbb7fz0lp().f[15]++;cov_1kbb7fz0lp().s[181]++;try{const{id}=(cov_1kbb7fz0lp().s[182]++,req.params);const{productContact,contactPhone}=(cov_1kbb7fz0lp().s[183]++,req.body);// 移除"联系人"前缀和"销售员 - "前缀
const processedProductContact=(cov_1kbb7fz0lp().s[184]++,productContact.replace(/^(联系人|销售员\s*-\s*)/g,'').trim());const connection=(cov_1kbb7fz0lp().s[185]++,await pool.getConnection());// 更新产品的联系人信息
const[result]=(cov_1kbb7fz0lp().s[186]++,await connection.query('UPDATE products SET product_contact = ?, contact_phone = ? WHERE id = ?',[processedProductContact,contactPhone,id]));cov_1kbb7fz0lp().s[187]++;connection.release();cov_1kbb7fz0lp().s[188]++;if(result.affectedRows===0){cov_1kbb7fz0lp().b[38][0]++;cov_1kbb7fz0lp().s[189]++;sendResponse(res,false,null,'未找到指定的产品');cov_1kbb7fz0lp().s[190]++;return;}else{cov_1kbb7fz0lp().b[38][1]++;}cov_1kbb7fz0lp().s[191]++;sendResponse(res,true,null,'产品联系人信息更新成功');}catch(error){cov_1kbb7fz0lp().s[192]++;console.error('更新产品联系人信息失败:',error.message);cov_1kbb7fz0lp().s[193]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[194]++;sendResponse(res,false,null,'更新产品联系人信息失败');}});// 供应商审核通过API - /api/suppliers/:id/approve
cov_1kbb7fz0lp().s[195]++;console.log('正在注册供应商审核通过API路由: /api/suppliers/:id/approve');cov_1kbb7fz0lp().s[196]++;app.post('/api/suppliers/:id/approve',async(req,res)=>{cov_1kbb7fz0lp().f[16]++;cov_1kbb7fz0lp().s[197]++;console.log('收到供应商审核通过请求:',req.params);cov_1kbb7fz0lp().s[198]++;try{const connection=(cov_1kbb7fz0lp().s[199]++,await pool.getConnection());const userId=(cov_1kbb7fz0lp().s[200]++,req.params.id);cov_1kbb7fz0lp().s[201]++;if(!userId){cov_1kbb7fz0lp().b[39][0]++;cov_1kbb7fz0lp().s[202]++;connection.release();cov_1kbb7fz0lp().s[203]++;return sendResponse(res,false,null,'用户ID不能为空');}else{cov_1kbb7fz0lp().b[39][1]++;}// 开始事务
cov_1kbb7fz0lp().s[204]++;await connection.beginTransaction();// 检查当前状态
const[currentUser]=(cov_1kbb7fz0lp().s[205]++,await connection.query('SELECT partnerstatus FROM users WHERE userId = ?',[userId]));cov_1kbb7fz0lp().s[206]++;if(currentUser.length===0){cov_1kbb7fz0lp().b[40][0]++;cov_1kbb7fz0lp().s[207]++;await connection.rollback();cov_1kbb7fz0lp().s[208]++;connection.release();cov_1kbb7fz0lp().s[209]++;return sendResponse(res,false,null,'供应商不存在');}else{cov_1kbb7fz0lp().b[40][1]++;}cov_1kbb7fz0lp().s[210]++;if(currentUser[0].partnerstatus!=='underreview'){cov_1kbb7fz0lp().b[41][0]++;cov_1kbb7fz0lp().s[211]++;await connection.rollback();cov_1kbb7fz0lp().s[212]++;connection.release();cov_1kbb7fz0lp().s[213]++;return sendResponse(res,false,null,'当前状态不允许审核通过');}else{cov_1kbb7fz0lp().b[41][1]++;}// 更新状态和审核时间
cov_1kbb7fz0lp().s[214]++;await connection.query('UPDATE users SET partnerstatus = ?, audit_time = ? WHERE userId = ?',['approved',new Date(),userId]);// 提交事务
cov_1kbb7fz0lp().s[215]++;await connection.commit();cov_1kbb7fz0lp().s[216]++;connection.release();cov_1kbb7fz0lp().s[217]++;sendResponse(res,true,null,'供应商审核通过成功');}catch(error){cov_1kbb7fz0lp().s[218]++;console.error('供应商审核通过失败:',error.message);cov_1kbb7fz0lp().s[219]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[220]++;sendResponse(res,false,null,'供应商审核通过失败');}});// 供应商审核拒绝API - /api/suppliers/:id/reject
cov_1kbb7fz0lp().s[221]++;console.log('正在注册供应商审核拒绝API路由: /api/suppliers/:id/reject');cov_1kbb7fz0lp().s[222]++;app.post('/api/suppliers/:id/reject',async(req,res)=>{cov_1kbb7fz0lp().f[17]++;cov_1kbb7fz0lp().s[223]++;console.log('收到供应商审核拒绝请求:',req.params,req.body);cov_1kbb7fz0lp().s[224]++;try{const connection=(cov_1kbb7fz0lp().s[225]++,await pool.getConnection());const userId=(cov_1kbb7fz0lp().s[226]++,req.params.id);const{rejectReason}=(cov_1kbb7fz0lp().s[227]++,req.body);cov_1kbb7fz0lp().s[228]++;if(!userId){cov_1kbb7fz0lp().b[42][0]++;cov_1kbb7fz0lp().s[229]++;connection.release();cov_1kbb7fz0lp().s[230]++;return sendResponse(res,false,null,'用户ID不能为空');}else{cov_1kbb7fz0lp().b[42][1]++;}cov_1kbb7fz0lp().s[231]++;if(!rejectReason){cov_1kbb7fz0lp().b[43][0]++;cov_1kbb7fz0lp().s[232]++;connection.release();cov_1kbb7fz0lp().s[233]++;return sendResponse(res,false,null,'审核失败原因不能为空');}else{cov_1kbb7fz0lp().b[43][1]++;}// 开始事务
cov_1kbb7fz0lp().s[234]++;await connection.beginTransaction();// 检查当前状态
const[currentUser]=(cov_1kbb7fz0lp().s[235]++,await connection.query('SELECT partnerstatus FROM users WHERE userId = ?',[userId]));cov_1kbb7fz0lp().s[236]++;if(currentUser.length===0){cov_1kbb7fz0lp().b[44][0]++;cov_1kbb7fz0lp().s[237]++;await connection.rollback();cov_1kbb7fz0lp().s[238]++;connection.release();cov_1kbb7fz0lp().s[239]++;return sendResponse(res,false,null,'供应商不存在');}else{cov_1kbb7fz0lp().b[44][1]++;}cov_1kbb7fz0lp().s[240]++;if(currentUser[0].partnerstatus!=='underreview'){cov_1kbb7fz0lp().b[45][0]++;cov_1kbb7fz0lp().s[241]++;await connection.rollback();cov_1kbb7fz0lp().s[242]++;connection.release();cov_1kbb7fz0lp().s[243]++;return sendResponse(res,false,null,'当前状态不允许审核拒绝');}else{cov_1kbb7fz0lp().b[45][1]++;}// 更新状态、审核失败原因和审核时间
cov_1kbb7fz0lp().s[244]++;await connection.query('UPDATE users SET partnerstatus = ?, reasonforfailure = ?, audit_time = ? WHERE userId = ?',['reviewfailed',rejectReason,new Date(),userId]);// 提交事务
cov_1kbb7fz0lp().s[245]++;await connection.commit();cov_1kbb7fz0lp().s[246]++;connection.release();cov_1kbb7fz0lp().s[247]++;sendResponse(res,true,null,'供应商审核拒绝成功');}catch(error){cov_1kbb7fz0lp().s[248]++;console.error('供应商审核拒绝失败:',error.message);cov_1kbb7fz0lp().s[249]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[250]++;sendResponse(res,false,null,'供应商审核拒绝失败');}});// 供应商开始合作API - /api/suppliers/:id/cooperate
cov_1kbb7fz0lp().s[251]++;console.log('正在注册供应商开始合作API路由: /api/suppliers/:id/cooperate');cov_1kbb7fz0lp().s[252]++;app.post('/api/suppliers/:id/cooperate',async(req,res)=>{cov_1kbb7fz0lp().f[18]++;cov_1kbb7fz0lp().s[253]++;console.log('收到供应商开始合作请求:',req.params);cov_1kbb7fz0lp().s[254]++;try{const connection=(cov_1kbb7fz0lp().s[255]++,await pool.getConnection());const userId=(cov_1kbb7fz0lp().s[256]++,req.params.id);cov_1kbb7fz0lp().s[257]++;if(!userId){cov_1kbb7fz0lp().b[46][0]++;cov_1kbb7fz0lp().s[258]++;connection.release();cov_1kbb7fz0lp().s[259]++;return sendResponse(res,false,null,'用户ID不能为空');}else{cov_1kbb7fz0lp().b[46][1]++;}// 开始事务
cov_1kbb7fz0lp().s[260]++;await connection.beginTransaction();// 检查当前状态
const[currentUser]=(cov_1kbb7fz0lp().s[261]++,await connection.query('SELECT partnerstatus FROM users WHERE userId = ?',[userId]));cov_1kbb7fz0lp().s[262]++;if(currentUser.length===0){cov_1kbb7fz0lp().b[47][0]++;cov_1kbb7fz0lp().s[263]++;await connection.rollback();cov_1kbb7fz0lp().s[264]++;connection.release();cov_1kbb7fz0lp().s[265]++;return sendResponse(res,false,null,'供应商不存在');}else{cov_1kbb7fz0lp().b[47][1]++;}cov_1kbb7fz0lp().s[266]++;if(currentUser[0].partnerstatus!=='approved'){cov_1kbb7fz0lp().b[48][0]++;cov_1kbb7fz0lp().s[267]++;await connection.rollback();cov_1kbb7fz0lp().s[268]++;connection.release();cov_1kbb7fz0lp().s[269]++;return sendResponse(res,false,null,'只有审核通过的供应商才能开始合作');}else{cov_1kbb7fz0lp().b[48][1]++;}// 更新状态
cov_1kbb7fz0lp().s[270]++;await connection.query('UPDATE users SET partnerstatus = ? WHERE userId = ?',['incooperation',userId]);// 提交事务
cov_1kbb7fz0lp().s[271]++;await connection.commit();cov_1kbb7fz0lp().s[272]++;connection.release();cov_1kbb7fz0lp().s[273]++;sendResponse(res,true,null,'供应商开始合作成功');}catch(error){cov_1kbb7fz0lp().s[274]++;console.error('供应商开始合作失败:',error.message);cov_1kbb7fz0lp().s[275]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[276]++;sendResponse(res,false,null,'供应商开始合作失败');}});// 供应商终止合作API - /api/suppliers/:id/terminate
cov_1kbb7fz0lp().s[277]++;console.log('正在注册供应商终止合作API路由: /api/suppliers/:id/terminate');cov_1kbb7fz0lp().s[278]++;app.post('/api/suppliers/:id/terminate',async(req,res)=>{cov_1kbb7fz0lp().f[19]++;cov_1kbb7fz0lp().s[279]++;console.log('收到供应商终止合作请求:',req.params,req.body);cov_1kbb7fz0lp().s[280]++;try{const connection=(cov_1kbb7fz0lp().s[281]++,await pool.getConnection());const userId=(cov_1kbb7fz0lp().s[282]++,req.params.id);const{reason}=(cov_1kbb7fz0lp().s[283]++,req.body);cov_1kbb7fz0lp().s[284]++;if(!userId){cov_1kbb7fz0lp().b[49][0]++;cov_1kbb7fz0lp().s[285]++;connection.release();cov_1kbb7fz0lp().s[286]++;return sendResponse(res,false,null,'用户ID不能为空');}else{cov_1kbb7fz0lp().b[49][1]++;}// 开始事务
cov_1kbb7fz0lp().s[287]++;await connection.beginTransaction();// 检查当前状态
const[currentUser]=(cov_1kbb7fz0lp().s[288]++,await connection.query('SELECT partnerstatus FROM users WHERE userId = ?',[userId]));cov_1kbb7fz0lp().s[289]++;if(currentUser.length===0){cov_1kbb7fz0lp().b[50][0]++;cov_1kbb7fz0lp().s[290]++;await connection.rollback();cov_1kbb7fz0lp().s[291]++;connection.release();cov_1kbb7fz0lp().s[292]++;return sendResponse(res,false,null,'供应商不存在');}else{cov_1kbb7fz0lp().b[50][1]++;}cov_1kbb7fz0lp().s[293]++;if((cov_1kbb7fz0lp().b[52][0]++,currentUser[0].partnerstatus!=='approved')&&(cov_1kbb7fz0lp().b[52][1]++,currentUser[0].partnerstatus!=='incooperation')){cov_1kbb7fz0lp().b[51][0]++;cov_1kbb7fz0lp().s[294]++;await connection.rollback();cov_1kbb7fz0lp().s[295]++;connection.release();cov_1kbb7fz0lp().s[296]++;return sendResponse(res,false,null,'只有审核通过或合作中的供应商才能终止合作');}else{cov_1kbb7fz0lp().b[51][1]++;}// 更新状态和终止原因
cov_1kbb7fz0lp().s[297]++;await connection.query('UPDATE users SET partnerstatus = ?, terminate_reason = ? WHERE userId = ?',['notcooperative',reason,userId]);// 提交事务
cov_1kbb7fz0lp().s[298]++;await connection.commit();cov_1kbb7fz0lp().s[299]++;connection.release();cov_1kbb7fz0lp().s[300]++;sendResponse(res,true,null,'供应商终止合作成功');}catch(error){cov_1kbb7fz0lp().s[301]++;console.error('供应商终止合作失败:',error.message);cov_1kbb7fz0lp().s[302]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[303]++;sendResponse(res,false,null,'供应商终止合作失败');}});// 供应商列表查询API - /api/suppliers
cov_1kbb7fz0lp().s[304]++;console.log('正在注册供应商列表查询API路由: /api/suppliers');cov_1kbb7fz0lp().s[305]++;app.get('/api/suppliers',async(req,res)=>{cov_1kbb7fz0lp().f[20]++;cov_1kbb7fz0lp().s[306]++;console.log('收到供应商列表查询请求:',req.query);cov_1kbb7fz0lp().s[307]++;try{const connection=(cov_1kbb7fz0lp().s[308]++,await pool.getConnection());const{page=(cov_1kbb7fz0lp().b[53][0]++,1),pageSize=(cov_1kbb7fz0lp().b[54][0]++,10),status=(cov_1kbb7fz0lp().b[55][0]++,''),keyword=(cov_1kbb7fz0lp().b[56][0]++,'')}=(cov_1kbb7fz0lp().s[309]++,req.query);// 构建查询条件
let whereClause=(cov_1kbb7fz0lp().s[310]++,'');let params=(cov_1kbb7fz0lp().s[311]++,[]);// 添加状态筛选
cov_1kbb7fz0lp().s[312]++;if(status){cov_1kbb7fz0lp().b[57][0]++;cov_1kbb7fz0lp().s[313]++;whereClause+=` WHERE partnerstatus = ?`;cov_1kbb7fz0lp().s[314]++;params.push(status);}else{cov_1kbb7fz0lp().b[57][1]++;}// 添加关键词搜索
cov_1kbb7fz0lp().s[315]++;if(keyword){cov_1kbb7fz0lp().b[58][0]++;cov_1kbb7fz0lp().s[316]++;whereClause+=status?(cov_1kbb7fz0lp().b[59][0]++,' AND'):(cov_1kbb7fz0lp().b[59][1]++,' WHERE');cov_1kbb7fz0lp().s[317]++;whereClause+=` (username LIKE ? OR company LIKE ? OR phoneNumber LIKE ?)`;cov_1kbb7fz0lp().s[318]++;params.push(`%${keyword}%`,`%${keyword}%`,`%${keyword}%`);}else{cov_1kbb7fz0lp().b[58][1]++;}// 获取总数
const[totalResult]=(cov_1kbb7fz0lp().s[319]++,await connection.query(`SELECT COUNT(*) as total FROM users${whereClause}`,params));const total=(cov_1kbb7fz0lp().s[320]++,totalResult[0].total);// 计算分页
const offset=(cov_1kbb7fz0lp().s[321]++,(page-1)*pageSize);cov_1kbb7fz0lp().s[322]++;params.push(parseInt(pageSize),offset);// 查询供应商列表
const[suppliers]=(cov_1kbb7fz0lp().s[323]++,await connection.query(`SELECT userId, phoneNumber, province, city, district, detailedaddress, company, collaborationid, cooperation, businesslicenseurl, proofurl, brandurl, partnerstatus, reasonforfailure, reject_reason, terminate_reason, audit_time
FROM users${whereClause}
ORDER BY audit_time DESC LIMIT ? OFFSET ?`,params));cov_1kbb7fz0lp().s[324]++;connection.release();cov_1kbb7fz0lp().s[325]++;sendResponse(res,true,{list:suppliers,total,page:parseInt(page),pageSize:parseInt(pageSize)},'查询成功');}catch(error){cov_1kbb7fz0lp().s[326]++;console.error('供应商列表查询失败:',error.message);cov_1kbb7fz0lp().s[327]++;console.error('错误详情:',error);cov_1kbb7fz0lp().s[328]++;sendResponse(res,false,null,'供应商列表查询失败');}});// 首页路由
cov_1kbb7fz0lp().s[329]++;app.get('/',(req,res)=>{cov_1kbb7fz0lp().f[21]++;cov_1kbb7fz0lp().s[330]++;res.sendFile(path.join(__dirname,'Reject.html'));});// 错误处理中间件
cov_1kbb7fz0lp().s[331]++;app.use((err,req,res,next)=>{cov_1kbb7fz0lp().f[22]++;cov_1kbb7fz0lp().s[332]++;console.error('服务器错误:',err.message);cov_1kbb7fz0lp().s[333]++;console.error('错误详情:',err);cov_1kbb7fz0lp().s[334]++;res.status(500).json({success:false,message:'服务器内部错误'});});// 启动服务器
async function startServer(){cov_1kbb7fz0lp().f[23]++;cov_1kbb7fz0lp().s[335]++;try{cov_1kbb7fz0lp().s[336]++;await initDatabase();cov_1kbb7fz0lp().s[337]++;app.listen(PORT,()=>{cov_1kbb7fz0lp().f[24]++;cov_1kbb7fz0lp().s[338]++;console.log(`服务器已启动,监听端口 ${PORT}`);cov_1kbb7fz0lp().s[339]++;console.log(`访问地址: http://localhost:${PORT}`);});}catch(error){cov_1kbb7fz0lp().s[340]++;console.error('服务器启动失败:',error.message);cov_1kbb7fz0lp().s[341]++;console.error('错误详情:',error);// 如果启动失败,尝试重新启动
cov_1kbb7fz0lp().s[342]++;setTimeout(()=>{cov_1kbb7fz0lp().f[25]++;cov_1kbb7fz0lp().s[343]++;console.log('尝试重新启动服务器...');cov_1kbb7fz0lp().s[344]++;startServer();},5000);}}// 确保数据库结构
async function ensureDatabaseSchema(){cov_1kbb7fz0lp().f[26]++;cov_1kbb7fz0lp().s[345]++;console.log('开始执行数据库结构检查...');cov_1kbb7fz0lp().s[346]++;try{const connection=(cov_1kbb7fz0lp().s[347]++,await pool.getConnection());cov_1kbb7fz0lp().s[348]++;console.log('获取数据库连接成功');// 检查users表是否有必要的字段
cov_1kbb7fz0lp().s[349]++;console.log('检查users表是否有partnerstatus字段...');const[partnerStatusColumns]=(cov_1kbb7fz0lp().s[350]++,await connection.query('SHOW COLUMNS FROM `users` LIKE ?',['partnerstatus']));cov_1kbb7fz0lp().s[351]++;console.log('检查表字段结果:',partnerStatusColumns.length>0?(cov_1kbb7fz0lp().b[60][0]++,'已存在'):(cov_1kbb7fz0lp().b[60][1]++,'不存在'));cov_1kbb7fz0lp().s[352]++;if(partnerStatusColumns.length===0){cov_1kbb7fz0lp().b[61][0]++;cov_1kbb7fz0lp().s[353]++;console.log('添加partnerstatus字段到users表...');cov_1kbb7fz0lp().s[354]++;await connection.query('ALTER TABLE `users` ADD COLUMN partnerstatus VARCHAR(50) DEFAULT "underreview" COMMENT "合作商状态"');cov_1kbb7fz0lp().s[355]++;console.log('partnerstatus字段添加成功');}else{cov_1kbb7fz0lp().b[61][1]++;}cov_1kbb7fz0lp().s[356]++;console.log('检查users表是否有reject_reason字段...');const[rejectReasonColumns]=(cov_1kbb7fz0lp().s[357]++,await connection.query('SHOW COLUMNS FROM `users` LIKE ?',['reject_reason']));cov_1kbb7fz0lp().s[358]++;console.log('检查表字段结果:',rejectReasonColumns.length>0?(cov_1kbb7fz0lp().b[62][0]++,'已存在'):(cov_1kbb7fz0lp().b[62][1]++,'不存在'));cov_1kbb7fz0lp().s[359]++;if(rejectReasonColumns.length===0){cov_1kbb7fz0lp().b[63][0]++;cov_1kbb7fz0lp().s[360]++;console.log('添加reject_reason字段到users表...');cov_1kbb7fz0lp().s[361]++;await connection.query('ALTER TABLE `users` ADD COLUMN reject_reason TEXT COMMENT "拒绝理由"');cov_1kbb7fz0lp().s[362]++;console.log('reject_reason字段添加成功');}else{cov_1kbb7fz0lp().b[63][1]++;}cov_1kbb7fz0lp().s[363]++;console.log('检查users表是否有terminate_reason字段...');const[terminateReasonColumns]=(cov_1kbb7fz0lp().s[364]++,await connection.query('SHOW COLUMNS FROM `users` LIKE ?',['terminate_reason']));cov_1kbb7fz0lp().s[365]++;console.log('检查表字段结果:',terminateReasonColumns.length>0?(cov_1kbb7fz0lp().b[64][0]++,'已存在'):(cov_1kbb7fz0lp().b[64][1]++,'不存在'));cov_1kbb7fz0lp().s[366]++;if(terminateReasonColumns.length===0){cov_1kbb7fz0lp().b[65][0]++;cov_1kbb7fz0lp().s[367]++;console.log('添加terminate_reason字段到users表...');cov_1kbb7fz0lp().s[368]++;await connection.query('ALTER TABLE `users` ADD COLUMN terminate_reason TEXT COMMENT "终止合作理由"');cov_1kbb7fz0lp().s[369]++;console.log('terminate_reason字段添加成功');}else{cov_1kbb7fz0lp().b[65][1]++;}cov_1kbb7fz0lp().s[370]++;console.log('检查users表是否有audit_time字段...');const[userAuditTimeColumns]=(cov_1kbb7fz0lp().s[371]++,await connection.query('SHOW COLUMNS FROM `users` LIKE ?',['audit_time']));cov_1kbb7fz0lp().s[372]++;console.log('检查表字段结果:',userAuditTimeColumns.length>0?(cov_1kbb7fz0lp().b[66][0]++,'已存在'):(cov_1kbb7fz0lp().b[66][1]++,'不存在'));cov_1kbb7fz0lp().s[373]++;if(userAuditTimeColumns.length===0){cov_1kbb7fz0lp().b[67][0]++;cov_1kbb7fz0lp().s[374]++;console.log('添加audit_time字段到users表...');cov_1kbb7fz0lp().s[375]++;await connection.query('ALTER TABLE `users` ADD COLUMN audit_time DATETIME COMMENT "审核时间"');cov_1kbb7fz0lp().s[376]++;console.log('audit_time字段添加成功');}else{cov_1kbb7fz0lp().b[67][1]++;}// 检查表是否有rejectReason字段
cov_1kbb7fz0lp().s[377]++;console.log('检查表products是否有rejectReason字段...');const[columns]=(cov_1kbb7fz0lp().s[378]++,await connection.query('SHOW COLUMNS FROM `products` LIKE ?',['rejectReason']));cov_1kbb7fz0lp().s[379]++;console.log('检查表字段结果:',columns.length>0?(cov_1kbb7fz0lp().b[68][0]++,'已存在'):(cov_1kbb7fz0lp().b[68][1]++,'不存在'));cov_1kbb7fz0lp().s[380]++;if(columns.length===0){cov_1kbb7fz0lp().b[69][0]++;cov_1kbb7fz0lp().s[381]++;console.log('添加rejectReason字段到products表...');cov_1kbb7fz0lp().s[382]++;await connection.query('ALTER TABLE `products` ADD COLUMN rejectReason TEXT COMMENT "拒绝理由"');cov_1kbb7fz0lp().s[383]++;console.log('rejectReason字段添加成功');}else{cov_1kbb7fz0lp().b[69][1]++;}// 检查表是否有audit_time字段
cov_1kbb7fz0lp().s[384]++;console.log('检查表products是否有audit_time字段...');const[auditTimeColumns]=(cov_1kbb7fz0lp().s[385]++,await connection.query('SHOW COLUMNS FROM `products` LIKE ?',['audit_time']));cov_1kbb7fz0lp().s[386]++;console.log('检查表字段结果:',auditTimeColumns.length>0?(cov_1kbb7fz0lp().b[70][0]++,'已存在'):(cov_1kbb7fz0lp().b[70][1]++,'不存在'));cov_1kbb7fz0lp().s[387]++;if(auditTimeColumns.length===0){cov_1kbb7fz0lp().b[71][0]++;cov_1kbb7fz0lp().s[388]++;console.log('添加audit_time字段到products表...');cov_1kbb7fz0lp().s[389]++;await connection.query('ALTER TABLE `products` ADD COLUMN audit_time DATETIME COMMENT "审核时间"');cov_1kbb7fz0lp().s[390]++;console.log('audit_time字段添加成功');}else{cov_1kbb7fz0lp().b[71][1]++;}// 检查audit_logs表是否存在,如果不存在则创建
cov_1kbb7fz0lp().s[391]++;console.log('检查audit_logs表是否存在...');const[tables]=(cov_1kbb7fz0lp().s[392]++,await connection.query("SHOW TABLES LIKE 'audit_logs'"));cov_1kbb7fz0lp().s[393]++;console.log('检查表存在性结果:',tables.length>0?(cov_1kbb7fz0lp().b[72][0]++,'已存在'):(cov_1kbb7fz0lp().b[72][1]++,'不存在'));cov_1kbb7fz0lp().s[394]++;if(tables.length===0){cov_1kbb7fz0lp().b[73][0]++;cov_1kbb7fz0lp().s[395]++;console.log('创建audit_logs表...');cov_1kbb7fz0lp().s[396]++;await connection.query(`
CREATE TABLE audit_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
supply_id VARCHAR(50) NOT NULL,
action VARCHAR(20) NOT NULL COMMENT 'approve或reject',
user_id VARCHAR(50) NOT NULL COMMENT '操作人ID',
remark TEXT COMMENT '备注信息',
created_at DATETIME NOT NULL,
INDEX idx_supply_id (supply_id),
INDEX idx_created_at (created_at)
) COMMENT '审核操作日志表'
`);cov_1kbb7fz0lp().s[397]++;console.log('audit_logs表创建成功');}else{cov_1kbb7fz0lp().b[73][1]++;}cov_1kbb7fz0lp().s[398]++;connection.release();cov_1kbb7fz0lp().s[399]++;console.log('数据库结构检查完成');}catch(error){cov_1kbb7fz0lp().s[400]++;console.error('数据库结构检查失败:',error.message);cov_1kbb7fz0lp().s[401]++;console.error('错误详情:',error);}}// 启动服务器
cov_1kbb7fz0lp().s[402]++;startServer();// 优雅关闭
cov_1kbb7fz0lp().s[403]++;process.on('SIGINT',async()=>{cov_1kbb7fz0lp().f[27]++;cov_1kbb7fz0lp().s[404]++;console.log('正在关闭服务器...');cov_1kbb7fz0lp().s[405]++;if(pool){cov_1kbb7fz0lp().b[74][0]++;cov_1kbb7fz0lp().s[406]++;try{cov_1kbb7fz0lp().s[407]++;await pool.end();cov_1kbb7fz0lp().s[408]++;console.log('数据库连接池已关闭');}catch(error){cov_1kbb7fz0lp().s[409]++;console.error('关闭数据库连接池失败:',error.message);}}else{cov_1kbb7fz0lp().b[74][1]++;}cov_1kbb7fz0lp().s[410]++;console.log('服务器已关闭');cov_1kbb7fz0lp().s[411]++;process.exit(0);});cov_1kbb7fz0lp().s[412]++;module.exports=app;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb3ZfMWtiYjdmejBscCIsImFjdHVhbENvdmVyYWdlIiwiZXhwcmVzcyIsInMiLCJyZXF1aXJlIiwiYm9keVBhcnNlciIsImNvcnMiLCJteXNxbCIsInBhdGgiLCJhcHAiLCJQT1JUIiwiYiIsInByb2Nlc3MiLCJlbnYiLCJ1c2UiLCJyZXEiLCJyZXMiLCJuZXh0IiwiZiIsImhlYWRlciIsIm1ldGhvZCIsInN0YXR1cyIsImVuZCIsImpzb24iLCJzdGF0aWMiLCJqb2luIiwiX19kaXJuYW1lIiwiZGJDb25maWciLCJob3N0IiwidXNlciIsInBhc3N3b3JkIiwiZGF0YWJhc2UiLCJ3YWl0Rm9yQ29ubmVjdGlvbnMiLCJjb25uZWN0aW9uTGltaXQiLCJxdWV1ZUxpbWl0IiwidXNlckxvZ2luRGJDb25maWciLCJwb29sIiwidXNlckxvZ2luUG9vbCIsImluaXREYXRhYmFzZSIsImNyZWF0ZVBvb2wiLCJjb25zb2xlIiwibG9nIiwiY29ubmVjdGlvbiIsImdldENvbm5lY3Rpb24iLCJyZWxlYXNlIiwidXNlckxvZ2luQ29ubmVjdGlvbiIsImVuc3VyZURhdGFiYXNlU2NoZW1hIiwiZXJyb3IiLCJtZXNzYWdlIiwic2V0VGltZW91dCIsInNlbmRSZXNwb25zZSIsInN1Y2Nlc3MiLCJkYXRhIiwiZ2V0IiwicXVlcnkiLCJwYWdlIiwicGFnZVNpemUiLCJzZWFyY2giLCJrZXl3b3JkIiwiYWN0dWFsU2VhcmNoIiwib2Zmc2V0IiwiY291bnRRdWVyeSIsIndoZXJlQ2xhdXNlIiwicGFyYW1zIiwicHVzaCIsInJlc3VsdHMiLCJwYXJzZUludCIsImNvdW50UmVzdWx0cyIsInByb2Nlc3NlZFJlc3VsdHMiLCJtYXAiLCJwcm9kdWN0IiwiaW1hZ2VVcmxzIiwicGFyc2VkSW1hZ2VzIiwiSlNPTiIsInBhcnNlIiwic3RhcnRzV2l0aCIsIkFycmF5IiwiaXNBcnJheSIsImUiLCJpbmNsdWRlcyIsInNwbGl0IiwidXJsIiwidHJpbSIsIlN0cmluZyIsImZpbHRlciIsInByb2Nlc3NlZFVybCIsInJlcGxhY2UiLCJsaXN0IiwidG90YWwiLCJwb3N0IiwiaWQiLCJib2R5IiwicmVtYXJrIiwicHJvZHVjdElkIiwiYmVnaW5UcmFuc2FjdGlvbiIsImN1cnJlbnRQcm9kdWN0IiwibGVuZ3RoIiwicm9sbGJhY2siLCJEYXRlIiwiY29tbWl0IiwicmVhc29uIiwicmVqZWN0UmVhc29uIiwiYWN0dWFsUmVqZWN0UmVhc29uIiwic2FsZXNQZXJzb25zIiwidXNlck5hbWVzIiwicGVyc29uIiwidXNlck5hbWUiLCJ1c2VyUmVzdWx0cyIsImNvbnRhY3RzIiwicHJvY2Vzc2VkVXNlcnMiLCJTZXQiLCJzYWxlc1BlcnNvbiIsIm1hdGNoZWRVc2VycyIsIm5pY2tOYW1lIiwiY29tcGFueSIsInBob25lTnVtYmVyIiwidXNlcktleSIsImhhcyIsImFkZCIsInByb2plY3ROYW1lIiwibmFtZSIsInB1dCIsInByb2R1Y3RDb250YWN0IiwiY29udGFjdFBob25lIiwicHJvY2Vzc2VkUHJvZHVjdENvbnRhY3QiLCJyZXN1bHQiLCJhZmZlY3RlZFJvd3MiLCJ1c2VySWQiLCJjdXJyZW50VXNlciIsInBhcnRuZXJzdGF0dXMiLCJ0b3RhbFJlc3VsdCIsInN1cHBsaWVycyIsInNlbmRGaWxlIiwiZXJyIiwic3RhcnRTZXJ2ZXIiLCJsaXN0ZW4iLCJwYXJ0bmVyU3RhdHVzQ29sdW1ucyIsInJlamVjdFJlYXNvbkNvbHVtbnMiLCJ0ZXJtaW5hdGVSZWFzb25Db2x1bW5zIiwidXNlckF1ZGl0VGltZUNvbHVtbnMiLCJjb2x1bW5zIiwiYXVkaXRUaW1lQ29sdW1ucyIsInRhYmxlcyIsIm9uIiwiZXhpdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyJSZWplY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTtcbmNvbnN0IGJvZHlQYXJzZXIgPSByZXF1aXJlKCdib2R5LXBhcnNlcicpO1xuY29uc3QgY29ycyA9IHJlcXVpcmUoJ2NvcnMnKTtcbmNvbnN0IG15c3FsID0gcmVxdWlyZSgnbXlzcWwyL3Byb21pc2UnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBhcHAgPSBleHByZXNzKCk7XG5jb25zdCBQT1JUID0gcHJvY2Vzcy5lbnYuUE9SVCB8fCAzMDAwO1xuXG4vLyDphY3nva5DT1JTXG5hcHAudXNlKGNvcnMoKSk7XG5hcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBPUFRJT05TJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsICdDb250ZW50LVR5cGUsIEF1dGhvcml6YXRpb24nKTtcbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXh0KCk7XG59KTtcbmFwcC51c2UoYm9keVBhcnNlci5qc29uKCkpO1xuYXBwLnVzZShleHByZXNzLnN0YXRpYyhwYXRoLmpvaW4oX19kaXJuYW1lKSkpO1xuXG4vLyDmlbDmja7lupPphY3nva5cbmNvbnN0IGRiQ29uZmlnID0ge1xuICAgIGhvc3Q6ICcxLjk1LjE2Mi42MScsXG4gICAgdXNlcjogJ3Jvb3QnLFxuICAgIHBhc3N3b3JkOiAnc2NobEAyMDI1JywgLy8g6K+35pu/5o2i5Li65a6e6ZmF55qE5pWw5o2u5bqT5a+G56CBXG4gICAgZGF0YWJhc2U6ICd3ZWNoYXRfYXBwJywgICAgLy8g6L+e5o6l5Yiwd2VjaGF0X2FwcOaVsOaNruW6k1xuICAgIHdhaXRGb3JDb25uZWN0aW9uczogdHJ1ZSxcbiAgICBjb25uZWN0aW9uTGltaXQ6IDEwLFxuICAgIHF1ZXVlTGltaXQ6IDBcbn07XG5cbi8vIHVzZXJsb2dpbuaVsOaNruW6k+mFjee9rlxuY29uc3QgdXNlckxvZ2luRGJDb25maWcgPSB7XG4gICAgaG9zdDogJzEuOTUuMTYyLjYxJyxcbiAgICB1c2VyOiAncm9vdCcsXG4gICAgcGFzc3dvcmQ6ICdzY2hsQDIwMjUnLCAvLyDor7fmm7/mjaLkuLrlrp7pmYXnmoTmlbDmja7lupPlr4bnoIFcbiAgICBkYXRhYmFzZTogJ3VzZXJsb2dpbicsICAgIC8vIOi/nuaOpeWIsHVzZXJsb2dpbuaVsOaNruW6k1xuICAgIHdhaXRGb3JDb25uZWN0aW9uczogdHJ1ZSxcbiAgICBjb25uZWN0aW9uTGltaXQ6IDEwLFxuICAgIHF1ZXVlTGltaXQ6IDBcbn0