import db from "../utils/db"; export default { createTalbe() { return db.executeSql(` CREATE TABLE IF NOT EXISTS messageList ( at TEXT, content TEXT, download TEXT, extUrl TEXT, extends TEXT, fileName TEXT, fileSize INTEGER, file_cate INTEGER, file_id INTEGER, fromUser TEXT, from_user INTEGER, id TEXT, is_group INTEGER, is_read INTEGER, msg_id INTEGER, preview TEXT, sendTime INTEGER, status TEXT, toContactId TEXT, toUser TEXT, imgname TEXT, type TEXT ) `) }, async deleteList(val){ try { if(val.group_id){ await db.executeSql(`DELETE FROM messageList WHERE toContactId = ${val.group_id}`); // const list0 = await db.selectSql(`SELECT COUNT(*) AS count FROM messageList WHERE toContactId = ${val.group_id}`); // console.info('消息数据参数',list0); }else{ await db.executeSql(`delete from messageList WHERE (from_user = ${val.form_user} AND toUser = ${val.to_user}) OR (from_user = ${val.to_user} AND toUser = ${val.form_user})`); // const list1 = await db.selectSql(`SELECT COUNT(*) AS count FROM messageList WHERE (from_user = ${val.form_user} AND toUser = ${val.to_user}) OR (from_user = ${val.to_user} AND toUser = ${val.form_user})`); // console.info('消息数据参数',list1); } return true; }catch (error) { console.error('删除失败:', error); return false; } }, async delAllMsg(){ try { await db.executeSql(`DELETE FROM messageList`); const list2 = await db.selectSql(`SELECT COUNT(*) AS count FROM messageList`); console.info('消息数据参数',list2); return true; }catch (error) { console.error('删除失败:', error); return false; } }, async deleteallList(val){ try { await db.executeSql(`DELETE FROM messageList WHERE is_group = ${val.group_id}`); // const list1 = await db.selectSql(`SELECT COUNT(*) AS count FROM messageList WHERE is_group = ${val.group_id}`); // console.info('消息数据参数',list1); return true; }catch (error) { console.error('删除失败:', error); return false; } }, async deleteallList1(val){ try { if(val.group_id){ await db.executeSql(`DELETE FROM messageList WHERE toContactId = ${val.group_id}`); } else{ await db.executeSql(`delete from messageList WHERE toContactId = ${val.form_user} OR toContactId = ${val.to_user}`); } // const list1 = await db.selectSql(`SELECT COUNT(*) AS count FROM messageList WHERE toContactId = ${val.form_user} OR toContactId = ${val.to_user}`); // console.info('消息数据参数',list1); return true; }catch (error) { console.error('删除失败:', error); return false; } }, async getList({is_group,toContactId,toUserId,limit,page,type,keywords}) { try { // 构建WHERE条件 const conditions = []; if (is_group !== undefined) { conditions.push(`is_group = ${is_group}`); } const type1 = typeof toContactId !== 'string' if (type1 && toContactId !== undefined && (type===''||type==undefined) && (keywords===''||keywords==undefined)) {//筛选是否是单聊 conditions.push(`((toUser = ${toContactId} AND from_user = ${toUserId})OR(toUser = ${toUserId} AND from_user = ${toContactId}))`); }else if(toContactId !== undefined && type === 'all' && (keywords===''||keywords==undefined)){//筛选全部 conditions.push(`toContactId = ${JSON.stringify(toContactId)}`); }else if(keywords !== undefined && keywords !== '' && type){//历史聊天记录中的搜索 const escapedKeywords = keywords.replace(/'/g, "''"); // 转义单引号 conditions.push(`REPLACE(REPLACE(REPLACE(content, '
', ''),'
', ''),'', '') LIKE '%${escapedKeywords}%'`); }else if(toContactId !== undefined && type !== 'all' && type){//筛选文本、图片、视频、文件 conditions.push(`toContactId = ${JSON.stringify(toContactId)} AND type = ${JSON.stringify(type)}`); }else {//筛选是否是群聊 conditions.push(`(toContactId = ${JSON.stringify(toContactId)} OR from_user = ${JSON.stringify(toContactId)} )`); } const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : ''; const offset = (page - 1) * limit; // 并行查询数据和总数 const [dataRes, countRes] = await Promise.all([ db.selectSql( `SELECT * FROM messageList ${whereClause} ORDER BY sendTime DESC LIMIT ${limit} OFFSET ${offset}` ), db.selectSql( `SELECT COUNT(*) AS count FROM messageList ${whereClause}` ) ]); // console.info('聊天数据',dataRes); const userInfo = uni.getStorageSync('userInfo') dataRes.forEach((item)=>{ if(toContactId==JSON.stringify(item.from_user)&&item.type=='event'){ item.content = "对方撤回了一条消息" }else if(is_group==item.is_group&&item.type=='event'&&userInfo.id!=item.from_user){ const name = JSON.parse(item.fromUser) item.content = `${name.realname}撤回了一条消息` }else if(is_group==item.is_group&&item.type=='event'&&userInfo.id==item.from_user){ item.content = "你撤回了一条消息" } }) console.info('聊天数据',{data: dataRes,count: countRes[0]?.count || 0,page: page}); return { data: dataRes, count: countRes[0]?.count || 0, page: page }; } catch (error) { console.error('查询失败:', error); return { data: [], count: 0 }; } }, // 批量插入/更新数据 async batchInsertOrUpdate(groupData) { if (!Array.isArray(groupData)) { throw new Error('数据必须为数组格式'); } const dbInstance = await db.createDatabase(); try { // 开启事务 await db.executeSql('BEGIN IMMEDIATE TRANSACTION'); // 2. 批量查询现有数据(基于 id) const ids = groupData.map(item => item.id).filter(id => id != null); if (ids.length === 0) return true; // console.log('12345',groupData); if(ids.join(',')&&groupData[0].oldContent){ // if(ids.length > 0&&groupData[0].oldContent){ const existingRecords = await db.selectSql(`SELECT * FROM messageList WHERE id = ${JSON.stringify(ids.join(','))}`); // console.log('1234',existingRecords); // await db.executeSql(`UPDATE messageList SET content = ${JSON.stringify(groupData[0].content)},type = ${JSON.stringify(groupData[0].type)} WHERE id = ${JSON.stringify(existingRecords[0].id)}`) }else{ // 构建批量插入语句 const insertPromises = groupData.map(async (item) => { // 字段值预处理 const processedItem = { at: item.at ? JSON.stringify(item.at) : '[]', content: item.content || '', download: item.download || '', extUrl: item.extUrl || '', extends: item.extends ? JSON.stringify(item.extends) : '{}', fileName: item.fileName || '', fileSize: Number(item.fileSize) || 0, file_cate: Number(item.file_cate) || 0, file_id: Number(item.file_id) || 0, fromUser: item.fromUser ? JSON.stringify(item.fromUser) : '{}', from_user: Number(item.from_user) || 0, id: item.id || '', is_group: Number(item.is_group) || 0, is_read: Number(item.is_read) || 0, msg_id: Number(item.msg_id) || 0, preview: item.preview || '', sendTime: Number(item.sendTime) || 0, status: item.status || '', toContactId: item.toContactId || '', toUser:item.toUser || '', imgname:item.imgname || '', type: item.type || '', }; // 提取值数组(注意顺序要与SQL语句中的字段顺序一致) const values = [ processedItem.at, processedItem.content, processedItem.download, processedItem.extUrl, processedItem.extends, processedItem.fileName, processedItem.fileSize, processedItem.file_cate, processedItem.file_id, processedItem.fromUser, processedItem.from_user, processedItem.id, processedItem.is_group, processedItem.is_read, processedItem.msg_id, processedItem.preview, processedItem.sendTime, processedItem.status, processedItem.toContactId, processedItem.toUser, processedItem.imgname, processedItem.type ]; let value_str = "'" + values.join("','") + "'" // console.log('12345',value_str); // 构建INSERT语句 const sql = ` INSERT OR REPLACE INTO messageList ( at, content, download, extUrl, extends, fileName, fileSize, file_cate, file_id, fromUser, from_user, id, is_group,is_read, msg_id, preview, sendTime, status, toContactId,toUser, imgname,type ) VALUES (` + value_str + `) `; return db.executeSql(sql); }); // console.info(insertPromises,'1111'); await Promise.all(insertPromises); await db.executeSql('COMMIT'); console.log('数据同步成功,插入/更新', groupData.length, '条记录'); // const list2 = await db.selectSql(`SELECT * FROM messageList`); // console.info('消息数据参数',list2); } return true; } catch (error) { await db.executeSql('ROLLBACK'); console.error('数据同步失败:', error); throw new Error('数据同步失败: ' + error.message); } } }