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.
 
 
 
 
 
 

396 line
10 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() {
  72. var record = msgRecordMap[MsgHandler.curActiveSession];
  73. if (record == null) {
  74. record = [];
  75. msgRecordMap[MsgHandler.curActiveSession] = record;
  76. }
  77. return record;
  78. }
  79. //获取群聊记录
  80. List<MsgModel> getGroupRecord() {
  81. var record = groupRecordMap[MsgHandler.curActiveSession];
  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. insertToDB(msg, record);
  238. }
  239. } else {
  240. var record = msgRecordMap[msg.sessionId];
  241. if (record == null) {
  242. record = [];
  243. msgRecordMap[msg.sessionId] = record;
  244. }
  245. var result = getMsgBy(msg.sessionId, msg.time, false);
  246. if (result != null) {
  247. // print('消息存在!!!!');
  248. } else {
  249. insertToDB(msg, record);
  250. }
  251. }
  252. }
  253. updateMsgState(int sessionId, int time, int channelType, int state) {
  254. SqlUtil().updateMsgState(sessionId, time, state,
  255. isGroup: channelType == ChatChannelType.Group.value);
  256. MessageMgr().emit('Update Chat Message State',
  257. {'sessionId': sessionId, 'time': time, 'state': state});
  258. }
  259. insertToDB(MsgModel msg, List<MsgModel> record) {
  260. if (msg.sessionId == null) {
  261. print('数据为空,无法插入');
  262. } else {
  263. record.insert(0, msg);
  264. //record.add(msg);
  265. SqlUtil.insert(msg);
  266. updateLastRecordWithMsg(msg);
  267. }
  268. }
  269. MsgModel getMsgBy(int sessionId, int timestamp, bool isGroup) {
  270. var record;
  271. if (isGroup) {
  272. record = groupRecordMap[sessionId];
  273. } else {
  274. record = msgRecordMap[sessionId];
  275. }
  276. if (record != null) {
  277. for (var i = 0; i < record.length; i++) {
  278. MsgModel msg = record[i];
  279. if (msg.time == timestamp) {
  280. return msg;
  281. }
  282. }
  283. }
  284. return null;
  285. }
  286. //删除本地聊天消息
  287. deleteMsg(int sessionId, bool isGroup) {
  288. SqlUtil().delteRecord(sessionId, isGroup: isGroup);
  289. if (isGroup) {
  290. var record = groupRecordMap[sessionId];
  291. if (record != null) {
  292. record.clear();
  293. }
  294. groupUnreadProvider.signRead(sessionId);
  295. } else {
  296. var record = msgRecordMap[sessionId];
  297. if (record != null) {
  298. record.clear();
  299. }
  300. unreadCountProvider.signRead(sessionId);
  301. }
  302. }
  303. //删除所有聊天消息
  304. deleteAllRecord() {
  305. //未读数据
  306. groupUnreadProvider.clear();
  307. unreadCountProvider.clear();
  308. //聊天记录
  309. msgRecordMap.clear();
  310. groupRecordMap.clear();
  311. //数据库
  312. SqlUtil.chatDataTableModel.clear();
  313. }
  314. //更新最后一条记录
  315. updateLastRecordWithMsg(MsgModel msgModel) async {
  316. if (msgModel == null) {
  317. print('消息为空,无法更新');
  318. }
  319. if (msgModel.channelType == ChatChannelType.Group.value) {
  320. var groupInfo = await GroupInfoMgr().getGroupInfo(msgModel.sessionId);
  321. groupInfo.updateLastMsg(msgModel);
  322. if (msgModel.readState == 1) {
  323. groupUnreadProvider.updateUnreadCount(msgModel.sessionId, 1);
  324. }
  325. } else {
  326. lastMsgProvider.updateLastMsg(msgModel);
  327. if (msgModel.readState == 1) {
  328. unreadCountProvider.updateUnreadCount(msgModel.sessionId, 1);
  329. }
  330. }
  331. }
  332. }