Hibok
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

399 líneas
11 KiB

  1. import 'package:chat/data/group_data_mgr.dart';
  2. import 'package:chat/models/ChatMsg.dart';
  3. import 'package:chat/models/last_msg_provider.dart';
  4. import 'package:chat/models/unread_count_provider.dart';
  5. import 'package:chat/proto/all.pbserver.dart';
  6. import 'package:chat/utils/MessageMgr.dart';
  7. import 'package:chat/utils/msgHandler.dart';
  8. import 'package:chat/utils/sql_util.dart';
  9. class ChatDataMgr {
  10. static ChatDataMgr _instance;
  11. static ChatDataMgr _getInstance() {
  12. if (_instance == null) {
  13. _instance = ChatDataMgr._();
  14. }
  15. return _instance;
  16. }
  17. bool _isInit = false;
  18. factory ChatDataMgr() => _getInstance();
  19. ChatDataMgr._();
  20. //私聊最新消息
  21. LastMsgProvider lastMsgProvider;
  22. UnreadCountProvider unreadCountProvider; //私人未读消息
  23. UnreadCountProvider groupUnreadProvider; //群聊未读消息
  24. //私聊记录
  25. Map<int, List<MsgModel>> msgRecordMap;
  26. //群聊记录
  27. Map<int, List<MsgModel>> groupRecordMap;
  28. //获取本地聊天数据
  29. initMsg() async {
  30. if (!_isInit) {
  31. _isInit = true;
  32. print('初始化本地聊天记录');
  33. lastMsgProvider = LastMsgProvider();
  34. unreadCountProvider = UnreadCountProvider();
  35. groupUnreadProvider = UnreadCountProvider();
  36. initLocalMsg();
  37. }
  38. }
  39. initLocalMsg() async {
  40. msgRecordMap = await SqlUtil.getAllRecord(isGroup: false);
  41. groupRecordMap = await SqlUtil.getAllRecord(isGroup: true);
  42. print('查询本地未读消息');
  43. initUnreadCount();
  44. initGroupUnreadCount();
  45. getLastRecord();
  46. }
  47. //初始化私聊未读消息
  48. initUnreadCount() async {
  49. var unreadCountMap = await SqlUtil.getUnreadCount(false);
  50. unreadCountMap.forEach((k, v) {
  51. unreadCountProvider.updateUnreadCount(k, v);
  52. });
  53. }
  54. //初始化群聊未读消息
  55. initGroupUnreadCount() async {
  56. var unreadCountMap = await SqlUtil.getUnreadCount(true);
  57. unreadCountMap.forEach((k, v) {
  58. groupUnreadProvider.updateUnreadCount(k, v);
  59. });
  60. }
  61. logout() {
  62. GroupInfoMgr().clear();
  63. unreadCountProvider.clear();
  64. groupUnreadProvider.clear();
  65. lastMsgProvider.clear();
  66. msgRecordMap.clear();
  67. groupRecordMap.clear();
  68. _isInit = false;
  69. }
  70. //获取私聊记录
  71. List<MsgModel> getRecord({int sessionId}) {
  72. var record = msgRecordMap[sessionId==null?MsgHandler.curActiveSession:sessionId];
  73. if (record == null) {
  74. record = [];
  75. msgRecordMap[MsgHandler.curActiveSession] = record;
  76. }
  77. return record;
  78. }
  79. //获取群聊记录
  80. List<MsgModel> getGroupRecord({int sessionId}) {
  81. var record = groupRecordMap[sessionId==null?MsgHandler.curActiveSession:sessionId];
  82. if (record == null) {
  83. record = [];
  84. groupRecordMap[MsgHandler.curActiveSession] = record;
  85. }
  86. return record;
  87. }
  88. //获取企业号聊天记录
  89. List<MsgModel> getCompanyRecord() {
  90. var record = msgRecordMap[MsgHandler.curActiveSession];
  91. if (record == null) {
  92. record = [];
  93. msgRecordMap[MsgHandler.curActiveSession] = record;
  94. }
  95. return record;
  96. }
  97. updateLastMsgWithTranslateMsg(PushChat chat) async {
  98. if (chat.channelType == ChatChannelType.Group) {
  99. var groupInfo = await GroupInfoMgr().getGroupInfo(chat.targetId);
  100. if (groupInfo != null) {
  101. groupInfo.updateLastMsgWithTransMsg(chat);
  102. }
  103. } else {
  104. lastMsgProvider.updateWithTranslateMsg(chat);
  105. }
  106. }
  107. //标记消息已读
  108. signRead(int sessionId, {bool isGroup = false}) {
  109. print('消除未读标记:$sessionId 群$isGroup');
  110. SqlUtil().updateReadState(sessionId, isGroup: isGroup);
  111. //获取消息列表
  112. List<MsgModel> recordList;
  113. if (isGroup) {
  114. recordList = getGroupRecord();
  115. } else {
  116. recordList = getRecord();
  117. }
  118. for (var i = 0; i < recordList.length; i++) {
  119. var record = recordList[i];
  120. if (record.readState == 1) {
  121. record.readState = 0;
  122. }
  123. }
  124. if (isGroup) {
  125. print('群消息');
  126. groupUnreadProvider.signRead(sessionId);
  127. MessageMgr().emit('Update Unread Msg Count');
  128. //to do
  129. } else {
  130. unreadCountProvider.signRead(sessionId);
  131. MessageMgr().emit('Update Unread Msg Count');
  132. }
  133. }
  134. getLastMsg(int sessionId, isGroup) {
  135. if (isGroup) {
  136. var record = groupRecordMap[sessionId];
  137. if (record != null && record.length > 0) {
  138. return record.first;
  139. }
  140. } else {
  141. var record = msgRecordMap[sessionId];
  142. if (record != null && record.length > 0) {
  143. return record.first;
  144. }
  145. }
  146. return null;
  147. }
  148. //获得最新一条聊天记录, 先读取历史消息
  149. getLastRecord() {
  150. List<MsgModel> recordList = [];
  151. if (msgRecordMap == null) {
  152. msgRecordMap = {};
  153. }
  154. msgRecordMap.values.forEach((record) {
  155. recordList.add(record.first);
  156. });
  157. for (var i = 0; i < recordList.length; i++) {
  158. MsgModel msgModel = recordList[i];
  159. lastMsgProvider.addMsg(msgModel);
  160. }
  161. lastMsgProvider.sortLastMsg();
  162. }
  163. //更新红包消息状态
  164. void updateRedWalletMsg(
  165. int sessionId, String walletId, RedWalletState state) {
  166. //获取消息列表
  167. List<MsgModel> recordList = getRecord();
  168. for (var i = 0; i < recordList.length; i++) {
  169. var record = recordList[i];
  170. if (record.msgType == ChatType.RedWalletChatType.value) {
  171. //系统红包通知消息
  172. RedWallet wallet = RedWallet.fromBuffer(record.msgContent);
  173. if (wallet.orderId == walletId) {
  174. wallet.state = state;
  175. }
  176. record.msgContent = wallet.writeToBuffer();
  177. MessageMgr().emit('Update RedWalletState', wallet);
  178. SqlUtil().updateWalletState(record);
  179. break;
  180. }
  181. }
  182. }
  183. //处理未读消息
  184. updateRecordWithUnreadMsg(List<UserUnreadMsgNotice> noticeList) async {
  185. var unreadCount = noticeList.length;
  186. print('更新未读消息$unreadCount');
  187. for (var i = 0; i < unreadCount; i++) {
  188. var unread = noticeList[i];
  189. if (unread.channelType == ChatChannelType.Group) {
  190. print('群聊未读消息');
  191. var groupInfo = await GroupInfoMgr().getGroupInfo(unread.targetId);
  192. if (groupInfo != null) {
  193. groupInfo.updateLastMsgWithUnread(unread);
  194. }
  195. if (unread.targetId != MsgHandler.curActiveSession) {
  196. groupUnreadProvider.updateUnreadCount(
  197. unread.targetId, unread.unreadMsgNum);
  198. } else {
  199. MsgHandler.getUnreadMsgDetail(true);
  200. }
  201. } else {
  202. print('私聊未读消息');
  203. lastMsgProvider.addUnreadMsg(unread);
  204. if (unread.targetId != MsgHandler.curActiveSession) {
  205. unreadCountProvider.updateUnreadCount(
  206. unread.targetId, unread.unreadMsgNum);
  207. } else {
  208. MsgHandler.getUnreadMsgDetail(false);
  209. }
  210. }
  211. }
  212. }
  213. //保存反馈助手聊天信息
  214. saveCompanyMsg(MsgModel msg) {
  215. var record = msgRecordMap[msg.sessionId];
  216. if (record == null) {
  217. record = [];
  218. msgRecordMap[msg.sessionId] = record;
  219. }
  220. var result = getMsgBy(msg.sessionId, msg.time, false);
  221. if (result == null) {
  222. insertToDB(msg, record);
  223. }
  224. }
  225. //保存本地聊天数据
  226. saveMsg(MsgModel msg) {
  227. if (msg.channelType == ChatChannelType.Group.value) {
  228. var record = groupRecordMap[msg.sessionId];
  229. if (record == null) {
  230. record = [];
  231. groupRecordMap[msg.sessionId] = record;
  232. }
  233. var result = getMsgBy(msg.sessionId, msg.time, true);
  234. if (result != null) {
  235. print('消息存在!!!!');
  236. } else {
  237. print('插入消息!!!!');
  238. insertToDB(msg, record);
  239. }
  240. } else {
  241. var record = msgRecordMap[msg.sessionId];
  242. if (record == null) {
  243. record = [];
  244. msgRecordMap[msg.sessionId] = record;
  245. }
  246. var result = getMsgBy(msg.sessionId, msg.time, false);
  247. if (result != null) {
  248. // print('消息存在!!!!');
  249. } else {
  250. insertToDB(msg, record);
  251. }
  252. }
  253. }
  254. updateMsgState(int sessionId, int time, int channelType, int state) {
  255. SqlUtil().updateMsgState(sessionId, time, state,
  256. isGroup: channelType == ChatChannelType.Group.value);
  257. MessageMgr().emit('Update Chat Message State',
  258. {'sessionId': sessionId, 'time': time, 'state': state});
  259. }
  260. insertToDB(MsgModel msg, List<MsgModel> record) {
  261. if (msg.sessionId == null) {
  262. print('数据为空,无法插入');
  263. } else {
  264. record.insert(0, msg);
  265. //record.add(msg);
  266. SqlUtil.insert(msg);
  267. updateLastRecordWithMsg(msg);
  268. }
  269. }
  270. MsgModel getMsgBy(int sessionId, int timestamp, bool isGroup) {
  271. var record;
  272. if (isGroup) {
  273. record = groupRecordMap[sessionId];
  274. } else {
  275. record = msgRecordMap[sessionId];
  276. }
  277. if (record != null) {
  278. for (var i = 0; i < record.length; i++) {
  279. MsgModel msg = record[i];
  280. if (msg.time == timestamp) {
  281. return msg;
  282. }
  283. }
  284. }
  285. return null;
  286. }
  287. //删除本地聊天消息
  288. deleteMsg(int sessionId, bool isGroup) {
  289. SqlUtil().delteRecord(sessionId, isGroup: isGroup);
  290. if (isGroup) {
  291. var record = groupRecordMap[sessionId];
  292. if (record != null) {
  293. record.clear();
  294. }
  295. groupUnreadProvider.signRead(sessionId);
  296. } else {
  297. var record = msgRecordMap[sessionId];
  298. if (record != null) {
  299. record.clear();
  300. }
  301. unreadCountProvider.signRead(sessionId);
  302. }
  303. }
  304. //删除所有聊天消息
  305. deleteAllRecord() {
  306. //未读数据
  307. groupUnreadProvider.clear();
  308. unreadCountProvider.clear();
  309. //聊天记录
  310. msgRecordMap.clear();
  311. groupRecordMap.clear();
  312. //数据库
  313. SqlUtil.chatDataTableModel.clear();
  314. }
  315. //更新最后一条记录
  316. updateLastRecordWithMsg(MsgModel msgModel) async {
  317. if (msgModel == null) {
  318. print('消息为空,无法更新');
  319. }
  320. if (msgModel.channelType == ChatChannelType.Group.value) {
  321. var groupInfo = await GroupInfoMgr().getGroupInfo(msgModel.sessionId);
  322. groupInfo.updateLastMsg(msgModel);
  323. if (msgModel.readState == 1) {
  324. groupUnreadProvider.updateUnreadCount(msgModel.sessionId, 1);
  325. }
  326. } else {
  327. print('更新最后一条记录msgModel friendid :${msgModel.friendId}');
  328. lastMsgProvider.updateLastMsg(msgModel);
  329. if (msgModel.readState == 1) {
  330. unreadCountProvider.updateUnreadCount(msgModel.sessionId, 1);
  331. }
  332. }
  333. }
  334. }