chats.endpoint.js 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  1. /**
  2. * 消息端点。
  3. *
  4. * 此控制器处理点对点,组及消息消息。为三类消息提供发送及查询功能。
  5. */
  6. "use strict";
  7. let express = require('express');
  8. let router = express.Router();
  9. let http = require('http');
  10. let getui = require('getui');
  11. let log = require('../util/log.js');
  12. let objectUtil = require("../util/objectUtil.js");
  13. let Patient = new require("../models/patient");
  14. let patient = new Patient();
  15. let smRepo = require("../repository/system.msg.repo.js");
  16. let pmRepo = require('../repository/private.msg.repo.js');
  17. let gmRepo = require("../repository/group.msg.repo.js");
  18. let nmRepo = require("../repository/notify.msg.repo.js");
  19. let statsRepo = require("../repository/stats.msg.repo.js");
  20. let doctorRepo = require("../repository/doctor.repo.js");
  21. let groupRepo = require("../repository/group.repo.js");
  22. let searchRepo = require('../repository/search.repo.js');
  23. let APIv1 = require('../include/endpoints').APIv1;
  24. let CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
  25. let GROUP_TYPE = require('../include/commons').GROUP_TYPE;
  26. let PLATFORMS = require('../include/commons').PLATFORM;
  27. let MAX_INT = 9007199254740992;
  28. let DEFAULT_PAGE_SIZE = 100;
  29. //--------------------------------------------------------------//
  30. //----------------------------消息发送----------------------------//
  31. //--------------------------------------------------------------//
  32. /**
  33. * 发送System消息。
  34. *
  35. * 请求URL:
  36. * /chats/sm
  37. *
  38. * 消息格式:
  39. * {
  40. * to: "Rose",
  41. * title: "System Message",
  42. * summary: "You have new job",
  43. * contentType: "1",
  44. * content: "The patient has been followed in the scheduler, please make new follow plan as soon as possible."
  45. * }
  46. *
  47. * @param message
  48. */
  49. router.post(APIv1.Chats.SM, function (req, res) {
  50. // 检查消息体及消息格式是否正确
  51. let message = req.body;
  52. if (!objectUtil.isJsonObject(message)) {
  53. throw {httpStatus: 406, message: 'Problems parsing JSON.'}
  54. }
  55. // 字段判断
  56. let testing = objectUtil.fieldsCheck(message, "to", "title", "summary", "contentType", "content");
  57. if (!testing.pass) {
  58. throw {httpStatus: 406, message: testing.message}
  59. }
  60. // 消息处理
  61. doctorRepo.getUserStatus(message.to, function (err, rows) {
  62. if (err) {
  63. console.log("Lookup system message receiver failed: ", err);
  64. res.status(500).send({message: "Lookup system message receiver failed."});
  65. return;
  66. }
  67. if (rows.length == 0) {
  68. res.status(404).send({message: "User not found: " + message.to});
  69. return;
  70. }
  71. let pushable = rows.length > 0 && rows[0].is_online;
  72. let notifyMessage = JSON.stringify({type: 'system_msg', data: message.content});
  73. let userStatus = rows[0];
  74. // 保存该条推送信息
  75. smRepo.save(message.to,
  76. message.contentType,
  77. message.title,
  78. message.summary,
  79. message.content,
  80. function (err, result) {
  81. if (err) {
  82. log.error("Save system notify message failed, ", err);
  83. res.status(500).send({message: "Save system notify message failed."});
  84. } else {
  85. // 先结束网络连接,再处理后续操作,减少客户端等待
  86. res.status(200).send();
  87. // 保存通知到数据库中
  88. nmRepo.save(message.to,
  89. message.contentType,
  90. message.title,
  91. message.summary,
  92. notifyMessage,
  93. pushable,
  94. function (err, result) {
  95. if (err) {
  96. log.error("Save system notify message failed, ", err);
  97. res.status(500).send({message: "Save system notify message failed."});
  98. } else {
  99. if (pushable) {
  100. if (userStatus.platform === PLATFORMS.iOS) {
  101. getui.pushAPN(message.to, userStatus.token, message.contentType, message.title, message.content, notifyMessage,
  102. function (err, result) {
  103. err != null ? console.log(err) : console.log(result);
  104. });
  105. } else if (userStatus.platform === PLATFORMS.Android) {
  106. getui.pushAndroid(userStatus.client_id, message.contentType, message.title, message.content, notifyMessage, userStatus.status,
  107. function (err, result) {
  108. err != null ? console.log(err) : console.log(result);
  109. });
  110. }
  111. }
  112. }
  113. });
  114. }
  115. });
  116. });
  117. });
  118. /**
  119. * 处理Private消息。处理流程分:
  120. * 1 解析消息,并保存到数据库
  121. * 2 更新消息统计数据
  122. * 3 获取目标的状态并构建通知消息,如果用户在线就推送通知消息
  123. *
  124. * 请求URL:
  125. * /chats/pm
  126. *
  127. * 消息格式:
  128. * {
  129. * from: sand,
  130. * to: Rose,
  131. * contentType: "1,2,3,4",
  132. * content: "Please follow the patient as soon as possible."
  133. * }
  134. *
  135. * @param message
  136. */
  137. router.post(APIv1.Chats.PM, function (req, res) {
  138. // 检查消息体及消息格式是否正确
  139. let message = req.body;
  140. if (!objectUtil.isJsonObject(message)) {
  141. throw {httpStatus: 406, message: 'Problems parsing JSON.'}
  142. }
  143. // 字段判断
  144. let testing = objectUtil.fieldsCheck(message, "from", "to", "contentType", "content");
  145. if (!testing.pass) {
  146. throw {httpStatus: 406, message: testing.message};
  147. }
  148. patient.sendMessage(message.to, message);
  149. res.status(200).send({});
  150. return;
  151. // 保存消息
  152. let tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content;
  153. pmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
  154. if (err) {
  155. res.status(500).send({message: 'Save private message failed.'});
  156. return;
  157. }
  158. // 结束网络连接,后续操作继续执行
  159. pmRepo.findOneMessage(result.insertId, function (err, msg) {
  160. if (err) {
  161. res.status(500).send({message: "Save private message success, but return last message failed."});
  162. return;
  163. }
  164. let feedback = fillMessages(msg);
  165. res.status(200).send(feedback);
  166. patient.isPatientCode(
  167. message.to,
  168. function () {
  169. // 推送给患者
  170. patient.sendMessage(message.to, 1, feedback);
  171. },
  172. function () {
  173. // 推送给医生。获取对方状态,即对端的系统平台,token等信息,并推送通知消息给对端
  174. doctorRepo.isExist(message.to, function (err, rows) {
  175. if (err) {
  176. console.log('Lookup receiving users failed or user not found: ', err);
  177. return;
  178. }
  179. doctorRepo.getUserStatus(message.to, function (err, result) {
  180. if (err) {
  181. log.error('Get target user status for private message failed: ' + message.to);
  182. return;
  183. }
  184. // 构建通知消息
  185. let title = '新消息';
  186. let content = '';
  187. if (message.contentType === CONTENT_TYPES.PlainText) {
  188. content = message.content;
  189. } else if (message.contentType === CONTENT_TYPES.Image) {
  190. content = '[图片]';
  191. } else if (message.contentType === CONTENT_TYPES.Audio) {
  192. content = '[语音]';
  193. } else {
  194. content = '接收到一条新消息';
  195. }
  196. let target = result[0];
  197. let isOnline = result.length > 0 && target.is_online === 1;
  198. let notifyMessage = JSON.stringify({type: 'p2p_msg', from_uid: message.from});
  199. // 保存通知消息到数据库中并根据用户在线状态推送此消息
  200. nmRepo.save(message.to, message.contentType, title, content, notifyMessage, isOnline, function (err, result) {
  201. if (err) {
  202. log.error('Save private notify message failed, ', err);
  203. return;
  204. }
  205. if (!isOnline) return;
  206. if (target.platform === PLATFORMS.iOS) {
  207. getui.pushAPN(message.to,
  208. target.token,
  209. message.contentType,
  210. title,
  211. content,
  212. notifyMessage,
  213. function (err, result) {
  214. if (err != null) {
  215. console.log(err);
  216. } else {
  217. console.log(result);
  218. }
  219. });
  220. } else if (target.platform === PLATFORMS.Android) {
  221. getui.pushAndroid(target.client_id,
  222. message.contentType,
  223. title,
  224. content,
  225. notifyMessage,
  226. target.status,
  227. function (err, result) {
  228. if (err != null) {
  229. console.log(err);
  230. } else {
  231. console.log(result);
  232. }
  233. });
  234. }
  235. });
  236. });
  237. });
  238. });
  239. });
  240. // 更新自身的聊天统计信息
  241. statsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
  242. if (err) log.error(err);
  243. });
  244. // 更新对端的聊天统计信息
  245. statsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
  246. if (err) log.error(err);
  247. });
  248. });
  249. });
  250. /**
  251. * 处理讨论组消息。
  252. *
  253. * 请求URL:
  254. * /chats/gm
  255. *
  256. * 消息格式:
  257. * {
  258. * from: "sand", // 发送者id
  259. * at: "Rose", // @人
  260. * group: "DiscussionGroupId", // 所在组
  261. * groupType: "1 or 2", // 组类型:行政团队或讨论组
  262. * contentType: "1,2,3", // 内容类型
  263. * content: "The patient mess me up" // 内容
  264. * }
  265. *
  266. * @param message
  267. */
  268. router.post(APIv1.Chats.GM, function (req, res) {
  269. // 检查消息体及消息格式是否正确
  270. let message = req.body;
  271. if (!objectUtil.isJsonObject(message)) {
  272. throw {httpStatus: 406, message: 'Problems parsing JSON.'};
  273. }
  274. // 字段判断
  275. let testing = objectUtil.fieldsCheck(message, 'from', 'at', 'group', 'groupType', 'contentType', 'content');
  276. if (!testing.pass) {
  277. throw {httpStatus: 406, message: testing.message}
  278. }
  279. // 消息处理
  280. groupRepo.isGroupMember(message.group, message.groupType, message.from, function (err, result) {
  281. if (err) {
  282. log.error('Check group member failed: ', err);
  283. res.status(500).send({message: 'Check group member failed.'});
  284. return;
  285. }
  286. if (result.length == 0) {
  287. res.status(404).send({message: 'Member with id "' + message.from + '" is not in group "' + message.group + '"'});
  288. return;
  289. }
  290. // 保存群组消息
  291. gmRepo.save(message.from, message.group, message.at, message.contentType, message.content, function (err, insertedRow) {
  292. if (err) {
  293. log.error('Save group message failed: ', err);
  294. res.status(500).send({message: 'Save group message failed.'});
  295. return;
  296. }
  297. gmRepo.findOneMessage(insertedRow.insertId, function (err, groupMsg) {
  298. if (err) {
  299. log.error("Save group message success, but return this message failed.");
  300. res.status(500).send({message: "Save group message success, but return this message failed."});
  301. }
  302. // 关闭网络连接后执行后续操作
  303. let feedback = fillMessages(groupMsg);
  304. res.status(200).send(feedback);
  305. // 推送通知消息给群组成员
  306. groupRepo.getMembers(message.group, message.groupType, function (err, members) {
  307. if (err) {
  308. log.error('Get group members failed: ', err);
  309. return;
  310. }
  311. if (members.length == 0) {
  312. log.warn('No members in group ', message.group,
  313. message.groupType === GROUP_TYPE.AdminTeam ? " of admin team." : "of discussion group.");
  314. return;
  315. }
  316. // 逐个推送通知,患者与医生推送方式不一样
  317. for (let i = 0; i < members.length; i++) {
  318. let member = members[i];
  319. if (member.user_id === message.from) continue;
  320. (function (user_id) {
  321. patient.isPatientCode(user_id,
  322. function () {
  323. patient.sendMessage(user_id, 2, feedback);
  324. },
  325. function () {
  326. doctorRepo.getUserStatus(user_id, function (err, result) {
  327. if (err) {
  328. console.error('Get group member status failed: ', err);
  329. return;
  330. }
  331. let title = '';
  332. let content = '';
  333. if (message.contentType === CONTENT_TYPES.PlainText) {
  334. title = '群组消息';
  335. content = message.content;
  336. } else if (message.contentType === CONTENT_TYPES.Image) {
  337. title = '群组消息';
  338. content = '[图片]';
  339. } else if (message.contentType === CONTENT_TYPES.Audio) {
  340. title = '群组消息';
  341. content = '[语音]';
  342. } else {
  343. title = '群组消息';
  344. content = '接收到一条新消息';
  345. }
  346. let pushable = result.length > 0 && result[0].is_online === 1;
  347. let notifyMessage = JSON.stringify({type: 'group_msg', gid: message.group});
  348. // 发送并保存通知到数据库中
  349. if (pushable) {
  350. let userStatus = result[0];
  351. if (userStatus.platform === PLATFORMS.iOS) {
  352. getui.pushAPN(user_id,
  353. userStatus.token,
  354. message.contentType,
  355. title,
  356. content,
  357. notifyMessage,
  358. function (err, result) {
  359. err != null ? console.error(err) : console.log(result);
  360. // 这段代码重复
  361. nmRepo.save(user_id,
  362. message.contentType,
  363. title,
  364. content,
  365. notifyMessage,
  366. err != null ? 0 : 1,
  367. function (err, result) {
  368. if (err) {
  369. console.log('Save group notify message failed: ', err);
  370. } else {
  371. }
  372. });
  373. });
  374. } else if (userStatus.platform === PLATFORMS.Android) {
  375. getui.pushAndroid(data.client_id,
  376. message.contentType,
  377. title,
  378. content,
  379. notifyMessage,
  380. userStatus.status,
  381. function (err, result) {
  382. err != null ? console.error(err) : console.log(result);
  383. // 这段代码重复
  384. nmRepo.save(user_id,
  385. message.contentType,
  386. title,
  387. content,
  388. notifyMessage,
  389. err != null ? 0 : 1,
  390. function (err, result) {
  391. if (err) {
  392. console.log('Save group notify message failed: ', err);
  393. } else {
  394. }
  395. });
  396. });
  397. }
  398. } else {
  399. // 这段代码重复
  400. nmRepo.save(user_id,
  401. message.contentType,
  402. title,
  403. content,
  404. notifyMessage,
  405. 0,
  406. function (err, result) {
  407. if (err) {
  408. console.log('Save group notify message failed: ', err);
  409. } else {
  410. }
  411. });
  412. }
  413. });
  414. // 统计'@'信息
  415. let at = message.at == user_id ? 1 : 0;
  416. statsRepo.updateGroupChatSummary(user_id,
  417. message.group,
  418. message.from,
  419. at,
  420. message.contentType,
  421. message.content,
  422. true,
  423. function (err, result) {
  424. if (err) console.log(err);
  425. });
  426. });
  427. })(member.user_id);
  428. }
  429. });
  430. });
  431. // 更新组内统计信息
  432. statsRepo.updateGroupChatSummary(message.from, message.group, message.from, 0, message.contentType, message.content, false, function (err, result) {
  433. if (err) log.error(err);
  434. });
  435. });
  436. });
  437. });
  438. //--------------------------------------------------------------//
  439. //----------------------------消息提取----------------------------//
  440. //--------------------------------------------------------------//
  441. /**
  442. * 获取参与的聊天列表,包括:点对点,@我,参与的讨论组,系统消息等。
  443. *
  444. * 请求URL:
  445. * /chats/list?user_id=sand
  446. */
  447. router.get(APIv1.Chats.List, function (req, res) {
  448. let userId = req.query.user_id;
  449. if (userId === null) {
  450. throw {httpStatus: 406, message: 'Missing fields.'};
  451. }
  452. // 与患者的私信
  453. pmRepo.findAllP2PWithPatient(userId, function (err, patients) {
  454. if (err) {
  455. log.error('Get chat list with patient failed: ', err);
  456. res.status(500).send({message: 'Get chat list with patient failed.'});
  457. return;
  458. }
  459. let chats = {patients: [], doctors: [], groups: []};
  460. for (let i = 0; i < patients.length; i++) {
  461. let patient = patients[i];
  462. chats.patients.push({
  463. code: patient.code,
  464. name: patient.name,
  465. birthday: patient.birthday,
  466. sex: patient.sex,
  467. avatar: patient.photo == null ? "" : patient.photo,
  468. newMessageCount: patient.new_msg_count,
  469. lastContentType: patient.last_content_type,
  470. lastContent: patient.last_content,
  471. timestamp: objectUtil.timestampToLong(patient.timestamp)
  472. });
  473. }
  474. // 含有患者的群
  475. gmRepo.findAllGroupsWithPatient(userId, function (err, groups) {
  476. if (err) {
  477. log.error('Get group list with patient failed: ', err);
  478. res.status(500).send({message: 'Get group list with patient failed.'});
  479. return;
  480. }
  481. for (let i = 0; i < groups.length; i++) {
  482. let group = groups[i];
  483. // 过滤掉医生间的求助团队
  484. if (group.group_type === 2) continue;
  485. //查找医生在讨论组的最新的消息记录数
  486. chats.groups.push({
  487. code: group.code,
  488. name: group.name,
  489. groupType: group.msg_type,
  490. newMessageCount: group.new_msg_count,
  491. lastContentType: group.last_content_type,
  492. lastContent: group.last_content,
  493. timestamp: objectUtil.timestampToLong(group.timestamp)
  494. });
  495. }
  496. // 医生间的私聊
  497. pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
  498. if (err) {
  499. log.error('Get chat list with doctor failed: ', err);
  500. res.status(500).send({message: 'Get chat list with doctor failed.'});
  501. return;
  502. }
  503. for (let i = 0; i < doctors.length; i++) {
  504. let doctor = doctors[i];
  505. chats.doctors.push({
  506. code: doctor.code,
  507. name: doctor.name,
  508. sex: doctor.sex,
  509. avatar: doctor.photo === null ? "" : doctor.photo,
  510. newMessageCount: doctor.new_msg_count,
  511. lastContentType: doctor.last_content_type,
  512. lastContent: doctor.last_content,
  513. timestamp: objectUtil.timestampToLong(doctor.timestamp)
  514. });
  515. }
  516. // 获取医生间的组
  517. gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
  518. if (err) {
  519. log.error('Get group list with doctor failed: ', err);
  520. res.status(500).send({message: 'Get group list with doctor failed.'});
  521. return;
  522. }
  523. for (let i = 0; i < groups.length; i++) {
  524. let group = groups[i];
  525. chats.groups.push({
  526. code: group.code,
  527. name: group.name,
  528. groupType: group.group_type, // 行政团队 or 求助
  529. newMessageCount: group.new_msg_count,
  530. lastContentType: group.last_content_type,
  531. lastContent: group.last_content,
  532. timestamp: objectUtil.timestampToLong(group.timestamp)
  533. });
  534. }
  535. res.status(200).send(chats);
  536. });
  537. });
  538. })
  539. });
  540. });
  541. /**
  542. * 获取与患者的聊天列表,包括:P2P,参与的讨论组和行政团队。
  543. *
  544. * 请求URL:
  545. * /chats/list/patient
  546. */
  547. router.get(APIv1.Chats.ListWithPatient, function (req, res) {
  548. let userId = req.query.user_id;
  549. if (userId === null) {
  550. throw {httpStatus: 406, message: 'Missing fields.'};
  551. }
  552. pmRepo.findAllP2PWithPatient(userId, function (err, patients) {
  553. if (err) {
  554. log.error('Get chat list with patient failed: ', err);
  555. res.status(500).send({message: 'Get chat list with patient failed.'});
  556. return;
  557. }
  558. let chats = {patients: [], groups: []};
  559. for (let i = 0; i < patients.length; i++) {
  560. let patient = patients[i];
  561. chats.patients.push({
  562. code: patient.code,
  563. name: patient.name,
  564. birthday: patient.birthday,
  565. sex: patient.sex,
  566. avatar: patient.photo == null ? "" : patient.photo,
  567. newMessageCount: patient.new_msg_count,
  568. lastContentType: patient.last_content_type,
  569. lastContent: patient.last_content,
  570. timestamp: objectUtil.timestampToLong(patient.timestamp)
  571. });
  572. }
  573. gmRepo.findAllGroupsWithPatient(userId, function (err, groups) {
  574. if (err) {
  575. log.error('Get group list with patient failed: ', err);
  576. res.status(500).send({message: 'Get group list with patient failed.'});
  577. return;
  578. }
  579. for (let i = 0; i < groups.length; i++) {
  580. let group = groups[i];
  581. // 过滤掉医生间的求助团队
  582. if (group.group_type === 2) continue;
  583. chats.groups.push({
  584. code: group.code,
  585. name: group.name,
  586. groupType: group.msg_type,
  587. newMessageCount: group.new_msg_count,
  588. lastContentType: group.last_content_type,
  589. lastContent: group.last_content,
  590. timestamp: objectUtil.timestampToLong(group.timestamp)
  591. });
  592. }
  593. res.status(200).send(chats);
  594. })
  595. });
  596. });
  597. /**
  598. * 获取与医生的聊天列表,包括:点对点,参与的讨论组。
  599. *
  600. * 请求URL:
  601. * /chats/list/doctor
  602. */
  603. router.get(APIv1.Chats.ListWithDoctor, function (req, res) {
  604. let userId = req.query.user_id;
  605. if (userId === null) {
  606. throw {httpStatus: 406, message: 'Missing fields.'};
  607. }
  608. // 先获取医生间的私聊
  609. pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
  610. if (err) {
  611. log.error('Get chat list with doctor failed: ', err);
  612. res.status(500).send({message: 'Get chat list with doctor failed.'});
  613. return;
  614. }
  615. let chats = {doctors: [], groups: []};
  616. for (let i = 0; i < doctors.length; i++) {
  617. let doctor = doctors[i];
  618. chats.doctors.push({
  619. code: doctor.code,
  620. name: doctor.name,
  621. sex: doctor.sex,
  622. avatar: doctor.photo === null ? "" : doctor.photo,
  623. newMessageCount: doctor.new_msg_count,
  624. lastContentType: doctor.last_content_type,
  625. lastContent: doctor.last_content,
  626. timestamp: objectUtil.timestampToLong(doctor.timestamp)
  627. });
  628. }
  629. // 再获取医生间的组
  630. gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
  631. if (err) {
  632. log.error('Get group list with doctor failed: ', err);
  633. res.status(500).send({message: 'Get group list with doctor failed.'});
  634. return;
  635. }
  636. for (let i = 0; i < groups.length; i++) {
  637. let group = groups[i];
  638. chats.groups.push({
  639. code: group.code,
  640. name: group.name,
  641. groupType: group.group_type, // 行政团队 or 求助
  642. newMessageCount: group.new_msg_count,
  643. lastContentType: group.last_content_type,
  644. lastContent: group.last_content,
  645. timestamp: objectUtil.timestampToLong(group.timestamp)
  646. });
  647. }
  648. res.status(200).send(chats);
  649. });
  650. });
  651. });
  652. /**
  653. * 获取最近聊天对象:包括患者,医生与讨论组。客户端自行根据需要提取患者、医生或讨论组数据。
  654. *
  655. * 请求URL:
  656. * /chats/recent?user_id=0de7295862dd11e69faffa163e8aee56&days=7
  657. *
  658. * 参数:
  659. * user_id: 用户ID
  660. * target_type: 对象类型,1患者,2医生,3讨论组
  661. * days: 最近天数
  662. */
  663. router.get(APIv1.Chats.Recent, function (req, res) {
  664. var userId = req.query.user_id;
  665. var days = req.query.days;
  666. if (userId === null) {
  667. throw {httpStatus: 406, message: 'Missing field: user_id'};
  668. }
  669. if (days === null) {
  670. throw {httpStatus: 406, message: 'Missing field: days'};
  671. }
  672. statsRepo.getRecentChats(userId, days, function (err, result) {
  673. if (err) {
  674. log.error('Get recent chat objects failed: ', err);
  675. res.status(500).send({message: 'Get recent chat objects failed.'});
  676. return;
  677. }
  678. var data = {patients: [], doctors: [], groups: []};
  679. if (result.length === 0) {
  680. res.status(200).send(data);
  681. return;
  682. }
  683. for (var i = 0; i < result.length; ++i) {
  684. var row = result[i];
  685. if (row.type.indexOf('patient') > -1) {
  686. data.patients.push({
  687. code: row.code,
  688. name: row.name,
  689. birthday: row.birthday === null ? "" : row.birthday,
  690. sex: row.sex,
  691. avatar: row.photo === null ? "" : row.photo
  692. });
  693. } else if (row.type.indexOf('doctor') > -1) {
  694. data.doctors.push({
  695. code: row.code,
  696. name: row.name,
  697. birthday: row.birthday === null ? "" : row.birthday,
  698. sex: row.sex,
  699. avatar: row.photo === null ? "" : row.photo
  700. });
  701. } else if (row.type.indexOf('group') > -1) {
  702. data.groups.push({
  703. code: row.code,
  704. name: row.name
  705. });
  706. }
  707. }
  708. res.status(200).send(data);
  709. });
  710. });
  711. /**
  712. * 获取私信。倒序排列。
  713. *
  714. * 参数:
  715. * user_id 必须,医生ID
  716. * peer_id 必须,对方医生ID
  717. * content_type 必须,消息类型
  718. * message_start_id 可选,消息的起始ID,如果为空从最新的一条开始获取
  719. * message_end_id 可选,消息的结束ID,如果为空从第一条开始获取
  720. * count 可选,消息数量,如果不指定、小于零或大于50,默认为100条。若message_start_id与message_end_id均不为空,则此参数无效,方法是设置为10000条
  721. * closed_interval 消息范围是否使用闭区间
  722. *
  723. * 请求URL:
  724. * /chats/pm?user_id=sand&peer_id=Rose&content_type=2&message_start_id=10000&message_end_id=0&count=20&closed_interval=false
  725. */
  726. router.get(APIv1.Chats.PM, function (req, res) {
  727. var userId = req.query.user_id;
  728. var peerId = req.query.peer_id;
  729. var contentType = req.query.content_type;
  730. var msgStartId = !req.query.message_start_id ? MAX_INT : parseInt(req.query.message_start_id);
  731. var msgEndId = !req.query.message_end_id ? 0 : parseInt(req.query.message_end_id);
  732. var count = req.query.count === undefined ? DEFAULT_PAGE_SIZE : parseInt(req.query.count);
  733. var closedInterval = (req.query.closed_interval != false && req.query.closed_interval === "true");
  734. if (contentType !== undefined && parseInt(contentType) === CONTENT_TYPES.Image) count = DEFAULT_PAGE_SIZE;
  735. if (req.query.message_start_id && req.query.message_end_id) count = 10000;
  736. if (!userId) {
  737. throw {httpStatus: 400, message: "Missing field: user_id."};
  738. }
  739. pmRepo.findAllMessages(userId, peerId, contentType === undefined ? "1,2,3,5,6" : contentType, msgStartId, msgEndId, count, closedInterval, function (err, rows) {
  740. if (err) {
  741. log.error("Get private message failed, ", err);
  742. res.status(500).send({message: "Get private messages failed."});
  743. return;
  744. }
  745. var messages = fillMessages(rows);
  746. // 清空统计信息
  747. statsRepo.clearPrivateChatSummary(userId, peerId, function (err, result) {
  748. if (err) console.log(err);
  749. });
  750. res.status(200).send(messages);
  751. });
  752. });
  753. /**
  754. * 获取未读私信。倒序排列。
  755. *
  756. * 参数:
  757. * user_id 必须,医生ID
  758. * peer_id 必须,对方医生ID
  759. *
  760. * 请求URL:
  761. * /chats/pm/unread?user_id=sand&peer_id=Rose
  762. */
  763. router.get(APIv1.Chats.PMUnread, function (req, res) {
  764. var userId = req.query.user_id;
  765. var peerId = req.query.peer_id;
  766. if (userId === undefined) {
  767. throw {httpStatus: 400, message: "Missing field: user_id."};
  768. }
  769. statsRepo.getPrivateChatSummary(userId, peerId, function (err, summary) {
  770. if (err) {
  771. log.error("Get unread private messages failed: ", err);
  772. res.status(500).send({message: "Get unread private messages failed."});
  773. return;
  774. }
  775. // 没有未读消息,直接返回
  776. if (summary.length == 0 || summary[0].new_msg_count === 0) {
  777. res.status(200).send({startId: 0, count: 0, records: []});
  778. return;
  779. }
  780. pmRepo.findUnread(peerId, userId, MAX_INT, summary[0].new_msg_count, function (err, rows) {
  781. if (err) {
  782. log.error("Get unread private messages failed: ", err);
  783. res.status(500).send({message: "Get unread private messages failed."});
  784. return;
  785. }
  786. var messages = fillMessages(rows);
  787. res.status(200).send(messages);
  788. });
  789. });
  790. });
  791. /**
  792. * 按时间倒序获取群消息。
  793. *
  794. * 参数:
  795. * user_id 必须,医生ID
  796. * group_id 必须,组ID
  797. * message_start_id 可选,消息的起始ID,如果为空从最新的一条开始获取
  798. * count 可选,消息数量,如果不指定、小于零或大于50,默认为50条
  799. *
  800. * 请求URL:
  801. * /chats/gm?user_id=D2016008240002&group_id=494&content_type=2&message_start_id=0&message_end_id=0&count=20
  802. */
  803. router.get(APIv1.Chats.GM, function (req, res) {
  804. var groupId = req.query.group_id;
  805. var userId = req.query.user_id;
  806. var contentType = req.query.content_type;
  807. var msgStartId = !req.query.message_start_id ? MAX_INT : parseInt(req.query.message_start_id);
  808. var msgEndId = !req.query.message_end_id ? 0 : parseInt(req.query.message_end_id);
  809. var count = req.query.count === undefined ? DEFAULT_PAGE_SIZE : parseInt(req.query.count);
  810. if (groupId === undefined) {
  811. throw {httpStatus: 400, message: "Missing field: group_id."};
  812. }
  813. if (contentType !== undefined && parseInt(contentType) === CONTENT_TYPES.Image) count = DEFAULT_PAGE_SIZE;
  814. if (req.query.message_start_id && req.query.message_end_id) count = 100000;
  815. gmRepo.findAllMessages(groupId, !contentType ? "1,2,3,5,6" : contentType, msgStartId, msgEndId, count, function (err, rows) {
  816. if (err) {
  817. console.log('Get group message failed: ', err);
  818. res.status(500).send({message: 'Get group message failed.'});
  819. return;
  820. }
  821. var messages = fillMessages(rows);
  822. // 清空统计信息
  823. statsRepo.clearGroupChatSummary(userId, groupId, function (err, result) {
  824. if (err) console.log(err);
  825. });
  826. res.status(200).send(messages);
  827. });
  828. });
  829. /**
  830. * 获取未读群消息。
  831. *
  832. * 请求URL:
  833. * /chats/gm/unread?group_id=discussionGroupId&user_id=sand
  834. */
  835. router.get(APIv1.Chats.GMUnread, function (req, res) {
  836. var userId = req.query.user_id;
  837. var groupId = req.query.group_id;
  838. if (userId === undefined) {
  839. throw {httpStatus: 400, message: "Missing field: user_id."};
  840. }
  841. if (groupId === undefined) {
  842. throw {httpStatus: 400, message: "Missing field: group_id."};
  843. }
  844. statsRepo.getGroupChatSummary(userId, groupId, function (err, summary) {
  845. if (err) {
  846. log.error("Get unread group messages failed: ", err);
  847. res.status(500).send({message: "Get unread group messages failed."});
  848. return;
  849. }
  850. var messages = {startId: 0, count: 0, records: []};
  851. if (summary.length == 0 || summary[0].new_msg_count === 0) {
  852. res.status(200).send(messages);
  853. return;
  854. }
  855. messages.count = summary[0].new_msg_count;
  856. gmRepo.findUnread(groupId, MAX_INT, messages.count, function (err, rows) {
  857. if (err) {
  858. log.error("Get unread group messages failed: ", err);
  859. res.status(500).send({message: "Get unread group messages failed."});
  860. return;
  861. }
  862. var messages = fillMessages(rows);
  863. res.status(200).send(messages);
  864. });
  865. });
  866. });
  867. /**
  868. * 将消息的返回结果合并成JSON。
  869. *
  870. * @param rows
  871. *
  872. * @returns {startId: 0, count: 0, records: []}
  873. */
  874. function fillMessages(rows) {
  875. var messages = {startId: rows.length > 0 ? rows[0].msg_id : '', count: rows.length, records: []};
  876. for (var i = 0; i < rows.length; i++) {
  877. var row = rows[i];
  878. var record = {
  879. id: row.msg_id,
  880. from: row.from_uid,
  881. contentType: row.type,
  882. content: row.content,
  883. timestamp: objectUtil.timestampToLong(row.timestamp)
  884. };
  885. if (row.to_uid !== undefined) record.to = row.to_uid;
  886. if (row.at_uid !== undefined) record.at = row.at_uid;
  887. messages.records.push(record);
  888. }
  889. return messages;
  890. }
  891. //--------------------------------------------------------------//
  892. //----------------------------消息统计----------------------------//
  893. //--------------------------------------------------------------//
  894. /**
  895. * 获取所有群组未读消息总数。
  896. *
  897. * 请求URL:
  898. * /chats/gm/unread_count?user_id=sand
  899. *
  900. * 参数:
  901. * user_id:医生ID
  902. */
  903. router.get(APIv1.Chats.GMUnreadCount, function (req, res) {
  904. var userId = req.query.user_id;
  905. if (userId === null) {
  906. throw {httpStatus: 406, message: 'Missing fields.'};
  907. }
  908. statsRepo.getGroupChatAllUnReadCount(userId, function (err, result) {
  909. if (err) {
  910. console.log('Get all unread messages failed: ', err);
  911. res.status(500).send({message: 'Get all unread messages failed.'});
  912. }
  913. var data = {
  914. userId: userId,
  915. messageType: 2,
  916. newMessageCount: 0
  917. };
  918. if (result.length > 0) {
  919. for (var index = 0; index < result.length; index++) {
  920. data.newMessageCount += result[index].new_msg_count;
  921. }
  922. }
  923. res.send(data);
  924. });
  925. });
  926. /**
  927. * 获取特定群组消息统计情况。
  928. *
  929. * /chats/gm/statistic?group_id=GGG&&user_id=sand
  930. *
  931. * 参数:
  932. * user_id:信息所有者id
  933. * group_id:群组id
  934. */
  935. router.get(APIv1.Chats.GMStats, function (req, res) {
  936. var userId = req.query.user_id;
  937. var groupId = req.query.group_id;
  938. if (userId === null || groupId === null) {
  939. throw {httpStatus: 406, message: 'Miss fields.'};
  940. }
  941. statsRepo.getGroupChatSummary(userId, groupId, function (err, result) {
  942. if (err) {
  943. console.log('Get group stats failed: ', err);
  944. res.status(500).send({message: 'Get group stats failed.'});
  945. return;
  946. }
  947. var data = {
  948. userId: userId,
  949. from: "",
  950. groupId: groupId,
  951. atMe: 0,
  952. lastContentType: 1,
  953. lastContent: "",
  954. newMessageCount: 0,
  955. timestamp: 0
  956. };
  957. if (result.length > 0) {
  958. var row = result[0];
  959. data.from = row.from_uid;
  960. data.groupId = row.gid;
  961. data.atMe = row.at_me;
  962. data.lastContentType = row.last_content_type;
  963. data.lastContent = row.lastContent;
  964. data.newMessageCount = row.new_msg_count;
  965. data.timestamp = objectUtil.timestampToLong(row.timestamp)
  966. }
  967. res.status(200).send(data);
  968. });
  969. });
  970. /**
  971. * 获取与某人的私信统计。
  972. *
  973. * /chats/pm/statistic?user_id=sand&&peer_id=rose
  974. *
  975. * 参数:
  976. * user_id:信息所有者id
  977. * peer_id:聊天对端id
  978. */
  979. router.get(APIv1.Chats.PMStats, function (req, res) {
  980. var userId = req.query.user_id;
  981. var peerId = req.query.peer_id;
  982. if (userId == null || peerId == null) {
  983. throw {httpStatus: 406, message: "Missing fields."};
  984. }
  985. statsRepo.getPrivateChatSummary(userId, peerId, function (err, result) {
  986. if (err) {
  987. console.log("Get private messages stats failed: ", err);
  988. res.status(500).send({message: "Get private messages stats failed."});
  989. }
  990. var data = {
  991. userId: userId,
  992. peerId: peerId,
  993. lastCContentType: 1,
  994. lastContent: "",
  995. newMessageCount: 0,
  996. timestamp: 0
  997. };
  998. if (result.length > 0) {
  999. var row = result[0];
  1000. data.userId = row.uid;
  1001. data.peerId = row.from_uid;
  1002. data.lastContentType = row.last_content_type;
  1003. data.lastContent = row.last_content;
  1004. data.newMessageCount = row.new_msg_count;
  1005. data.timestamp = objectUtil.timestampToLong(row.timestamp)
  1006. }
  1007. res.status(0).send(data);
  1008. });
  1009. });
  1010. /**
  1011. * 获取所有未读私信总数。
  1012. *
  1013. * /chats/pm/unread_count?user_id=sand
  1014. *
  1015. * 参数:
  1016. * uid:信息所有者id
  1017. */
  1018. router.get(APIv1.Chats.PMUnreadCount, function (req, res) {
  1019. var userId = req.query.user_id;
  1020. statsRepo.getPrivateChatAllUnReadCount(userId, function (err, result) {
  1021. if (err) {
  1022. console.log("Get unread private message count failed: ", err);
  1023. res.status(500).send({message: "Get unread private message count failed."});
  1024. }
  1025. var data = {userId: userId, messageType: 1, newMessageCount: 0};
  1026. if (result.length > 0) {
  1027. for (var i = 0; i < result.length; i++) {
  1028. data.newMessageCount += result[i].new_msg_count;
  1029. }
  1030. }
  1031. res.send(data);
  1032. });
  1033. });
  1034. /**
  1035. * 所有聊天消息未读数。
  1036. *
  1037. * 请求URL:
  1038. * /chats/chats/unread_count?user_id=sand
  1039. *
  1040. * 参数:
  1041. * user_id:信息所有者id
  1042. */
  1043. router.get(APIv1.Chats.UnreadMsgCount, function (req, res) {
  1044. var userId = req.query.user_id;
  1045. if (userId === null) {
  1046. throw {httpStatus: 406, message: "Missing fields."};
  1047. }
  1048. statsRepo.getChatAllUnReadCount(userId, function (err, result) {
  1049. if (err) {
  1050. console.error("Get all unread message count failed: ", err);
  1051. res.status(500).send({message: "Get all unread message count failed."});
  1052. }
  1053. var data = {userId: userId, messageType: 0, newMessageCount: 0};
  1054. if (result.length > 0) {
  1055. for (var index = 0; index < result.length; index++) {
  1056. data.newMessageCount += result[index].new_msg_count;
  1057. }
  1058. }
  1059. res.send(data);
  1060. });
  1061. });
  1062. /**
  1063. * 搜索患者相关的数据,包括患者信息与相关的私信记录。关键词不支持空格拆分。
  1064. *
  1065. * 请求URL:
  1066. * /search/patient?user_id=3b723bb8699a11e69f7c005056850d66&user_role=1&keyword=庄
  1067. *
  1068. * 参数:
  1069. * keywords: 关键词
  1070. */
  1071. router.get(APIv1.Chats.SearchAboutPatient, function (req, res) {
  1072. var userId = req.query.user_id;
  1073. var userRole = req.query.user_role;
  1074. var keyword = req.query.keyword;
  1075. if (!userId) throw {httpStatus: 406, message: "Missing fields: user_id."};
  1076. if (!userRole) throw {httpStatus: 406, message: "Missing fields: user_role."};
  1077. if (!keyword) throw {httpStatus: 406, message: "Missing fields: keyword."};
  1078. searchRepo.searchPatients(userId, userRole, keyword, function (err, patients) {
  1079. if (err) {
  1080. log.error("Search patient on basic information failed: ", err);
  1081. res.status(500).send({message: "Search patient on basic information failed."});
  1082. return;
  1083. }
  1084. var data = {patients: [], chats: []};
  1085. for (var i = 0; i < patients.length; ++i) {
  1086. var patient = patients[i];
  1087. data.patients.push({
  1088. code: patient.code,
  1089. name: patient.name,
  1090. sex: patient.sex,
  1091. birthday: objectUtil.timestampToLong(patient.birthday),
  1092. avatar: patient.photo === null ? "" : patient.photo
  1093. });
  1094. }
  1095. searchRepo.searchPatientPM(userId, keyword, function (err, chats) {
  1096. if (err) {
  1097. log.error("Search patient on private messages failed: ", err);
  1098. res.status(500).send({message: "Search patient on private messages failed."});
  1099. return;
  1100. }
  1101. var lastPatientCode = '';
  1102. var lastPatient = {code: '', name: '', sex: '', avatar: '', messages: []};
  1103. for (var i = 0; i < chats.length; ++i) {
  1104. var chat = chats[i];
  1105. if (lastPatientCode !== chat.code) {
  1106. lastPatientCode = chat.code;
  1107. lastPatient.code = chat.code;
  1108. lastPatient.name = chat.name;
  1109. lastPatient.sex = chat.sex;
  1110. lastPatient.birthday = objectUtil.timestampToLong(patient.birthday);
  1111. lastPatient.avatar = chat.photo === null ? "" : chat.photo;
  1112. data.chats.push(lastPatient);
  1113. }
  1114. lastPatient.messages.push({
  1115. id: chat.msg_id,
  1116. content: chat.content
  1117. });
  1118. }
  1119. res.status(200).send(data);
  1120. });
  1121. });
  1122. });
  1123. /**
  1124. * 搜索医生相关的数据,包括医生信息与相关的聊天记录,包括私信与群信。
  1125. *
  1126. * 请求URL:
  1127. * /search/doctor?user_id=5fa5e88f7a4111e69f7c005056850d66&keyword=丘
  1128. *
  1129. * 参数:
  1130. * keywords: 关键词
  1131. */
  1132. router.get(APIv1.Chats.SearchAboutDoctor, function (req, res) {
  1133. var userId = req.query.user_id;
  1134. var keyword = req.query.keyword;
  1135. if (!userId) throw {httpStatus: 406, message: "Missing fields: user_id."};
  1136. if (!keyword) throw {httpStatus: 406, message: "Missing fields: keyword."};
  1137. // 搜索医生
  1138. searchRepo.searchDoctors(userId, keyword, function (err, doctors) {
  1139. if (err) {
  1140. log.error("Search doctor on basic information failed: ", err);
  1141. res.status(500).send({message: "Search doctor on basic information failed."});
  1142. return;
  1143. }
  1144. var data = {doctors: [], groups: [], chats: {doctors: [], groups: []}};
  1145. for (var i = 0; i < doctors.length; ++i) {
  1146. var doctor = doctors[i];
  1147. data.doctors.push({
  1148. code: doctor.code,
  1149. name: doctor.name,
  1150. sex: doctor.sex,
  1151. avatar: doctor.photo === null ? "" : doctor.photo
  1152. });
  1153. }
  1154. // 搜索讨论组名称及成员名称
  1155. searchRepo.searchGroups(userId, keyword, function (err, groups) {
  1156. if (err) {
  1157. log.error("Search talk group failed: ", err);
  1158. res.status(500).send({message: "Search talk group failed."});
  1159. return;
  1160. }
  1161. var lastGroupCode = '';
  1162. var lastGroup = null;
  1163. for (var i = 0; i < groups.length; ++i) {
  1164. var group = groups[i];
  1165. if (lastGroupCode !== group.code) {
  1166. lastGroupCode = group.code;
  1167. lastGroup = {
  1168. code: group.code,
  1169. name: group.name,
  1170. type: GROUP_TYPE.DiscussionGroup,
  1171. members: []
  1172. };
  1173. data.groups.push(lastGroup);
  1174. }
  1175. lastGroup.members.push({
  1176. code: group.member_code,
  1177. name: group.member_name
  1178. });
  1179. }
  1180. // 搜索医生间的私信
  1181. searchRepo.searchDoctorMessages(userId, keyword, function (err, messages) {
  1182. if (err) {
  1183. log.error("Search doctor private messages failed: ", err);
  1184. res.status(500).send({message: "Search doctor private messages failed."});
  1185. return;
  1186. }
  1187. var lastDoctor;
  1188. var lastDoctorCode = '';
  1189. for (var i = 0; i < messages.length; ++i) {
  1190. var message = messages[i];
  1191. if (lastDoctorCode !== message.code) {
  1192. lastDoctorCode = message.code;
  1193. lastDoctor = {
  1194. code: message.code,
  1195. name: message.name,
  1196. photo: message.photo === null ? "" : message.photo,
  1197. messages: []
  1198. };
  1199. data.chats.doctors.push(lastDoctor);
  1200. }
  1201. lastDoctor.messages.push({
  1202. id: message.msg_id,
  1203. content: message.content
  1204. });
  1205. }
  1206. // 搜索医生间的讨论组消息
  1207. searchRepo.searchGroupMessages(userId, keyword, function (err, messages) {
  1208. if (err) {
  1209. log.error("Search doctor group messages failed: ", err);
  1210. res.status(500).send({message: "Search doctor group messages failed."});
  1211. return;
  1212. }
  1213. // g.code, g.name, gm.msg_id, gm.content
  1214. var lastGroup;
  1215. var lastGroupCode = '';
  1216. for (var i = 0; i < messages.length; ++i) {
  1217. var message = messages[i];
  1218. if (lastGroupCode !== message.code) {
  1219. lastGroupCode = message.code;
  1220. lastGroup = {
  1221. code: message.code,
  1222. name: message.name,
  1223. messages: []
  1224. };
  1225. data.chats.groups.push(lastGroup);
  1226. }
  1227. lastGroup.messages.push({
  1228. id: message.msg_id,
  1229. content: message.content
  1230. });
  1231. }
  1232. res.status(200).send(data);
  1233. });
  1234. });
  1235. });
  1236. });
  1237. });
  1238. /**
  1239. * 获取单条消息。
  1240. *
  1241. * URL:
  1242. * /chats/message?id=1234&type=1
  1243. */
  1244. router.get(APIv1.Chats.Message, function (req, res) {
  1245. var messageId = req.query.id;
  1246. var messageType = req.query.type;
  1247. // 私信
  1248. if (messageType == 1) {
  1249. pmRepo.findOneMessage(messageId, function (err, result) {
  1250. if (err) {
  1251. log.error("Get message failed: ", err);
  1252. res.status(500).send({message: "Get message failed."});
  1253. return;
  1254. }
  1255. if (result.length == 0) {
  1256. res.status(404).send({message: "Message not found."});
  1257. return;
  1258. }
  1259. res.status(200).send({
  1260. id: result[0].msg_id,
  1261. from: result[0].from_uid,
  1262. to: result[0].to_uid,
  1263. contentType: result[0].type,
  1264. content: result[0].content,
  1265. timestamp: objectUtil.timestampToLong(result[0].timestamp)
  1266. });
  1267. })
  1268. } else {
  1269. gmRepo.findOneMessage(messageId, function (err, result) {
  1270. if (err) {
  1271. log.error("Get message failed: ", err);
  1272. res.status(500).send({message: "Get message failed."});
  1273. return;
  1274. }
  1275. if (result.length == 0) {
  1276. res.status(404).send({message: "Message not found."});
  1277. return;
  1278. }
  1279. res.status(200).send({
  1280. id: result[0].msg_id,
  1281. from: result[0].from_uid,
  1282. at: result[0].at_uid,
  1283. groupId: result[0].to_gid,
  1284. contentType: result[0].type,
  1285. content: result[0].content,
  1286. timestamp: objectUtil.timestampToLong(result[0].timestamp)
  1287. });
  1288. });
  1289. }
  1290. });
  1291. /**
  1292. * 判断当前会话是否已经结束。
  1293. *
  1294. * 请求URL:
  1295. * /chats/pm/finished?user_id=sand&peer_id=rose
  1296. */
  1297. router.get(APIv1.Chats.PMFinished, function (req, res) {
  1298. var doctorId = req.query.doctor_id;
  1299. var patientId = req.query.patient_id;
  1300. if (!doctorId) {
  1301. throw {httpStatus: 406, message: "Missing field: doctor_id"};
  1302. }
  1303. if (!patientId) {
  1304. throw {httpStatus: 406, message: "Missing field: patient_id"};
  1305. }
  1306. pmRepo.isCurrentSessionFinished(doctorId, patientId, function (err, result) {
  1307. if (err) {
  1308. log.error("Get session finish status failed: ", err);
  1309. throw {httpStatus: 500, message: "Get session finish status failed."};
  1310. }
  1311. var data = {finished: true, consultId: ''};
  1312. if (result.length > 0) {
  1313. var finishRow = result[0];
  1314. data.finished = finishRow.finished === 1;
  1315. if (!data.finished) {
  1316. data.consultId = finishRow.consult_id;
  1317. }
  1318. }
  1319. res.status(200).send(data);
  1320. })
  1321. });
  1322. module.exports = router;