123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- 'use strict';
- let ImDb = require('../oracle/db/im.db');
- let async = require("async");
- let ObjectUtil = require("../../util/object.util.js");
- let vsprintf = require("sprintf-js").vsprintf;
- const DB_TABLES = require('../../include/commons').DB_TABLES;
- class SearchRepo {
- constructor() {
- }
- /**
- * 查询正常会话及议题已结束的会话(P2P, MUC)
- *
- * @param userId
- * @param handler
- */
- static findTopicEndedSessionIdList(userId, handler) {
- let sql = "SELECT S.ID " +
- "FROM sessions s, topics t, participants p " +
- "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " +
- " UNION " +
- "SELECT S.ID " +
- "FROM SESSIONS S, PARTICIPANTS P " +
- "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2, 3, 4)";
- ImDb.execQuery({
- sql: sql,
- args: [userId, userId],
- handler: handler
- });
- }
- /**
- * 查询正常会话及议题已结束的会话(P2P, MUC)
- *
- * @param userId
- * @param handler
- */
- static findTopicActiveSessionIdList(userId, handler) {
- let sql = "SELECT S.ID " +
- "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " +
- "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) " +
- " UNION " +
- "SELECT S.ID " +
- "FROM SESSIONS S, PARTICIPANTS P " +
- "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2,3,4) AND S.ID NOT IN(" +
- " SELECT DISTINCT P1.SESSION_ID FROM PARTICIPANTS P1 ,TOPICS T WHERE P1.PARTICIPANT_ID = ? AND T.SESSION_ID = P1.SESSION_ID " +
- ") ";
- ImDb.execQuery({
- sql: sql,
- args: [userId, userId,userId],
- handler: handler
- });
- }
- /**
- * 全部搜索
- *
- * @param sessionIdList
- * @param keyword
- * @param userTable
- * @param handler
- */
- static searchAll(sessionIdList,userId, keyword, userTable, handler) {
- let data = {};
- async.waterfall([
- function (callback) {
- SearchRepo.searchUser(sessionIdList,userId, keyword, userTable, 0, 4, function (err, res) {
- if (err) return handler(err, null);
- let buffer = SearchRepo.userForge(res);
- data.users = buffer;
- callback(null);
- });
- },
- function (callback) {
- SearchRepo.searchSessions(sessionIdList,userId, keyword, 0, 4, function (err, res) {
- if (err) return handler(err, null);
- data.sessions = SearchRepo.sessionForge(res, keyword);
- callback(null);
- })
- },
- function (callback) {
- SearchRepo.searchMessages(sessionIdList,userId, keyword, 0, 4, function (err, res) {
- if (err) return handler(err, null);
- data.messages = SearchRepo.messageForge(res);
- handler(null, data);
- })
- }
- ]);
- }
- /**
- * 用户搜索
- *
- * @param sessionIdList
- * @param keyword
- * @param userTable
- * @param page
- * @param size
- * @param handler
- */
- static searchUser(sessionIdList,userId, keyword, userTable, page, size, handler) {
- 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 " +
- " FROM PARTICIPANTS P, " + userTable +
- " 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 ?) ";
- if (userTable === DB_TABLES.Doctors) {
- sql += " AND S.TYPE = 2 AND S.BUSINESS_TYPE = 1 ";
- }else{
- sql += " AND S.TYPE IN (1,2,8) AND S.BUSINESS_TYPE = 2 ";
- }
- sql += " LIMIT ?, ? ";
- sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', HOSPITAL_NAME' : '']);
- keyword = '%' + keyword + '%';
- ImDb.execQuery({
- sql: sql,
- args: [sessionIdList,userId, keyword,keyword, page * size, size],
- handler: handler
- });
- }
- /**
- * 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。
- */
- static searchSessions(sessionIdList,userId, keyword, page, size, handler) {
- if (sessionIdList.length == 0) {
- return handler(null, []);
- }
- let sql = "SELECT * FROM(" +
- "SELECT S.ID, S.NAME, S.TYPE, S.CREATE_DATE, S.BUSINESS_TYPE,GROUP_CONCAT(U. NAME) AS PARTICIPANT_NAME " +
- "FROM SESSIONS S, DOCTORS U ,PARTICIPANTS P " +
- "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 " +
- ") X LIMIT ?, ?";
- keyword = '%' + keyword + '%';
- ImDb.execQuery({
- sql: sql,
- args: [sessionIdList,userId, keyword,keyword, page * size, size],
- handler: handler
- });
- }
- /**
- * 消息搜索
- */
- static searchMessages(sessionIdList,userId, keyword, page, size, handler) {
- let sql = "SELECT * FROM(" +
- "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 " +
- "FROM SESSIONS S, MUC_MESSAGES M " +
- "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 1 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " +
- " UNION " +
- "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 " +
- "FROM SESSIONS S, P2P_MESSAGES M " +
- "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 2 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " +
- " UNION " +
- "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 " +
- "FROM SESSIONS S, GROUP_MESSAGES M " +
- "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 " +
- "ORDER BY X.SESSION_ID, X.MESSAGE_ID LIMIT ?, ?";
- keyword = '%' + keyword + '%';
- ImDb.execQuery({
- sql: sql,
- args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size],
- handler: handler
- });
- }
- static userForge(res) {
- res.forEach(function (user) {
- if (!user.avatar) user.avatar = "";
- user.birthdate = user.birthdate ? user.birthdate.getTime():"";
- });
- return res;
- }
- static sessionForge(res, keyword) {
- let result = [];
- let lastSessionId = null;
- let tempSession = null;
- res.forEach(function (session) {
- if (session.id !== lastSessionId) {
- lastSessionId = session.id;
- tempSession = {
- id: session.id,
- name: session.name,
- type: session.type,
- business_type: session.business_type,
- /*create_date: ObjectUtil.timestampToLong(session.create_date),*/
- members: []
- };
- result.push(tempSession);
- }
- if (session.participant_name.indexOf(keyword) >= 0) tempSession.members.push({name: session.participant_name});
- });
- return result;
- }
- static messageForge(res) {
- let result = [];
- let lastSessionId = null;
- let session = null;
- res.forEach(function (message) {
- if (message.session_id !== lastSessionId) {
- lastSessionId = message.session_id;
- session = {
- session_id: message.session_id,
- session_name: message.session_name,
- session_type: message.session_type,
- /*session_business_type: message.session_business_type,*/
- messages: []
- };
- result.push(session);
- }
- session.messages.push({
- id: message.message_id,
- sender_id: message.sender_id,
- sender_name: message.sender_name,
- timestamp: ObjectUtil.timestampToLong(message.timestamp),
- content: message.content
- });
- });
- return result;
- }
- }
- module.exports = SearchRepo;
|