search.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * 患者、讨论组搜索。
  3. *
  4. * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用Solr或Elastic Search
  5. * 为数据提供索引功能,JS使用搜索接口搜索之后再取得对象的ID进行获取,提高效率。
  6. * 后续开发都希望看到这段注释,实现此方案。
  7. *
  8. * author: Sand
  9. * since: 2016.11.20
  10. */
  11. "use strict";
  12. let BaseModel = require('./base.model');
  13. let searchRepo = require('../repository/search.repo');
  14. let modelUtil = require("../util/modelUtil");
  15. let objectUtil = require('../util/objectUtil');
  16. class Search extends BaseModel{
  17. constructor() {
  18. super();
  19. }
  20. /**
  21. * 搜索患者相关的数据,包括患者信息与相关的私信记录。关键词不支持空格拆分。
  22. */
  23. searchAboutPatient(userId, userRole, keyword) {
  24. let self = this;
  25. searchRepo.searchPatients(userId, userRole, keyword, function (err, patients) {
  26. if (err) {
  27. modelUtil.emitDbError(self.eventEmitter, "Search patient on basic information failed", err);
  28. return;
  29. }
  30. let data = {patients: [], chats: []};
  31. for (let i = 0; i < patients.length; ++i) {
  32. let patient = patients[i];
  33. data.patients.push({
  34. code: patient.code,
  35. name: patient.name,
  36. sex: patient.sex,
  37. birthday: objectUtil.timestampToLong(patient.birthday),
  38. avatar: patient.photo === null ? "" : patient.photo
  39. });
  40. }
  41. searchRepo.searchPatientPM(userId, keyword, function (err, chats) {
  42. if (err) {
  43. modelUtil.emitDbError(self.eventEmitter, "Search patient on private messages failed", err);
  44. return;
  45. }
  46. let lastPatientCode = '';
  47. let lastPatient = {code: '', name: '', sex: '', avatar: '', messages: []};
  48. for (let i = 0; i < chats.length; ++i) {
  49. let chat = chats[i];
  50. if (lastPatientCode !== chat.code) {
  51. lastPatientCode = chat.code;
  52. lastPatient.code = chat.code;
  53. lastPatient.name = chat.name;
  54. lastPatient.sex = chat.sex;
  55. lastPatient.birthday = objectUtil.timestampToLong(patient.birthday);
  56. lastPatient.avatar = chat.photo === null ? "" : chat.photo;
  57. data.chats.push(lastPatient);
  58. }
  59. lastPatient.messages.push({
  60. id: chat.msg_id,
  61. content: chat.content
  62. });
  63. }
  64. modelUtil.emitData(self.eventEmitter, data);
  65. });
  66. });
  67. }
  68. /**
  69. * 搜索医生相关的数据,包括医生信息与相关的聊天记录,包括私信与群信。
  70. */
  71. searchAboutDoctor() {
  72. let self = this;
  73. searchRepo.searchDoctors(userId, keyword, function (err, doctors) {
  74. if (err) {
  75. modelUtil.emitDbError(self.eventEmitter, "Search doctor on basic information failed", err);
  76. return;
  77. }
  78. let data = {doctors: [], groups: [], chats: {doctors: [], groups: []}};
  79. for (let i = 0; i < doctors.length; ++i) {
  80. let doctor = doctors[i];
  81. data.doctors.push({
  82. code: doctor.code,
  83. name: doctor.name,
  84. sex: doctor.sex,
  85. avatar: doctor.photo === null ? "" : doctor.photo
  86. });
  87. }
  88. // 搜索讨论组名称及成员名称
  89. searchRepo.searchGroups(userId, keyword, function (err, groups) {
  90. if (err) {
  91. modelUtil.emitDbError(self.eventEmitter, "Search talk group failed", err);
  92. return;
  93. }
  94. let lastGroupCode = '';
  95. let lastGroup = null;
  96. for (let i = 0; i < groups.length; ++i) {
  97. let group = groups[i];
  98. if (lastGroupCode !== group.code) {
  99. lastGroupCode = group.code;
  100. lastGroup = {
  101. code: group.code,
  102. name: group.name,
  103. type: GROUP_TYPE.DiscussionGroup,
  104. members: []
  105. };
  106. data.groups.push(lastGroup);
  107. }
  108. lastGroup.members.push({
  109. code: group.member_code,
  110. name: group.member_name
  111. });
  112. }
  113. // 搜索医生间的私信
  114. searchRepo.searchDoctorMessages(userId, keyword, function (err, messages) {
  115. if (err) {
  116. modelUtil.emitDbError(self.eventEmitter, "Search doctor private messages failed", err);
  117. return;
  118. }
  119. let lastDoctor;
  120. let lastDoctorCode = '';
  121. for (let i = 0; i < messages.length; ++i) {
  122. let message = messages[i];
  123. if (lastDoctorCode !== message.code) {
  124. lastDoctorCode = message.code;
  125. lastDoctor = {
  126. code: message.code,
  127. name: message.name,
  128. photo: message.photo === null ? "" : message.photo,
  129. messages: []
  130. };
  131. data.chats.doctors.push(lastDoctor);
  132. }
  133. lastDoctor.messages.push({
  134. id: message.msg_id,
  135. content: message.content
  136. });
  137. }
  138. // 搜索医生间的讨论组消息
  139. searchRepo.searchGroupMessages(userId, keyword, function (err, messages) {
  140. if (err) {
  141. modelUtil.emitDbError(self.eventEmitter, "Search doctor group messages failed", err);
  142. return;
  143. }
  144. // g.code, g.name, gm.msg_id, gm.content
  145. let lastGroup;
  146. let lastGroupCode = '';
  147. for (let i = 0; i < messages.length; ++i) {
  148. let message = messages[i];
  149. if (lastGroupCode !== message.code) {
  150. lastGroupCode = message.code;
  151. lastGroup = {
  152. code: message.code,
  153. name: message.name,
  154. messages: []
  155. };
  156. data.chats.groups.push(lastGroup);
  157. }
  158. lastGroup.messages.push({
  159. id: message.msg_id,
  160. content: message.content
  161. });
  162. }
  163. modelUtil.emitData(self.eventEmitter, data);
  164. });
  165. });
  166. });
  167. });
  168. }
  169. }