Hibok
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.
 
 
 
 
 
 

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