Hibok
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

440 satır
12 KiB

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