Hibok
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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