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.
 
 
 
 
 
 

263 lines
9.0 KiB

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, '<p>', ''),'</p>', ''),'<span>', '') 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);
}
}
}