search.repo.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. 'use strict';
  2. let ImDb = require('../oracle/db/im.db');
  3. let async = require("async");
  4. let ObjectUtil = require("../../util/object.util.js");
  5. let vsprintf = require("sprintf-js").vsprintf;
  6. const DB_TABLES = require('../../include/commons').DB_TABLES;
  7. class SearchRepo {
  8. constructor() {
  9. }
  10. /**
  11. * 查询正常会话及议题已结束的会话(P2P, MUC)
  12. *
  13. * @param userId
  14. * @param handler
  15. */
  16. static findTopicEndedSessionIdList(userId, handler) {
  17. let sql = "SELECT S.ID " +
  18. "FROM sessions s, topics t, participants p " +
  19. "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " +
  20. " UNION " +
  21. "SELECT S.ID " +
  22. "FROM SESSIONS S, PARTICIPANTS P " +
  23. "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2, 3, 4)";
  24. ImDb.execQuery({
  25. sql: sql,
  26. args: [userId, userId],
  27. handler: handler
  28. });
  29. }
  30. /**
  31. * 查询正常会话及议题已结束的会话(P2P, MUC)
  32. *
  33. * @param userId
  34. * @param handler
  35. */
  36. static findTopicActiveSessionIdList(userId, handler) {
  37. let sql = "SELECT S.ID " +
  38. "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " +
  39. "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.ID = T.SESSION_ID AND T.END_MESSAGE_ID IS NULL AND S.`TYPE` IN (1,2,8) " +
  40. " UNION " +
  41. "SELECT S.ID " +
  42. "FROM SESSIONS S, PARTICIPANTS P " +
  43. "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2,3,4) AND S.ID NOT IN(" +
  44. " SELECT DISTINCT P1.SESSION_ID FROM PARTICIPANTS P1 ,TOPICS T WHERE P1.PARTICIPANT_ID = ? AND T.SESSION_ID = P1.SESSION_ID " +
  45. ") ";
  46. ImDb.execQuery({
  47. sql: sql,
  48. args: [userId, userId,userId],
  49. handler: handler
  50. });
  51. }
  52. /**
  53. * 全部搜索
  54. *
  55. * @param sessionIdList
  56. * @param keyword
  57. * @param userTable
  58. * @param handler
  59. */
  60. static searchAll(sessionIdList,userId, keyword, userTable, handler) {
  61. let data = {};
  62. async.waterfall([
  63. function (callback) {
  64. SearchRepo.searchUser(sessionIdList,userId, keyword, userTable, 0, 4, function (err, res) {
  65. if (err) return handler(err, null);
  66. let buffer = SearchRepo.userForge(res);
  67. data.users = buffer;
  68. callback(null);
  69. });
  70. },
  71. function (callback) {
  72. SearchRepo.searchSessions(sessionIdList,userId, keyword, 0, 4, function (err, res) {
  73. if (err) return handler(err, null);
  74. data.sessions = SearchRepo.sessionForge(res, keyword);
  75. callback(null);
  76. })
  77. },
  78. function (callback) {
  79. SearchRepo.searchMessages(sessionIdList,userId, keyword, 0, 4, function (err, res) {
  80. if (err) return handler(err, null);
  81. data.messages = SearchRepo.messageForge(res);
  82. handler(null, data);
  83. })
  84. }
  85. ]);
  86. }
  87. /**
  88. * 用户搜索
  89. *
  90. * @param sessionIdList
  91. * @param keyword
  92. * @param userTable
  93. * @param page
  94. * @param size
  95. * @param handler
  96. */
  97. static searchUser(sessionIdList,userId, keyword, userTable, page, size, handler) {
  98. let sql = "SELECT DISTINCT U.NAME USER_NAME,S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE, U.ID USER_ID,U.SEX, U.BIRTHDATE, U.AVATAR,U.IDCARD %S " +
  99. " FROM PARTICIPANTS P, " + userTable +
  100. " U,SESSIONS S WHERE S.ID IN (?) AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = U.ID AND P.PARTICIPANT_ID<>? AND (U.NAME LIKE ? OR U.IDCARD LIKE ?) ";
  101. if (userTable === DB_TABLES.Doctors) {
  102. sql += " AND S.TYPE = 2 AND S.BUSINESS_TYPE = 1 ";
  103. }else{
  104. sql += " AND S.TYPE IN (1,2,8) AND S.BUSINESS_TYPE = 2 ";
  105. }
  106. sql += " LIMIT ?, ? ";
  107. sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', HOSPITAL_NAME' : '']);
  108. keyword = '%' + keyword + '%';
  109. ImDb.execQuery({
  110. sql: sql,
  111. args: [sessionIdList,userId, keyword,keyword, page * size, size],
  112. handler: handler
  113. });
  114. }
  115. /**
  116. * 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。
  117. */
  118. static searchSessions(sessionIdList,userId, keyword, page, size, handler) {
  119. if (sessionIdList.length == 0) {
  120. return handler(null, []);
  121. }
  122. let sql = "SELECT * FROM(" +
  123. "SELECT S.ID, S.NAME, S.TYPE, S.CREATE_DATE, S.BUSINESS_TYPE,GROUP_CONCAT(U. NAME) AS PARTICIPANT_NAME " +
  124. "FROM SESSIONS S, DOCTORS U ,PARTICIPANTS P " +
  125. "WHERE S.ID IN (?) AND S.TYPE IN (3,4) AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = U.ID AND P.PARTICIPANT_ID<>? AND (U.NAME LIKE ? OR S.NAME LIKE ?) GROUP BY S.ID " +
  126. ") X LIMIT ?, ?";
  127. keyword = '%' + keyword + '%';
  128. ImDb.execQuery({
  129. sql: sql,
  130. args: [sessionIdList,userId, keyword,keyword, page * size, size],
  131. handler: handler
  132. });
  133. }
  134. /**
  135. * 消息搜索
  136. */
  137. static searchMessages(sessionIdList,userId, keyword, page, size, handler) {
  138. let sql = "SELECT * FROM(" +
  139. "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " +
  140. "FROM SESSIONS S, MUC_MESSAGES M " +
  141. "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 1 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " +
  142. " UNION " +
  143. "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " +
  144. "FROM SESSIONS S, P2P_MESSAGES M " +
  145. "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 2 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " +
  146. " UNION " +
  147. "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " +
  148. "FROM SESSIONS S, GROUP_MESSAGES M " +
  149. "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` IN (3,5) AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? ) X " +
  150. "ORDER BY X.SESSION_ID, X.MESSAGE_ID LIMIT ?, ?";
  151. keyword = '%' + keyword + '%';
  152. ImDb.execQuery({
  153. sql: sql,
  154. args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size],
  155. handler: handler
  156. });
  157. }
  158. static userForge(res) {
  159. res.forEach(function (user) {
  160. if (!user.avatar) user.avatar = "";
  161. user.birthdate = user.birthdate ? user.birthdate.getTime():"";
  162. });
  163. return res;
  164. }
  165. static sessionForge(res, keyword) {
  166. let result = [];
  167. let lastSessionId = null;
  168. let tempSession = null;
  169. res.forEach(function (session) {
  170. if (session.id !== lastSessionId) {
  171. lastSessionId = session.id;
  172. tempSession = {
  173. id: session.id,
  174. name: session.name,
  175. type: session.type,
  176. business_type: session.business_type,
  177. /*create_date: ObjectUtil.timestampToLong(session.create_date),*/
  178. members: []
  179. };
  180. result.push(tempSession);
  181. }
  182. if (session.participant_name.indexOf(keyword) >= 0) tempSession.members.push({name: session.participant_name});
  183. });
  184. return result;
  185. }
  186. static messageForge(res) {
  187. let result = [];
  188. let lastSessionId = null;
  189. let session = null;
  190. res.forEach(function (message) {
  191. if (message.session_id !== lastSessionId) {
  192. lastSessionId = message.session_id;
  193. session = {
  194. session_id: message.session_id,
  195. session_name: message.session_name,
  196. session_type: message.session_type,
  197. /*session_business_type: message.session_business_type,*/
  198. messages: []
  199. };
  200. result.push(session);
  201. }
  202. session.messages.push({
  203. id: message.message_id,
  204. sender_id: message.sender_id,
  205. sender_name: message.sender_name,
  206. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  207. content: message.content
  208. });
  209. });
  210. return result;
  211. }
  212. }
  213. module.exports = SearchRepo;