import 'package:chat/data/group_data_mgr.dart'; import 'package:chat/models/ChatMsg.dart'; import 'package:chat/models/last_msg_provider.dart'; import 'package:chat/models/unread_count_provider.dart'; import 'package:chat/proto/all.pbserver.dart'; import 'package:chat/utils/MessageMgr.dart'; import 'package:chat/utils/msgHandler.dart'; import 'package:chat/utils/sql_util.dart'; class ChatDataMgr { static ChatDataMgr _instance; static ChatDataMgr _getInstance() { if (_instance == null) { _instance = ChatDataMgr._(); } return _instance; } bool _isInit = false; factory ChatDataMgr() => _getInstance(); ChatDataMgr._(); //私聊最新消息 LastMsgProvider lastMsgProvider; UnreadCountProvider unreadCountProvider; //私人未读消息 UnreadCountProvider groupUnreadProvider; //群聊未读消息 //私聊记录 Map> msgRecordMap; //群聊记录 Map> groupRecordMap; //获取本地聊天数据 initMsg() async { if (!_isInit) { _isInit = true; print('初始化本地聊天记录'); lastMsgProvider = LastMsgProvider(); unreadCountProvider = UnreadCountProvider(); groupUnreadProvider = UnreadCountProvider(); initLocalMsg(); } } initLocalMsg() async { msgRecordMap = await SqlUtil.getAllRecord(isGroup: false); groupRecordMap = await SqlUtil.getAllRecord(isGroup: true); print('查询本地未读消息'); initUnreadCount(); initGroupUnreadCount(); getLastRecord(); } //初始化私聊未读消息 initUnreadCount() async { var unreadCountMap = await SqlUtil.getUnreadCount(false); unreadCountMap.forEach((k, v) { unreadCountProvider.updateUnreadCount(k, v); }); } //初始化群聊未读消息 initGroupUnreadCount() async { var unreadCountMap = await SqlUtil.getUnreadCount(true); unreadCountMap.forEach((k, v) { groupUnreadProvider.updateUnreadCount(k, v); }); } logout() { GroupInfoMgr().clear(); unreadCountProvider.clear(); groupUnreadProvider.clear(); lastMsgProvider.clear(); msgRecordMap.clear(); groupRecordMap.clear(); _isInit = false; } //获取私聊记录 List getRecord({int sessionId}) { var record = msgRecordMap[sessionId==null?MsgHandler.curActiveSession:sessionId]; if (record == null) { record = []; msgRecordMap[MsgHandler.curActiveSession] = record; } return record; } //获取群聊记录 List getGroupRecord({int sessionId}) { var record = groupRecordMap[sessionId==null?MsgHandler.curActiveSession:sessionId]; if (record == null) { record = []; groupRecordMap[MsgHandler.curActiveSession] = record; } return record; } //获取企业号聊天记录 List getCompanyRecord() { var record = msgRecordMap[MsgHandler.curActiveSession]; if (record == null) { record = []; msgRecordMap[MsgHandler.curActiveSession] = record; } return record; } updateLastMsgWithTranslateMsg(PushChat chat) async { if (chat.channelType == ChatChannelType.Group) { var groupInfo = await GroupInfoMgr().getGroupInfo(chat.targetId); if (groupInfo != null) { groupInfo.updateLastMsgWithTransMsg(chat); } } else { lastMsgProvider.updateWithTranslateMsg(chat); } } //标记消息已读 signRead(int sessionId, {bool isGroup = false}) { print('消除未读标记:$sessionId 群$isGroup'); SqlUtil().updateReadState(sessionId, isGroup: isGroup); //获取消息列表 List recordList; if (isGroup) { recordList = getGroupRecord(); } else { recordList = getRecord(); } for (var i = 0; i < recordList.length; i++) { var record = recordList[i]; if (record.readState == 1) { record.readState = 0; } } if (isGroup) { print('群消息'); groupUnreadProvider.signRead(sessionId); MessageMgr().emit('Update Unread Msg Count'); //to do } else { unreadCountProvider.signRead(sessionId); MessageMgr().emit('Update Unread Msg Count'); } } getLastMsg(int sessionId, isGroup) { if (isGroup) { var record = groupRecordMap[sessionId]; if (record != null && record.length > 0) { return record.first; } } else { var record = msgRecordMap[sessionId]; if (record != null && record.length > 0) { return record.first; } } return null; } //获得最新一条聊天记录, 先读取历史消息 getLastRecord() { List recordList = []; if (msgRecordMap == null) { msgRecordMap = {}; } msgRecordMap.values.forEach((record) { recordList.add(record.first); }); for (var i = 0; i < recordList.length; i++) { MsgModel msgModel = recordList[i]; lastMsgProvider.addMsg(msgModel); } lastMsgProvider.sortLastMsg(); } //更新红包消息状态 void updateRedWalletMsg( int sessionId, String walletId, RedWalletState state) { //获取消息列表 List recordList = getRecord(); for (var i = 0; i < recordList.length; i++) { var record = recordList[i]; if (record.msgType == ChatType.RedWalletChatType.value) { //系统红包通知消息 RedWallet wallet = RedWallet.fromBuffer(record.msgContent); if (wallet.orderId == walletId) { wallet.state = state; } record.msgContent = wallet.writeToBuffer(); MessageMgr().emit('Update RedWalletState', wallet); SqlUtil().updateWalletState(record); break; } } } //处理未读消息 updateRecordWithUnreadMsg(List noticeList) async { var unreadCount = noticeList.length; print('更新未读消息$unreadCount'); for (var i = 0; i < unreadCount; i++) { var unread = noticeList[i]; if (unread.channelType == ChatChannelType.Group) { print('群聊未读消息'); var groupInfo = await GroupInfoMgr().getGroupInfo(unread.targetId); if (groupInfo != null) { groupInfo.updateLastMsgWithUnread(unread); } if (unread.targetId != MsgHandler.curActiveSession) { groupUnreadProvider.updateUnreadCount( unread.targetId, unread.unreadMsgNum); } else { MsgHandler.getUnreadMsgDetail(true); } } else { print('私聊未读消息'); lastMsgProvider.addUnreadMsg(unread); if (unread.targetId != MsgHandler.curActiveSession) { unreadCountProvider.updateUnreadCount( unread.targetId, unread.unreadMsgNum); } else { MsgHandler.getUnreadMsgDetail(false); } } } } //保存反馈助手聊天信息 saveCompanyMsg(MsgModel msg) { var record = msgRecordMap[msg.sessionId]; if (record == null) { record = []; msgRecordMap[msg.sessionId] = record; } var result = getMsgBy(msg.sessionId, msg.time, false); if (result == null) { insertToDB(msg, record); } } //保存本地聊天数据 saveMsg(MsgModel msg) { if (msg.channelType == ChatChannelType.Group.value) { var record = groupRecordMap[msg.sessionId]; if (record == null) { record = []; groupRecordMap[msg.sessionId] = record; } var result = getMsgBy(msg.sessionId, msg.time, true); if (result != null) { print('消息存在!!!!'); } else { print('插入消息!!!!'); insertToDB(msg, record); } } else { var record = msgRecordMap[msg.sessionId]; if (record == null) { record = []; msgRecordMap[msg.sessionId] = record; } var result = getMsgBy(msg.sessionId, msg.time, false); if (result != null) { // print('消息存在!!!!'); } else { insertToDB(msg, record); } } } updateMsgState(int sessionId, int time, int channelType, int state) { SqlUtil().updateMsgState(sessionId, time, state, isGroup: channelType == ChatChannelType.Group.value); MessageMgr().emit('Update Chat Message State', {'sessionId': sessionId, 'time': time, 'state': state}); } insertToDB(MsgModel msg, List record) { if (msg.sessionId == null) { print('数据为空,无法插入'); } else { record.insert(0, msg); // print(MsgHandler.time); //int after = DateTime.now().millisecondsSinceEpoch-MsgHandler.time; // print('******插入数据 use $after'); // print('******record length ${record.length} ${msg.sessionId}'); SqlUtil.insert(msg); updateLastRecordWithMsg(msg); } } MsgModel getMsgBy(int sessionId, int timestamp, bool isGroup) { var record; if (isGroup) { record = groupRecordMap[sessionId]; } else { record = msgRecordMap[sessionId]; } if (record != null) { for (var i = 0; i < record.length; i++) { MsgModel msg = record[i]; if (msg.time == timestamp) { return msg; } } } return null; } //删除本地聊天消息 deleteMsg(int sessionId, bool isGroup) { SqlUtil().delteRecord(sessionId, isGroup: isGroup); if (isGroup) { var record = groupRecordMap[sessionId]; if (record != null) { record.clear(); } groupUnreadProvider.signRead(sessionId); } else { var record = msgRecordMap[sessionId]; if (record != null) { record.clear(); } unreadCountProvider.signRead(sessionId); } } //删除所有聊天消息 deleteAllRecord() { //未读数据 groupUnreadProvider.clear(); unreadCountProvider.clear(); //聊天记录 msgRecordMap.clear(); groupRecordMap.clear(); //数据库 SqlUtil.chatDataTableModel.clear(); } //更新最后一条记录 updateLastRecordWithMsg(MsgModel msgModel) async { if (msgModel == null) { print('消息为空,无法更新'); } if (msgModel.channelType == ChatChannelType.Group.value) { var groupInfo = await GroupInfoMgr().getGroupInfo(msgModel.sessionId); groupInfo.updateLastMsg(msgModel); if (msgModel.readState == 1) { groupUnreadProvider.updateUnreadCount(msgModel.sessionId, 1); } } else { print('更新最后一条记录msgModel friendid :${msgModel.friendId}'); lastMsgProvider.updateLastMsg(msgModel); if (msgModel.readState == 1) { unreadCountProvider.updateUnreadCount(msgModel.sessionId, 1); } } } }