Hibok
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

404 řádky
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. groupUnreadProvider.initUnreadAlter();
  61. }
  62. logout() {
  63. GroupInfoMgr().clear();
  64. unreadCountProvider.clear();
  65. groupUnreadProvider.clear();
  66. lastMsgProvider.clear();
  67. msgRecordMap.clear();
  68. groupRecordMap.clear();
  69. _isInit = false;
  70. }
  71. //获取私聊记录
  72. List<MsgModel> getRecord({int sessionId}) {
  73. var record = msgRecordMap[
  74. sessionId == null ? MsgHandler.curActiveSession : sessionId];
  75. if (record == null) {
  76. record = [];
  77. msgRecordMap[MsgHandler.curActiveSession] = record;
  78. }
  79. return record;
  80. }
  81. //获取群聊记录
  82. List<MsgModel> getGroupRecord({int sessionId}) {
  83. var record = groupRecordMap[
  84. sessionId == null ? MsgHandler.curActiveSession : sessionId];
  85. if (record == null) {
  86. record = [];
  87. groupRecordMap[MsgHandler.curActiveSession] = record;
  88. }
  89. return record;
  90. }
  91. //获取企业号聊天记录
  92. List<MsgModel> getCompanyRecord() {
  93. var record = msgRecordMap[MsgHandler.curActiveSession];
  94. if (record == null) {
  95. record = [];
  96. msgRecordMap[MsgHandler.curActiveSession] = record;
  97. }
  98. return record;
  99. }
  100. updateLastMsgWithTranslateMsg(PushChat chat) async {
  101. if (chat.channelType == ChatChannelType.Group) {
  102. var groupInfo = await GroupInfoMgr().getGroupInfo(chat.targetId);
  103. if (groupInfo != null) {
  104. groupInfo.updateLastMsgWithTransMsg(chat);
  105. }
  106. } else {
  107. lastMsgProvider.updateWithTranslateMsg(chat);
  108. }
  109. }
  110. //标记消息已读
  111. signRead(int sessionId, {bool isGroup = false}) {
  112. print('消除未读标记:$sessionId 群$isGroup');
  113. SqlUtil().updateReadState(sessionId, isGroup: isGroup);
  114. //获取消息列表
  115. List<MsgModel> recordList;
  116. if (isGroup) {
  117. recordList = getGroupRecord();
  118. } else {
  119. recordList = getRecord();
  120. }
  121. for (var i = 0; i < recordList.length; i++) {
  122. var record = recordList[i];
  123. if (record.readState == 1) {
  124. record.readState = 0;
  125. }
  126. }
  127. if (isGroup) {
  128. print('群消息');
  129. groupUnreadProvider.signRead(sessionId);
  130. MessageMgr().emit('Update Unread Msg Count');
  131. //to do
  132. } else {
  133. unreadCountProvider.signRead(sessionId);
  134. MessageMgr().emit('Update Unread Msg Count');
  135. }
  136. }
  137. getLastMsg(int sessionId, isGroup) {
  138. if (isGroup) {
  139. var record = groupRecordMap[sessionId];
  140. if (record != null && record.length > 0) {
  141. return record.first;
  142. }
  143. } else {
  144. var record = msgRecordMap[sessionId];
  145. if (record != null && record.length > 0) {
  146. return record.first;
  147. }
  148. }
  149. return null;
  150. }
  151. //获得最新一条聊天记录, 先读取历史消息
  152. getLastRecord() {
  153. List<MsgModel> recordList = [];
  154. if (msgRecordMap == null) {
  155. msgRecordMap = {};
  156. }
  157. msgRecordMap.values.forEach((record) {
  158. recordList.add(record.first);
  159. });
  160. for (var i = 0; i < recordList.length; i++) {
  161. MsgModel msgModel = recordList[i];
  162. lastMsgProvider.addMsg(msgModel);
  163. }
  164. lastMsgProvider.sortLastMsg();
  165. }
  166. //更新红包消息状态
  167. void updateRedWalletMsg(
  168. int sessionId, String walletId, RedWalletState state) {
  169. //获取消息列表
  170. List<MsgModel> recordList = getRecord();
  171. for (var i = 0; i < recordList.length; i++) {
  172. var record = recordList[i];
  173. if (record.msgType == ChatType.RedWalletChatType.value) {
  174. //系统红包通知消息
  175. RedWallet wallet = RedWallet.fromBuffer(record.msgContent);
  176. if (wallet.orderId == walletId) {
  177. wallet.state = state;
  178. }
  179. record.msgContent = wallet.writeToBuffer();
  180. MessageMgr().emit('Update RedWalletState', wallet);
  181. SqlUtil().updateWalletState(record);
  182. break;
  183. }
  184. }
  185. }
  186. //处理未读消息
  187. updateRecordWithUnreadMsg(List<UserUnreadMsgNotice> noticeList) async {
  188. var unreadCount = noticeList.length;
  189. print('更新未读消息$unreadCount');
  190. for (var i = 0; i < unreadCount; i++) {
  191. var unread = noticeList[i];
  192. if (unread.channelType == ChatChannelType.Group) {
  193. print('群聊未读消息');
  194. var groupInfo = await GroupInfoMgr().getGroupInfo(unread.targetId);
  195. if (groupInfo != null) {
  196. groupInfo.updateLastMsgWithUnread(unread);
  197. }
  198. if (unread.targetId != MsgHandler.curActiveSession) {
  199. groupUnreadProvider.updateUnreadCount(
  200. unread.targetId, unread.unreadMsgNum);
  201. } else {
  202. MsgHandler.getUnreadMsgDetail(true);
  203. }
  204. } else {
  205. print('私聊未读消息');
  206. lastMsgProvider.addUnreadMsg(unread);
  207. if (unread.targetId != MsgHandler.curActiveSession) {
  208. unreadCountProvider.updateUnreadCount(
  209. unread.targetId, unread.unreadMsgNum);
  210. } else {
  211. MsgHandler.getUnreadMsgDetail(false);
  212. }
  213. }
  214. }
  215. }
  216. //保存反馈助手聊天信息
  217. saveCompanyMsg(MsgModel msg) {
  218. var record = msgRecordMap[msg.sessionId];
  219. if (record == null) {
  220. record = [];
  221. msgRecordMap[msg.sessionId] = record;
  222. }
  223. var result = getMsgBy(msg.sessionId, msg.time, false);
  224. if (result == null) {
  225. insertToDB(msg, record);
  226. }
  227. }
  228. //保存本地聊天数据
  229. saveMsg(MsgModel msg) {
  230. if (msg.channelType == ChatChannelType.Group.value) {
  231. var record = groupRecordMap[msg.sessionId];
  232. if (record == null) {
  233. record = [];
  234. groupRecordMap[msg.sessionId] = record;
  235. }
  236. var result = getMsgBy(msg.sessionId, msg.time, true);
  237. if (result != null) {
  238. print('消息存在!!!!');
  239. } else {
  240. print('插入消息!!!!');
  241. insertToDB(msg, record);
  242. }
  243. } else {
  244. var record = msgRecordMap[msg.sessionId];
  245. if (record == null) {
  246. record = [];
  247. msgRecordMap[msg.sessionId] = record;
  248. }
  249. var result = getMsgBy(msg.sessionId, msg.time, false);
  250. if (result != null) {
  251. // print('消息存在!!!!');
  252. } else {
  253. insertToDB(msg, record);
  254. }
  255. }
  256. }
  257. updateMsgState(int sessionId, int time, int channelType, int state) {
  258. SqlUtil().updateMsgState(sessionId, time, state,
  259. isGroup: channelType == ChatChannelType.Group.value);
  260. MessageMgr().emit('Update Chat Message State',
  261. {'sessionId': sessionId, 'time': time, 'state': state});
  262. }
  263. insertToDB(MsgModel msg, List<MsgModel> record) {
  264. if (msg.sessionId == null) {
  265. print('数据为空,无法插入');
  266. } else {
  267. record.insert(0, msg);
  268. // print(MsgHandler.time);
  269. //int after = DateTime.now().millisecondsSinceEpoch-MsgHandler.time;
  270. // print('******插入数据 use $after');
  271. // print('******record length ${record.length} ${msg.sessionId}');
  272. SqlUtil.insert(msg);
  273. updateLastRecordWithMsg(msg);
  274. }
  275. }
  276. MsgModel getMsgBy(int sessionId, int timestamp, bool isGroup) {
  277. var record;
  278. if (isGroup) {
  279. record = groupRecordMap[sessionId];
  280. } else {
  281. record = msgRecordMap[sessionId];
  282. }
  283. if (record != null) {
  284. for (var i = 0; i < record.length; i++) {
  285. MsgModel msg = record[i];
  286. if (msg.time == timestamp) {
  287. return msg;
  288. }
  289. }
  290. }
  291. return null;
  292. }
  293. //删除本地聊天消息
  294. deleteMsg(int sessionId, bool isGroup) {
  295. SqlUtil().delteRecord(sessionId, isGroup: isGroup);
  296. if (isGroup) {
  297. var record = groupRecordMap[sessionId];
  298. if (record != null) {
  299. record.clear();
  300. }
  301. groupUnreadProvider.signRead(sessionId);
  302. } else {
  303. var record = msgRecordMap[sessionId];
  304. if (record != null) {
  305. record.clear();
  306. }
  307. unreadCountProvider.signRead(sessionId);
  308. }
  309. }
  310. //删除所有聊天消息
  311. deleteAllRecord() {
  312. //未读数据
  313. groupUnreadProvider.clear();
  314. unreadCountProvider.clear();
  315. //聊天记录
  316. msgRecordMap.clear();
  317. groupRecordMap.clear();
  318. //数据库
  319. SqlUtil.chatDataTableModel.clear();
  320. }
  321. //更新最后一条记录
  322. updateLastRecordWithMsg(MsgModel msgModel) async {
  323. if (msgModel == null) {
  324. print('消息为空,无法更新');
  325. }
  326. if (msgModel.channelType == ChatChannelType.Group.value) {
  327. var groupInfo = await GroupInfoMgr().getGroupInfo(msgModel.sessionId);
  328. groupInfo.updateLastMsg(msgModel);
  329. if (msgModel.readState == 1) {
  330. groupUnreadProvider.updateUnreadCount(msgModel.sessionId, 1);
  331. }
  332. } else {
  333. print('更新最后一条记录msgModel friendid :${msgModel.friendId}');
  334. lastMsgProvider.updateLastMsg(msgModel);
  335. if (msgModel.readState == 1) {
  336. unreadCountProvider.updateUnreadCount(msgModel.sessionId, 1);
  337. }
  338. }
  339. }
  340. }