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
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);
|
|
}
|
|
}
|
|
}
|