search.repo.js 10.0 KB

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