| 
					
				 | 
			
			
				@ -1,81 +1,149 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 搜索。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				"use strict"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				'use strict'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let ImDb = require('../mysql/db/im.db'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let async = require("async"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				var ObjectUtil = require("../../util/object.util.js"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				const DB_TABLES = require('../../include/commons').DB_TABLES; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    constructor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchDoctors(keyword, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(page<=0)page = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        page = (page-1)*size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "select d.id, d.name, d.sex, d.birthdate, d.avatar, d.level from doctors d where d.name like ? limit ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 查询正常会话及议题已结束的会话(P2P, MUC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static findTopicEndedSessionIdList(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 NOT NULL AND s.`type` IN (1) " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            " 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)"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: ['%' + keyword + '%',page , size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [userId, userId], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 搜索会话。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 全部搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * TODO: 还需要联合搜索包含特定用户的会话。当前只实现了按会话名称搜索。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sessionIdList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param keyword 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userTable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchAll(sessionIdList, keyword, userTable, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        async.waterfall([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                SearchRepo.searchUser(sessionIdList, keyword, userTable, 0, 3, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) return handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    let data = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (userTable == DB_TABLES.Doctors) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        data.doctors = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        data.patients = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (data, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) return handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    data.sessions = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (data, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                SearchRepo.searchMessages(sessionIdList, keyword, 0, 3, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) return handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    res.forEach(function (message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.timestamp = ObjectUtil.timestampToLong(message.timestamp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    data.messages = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 用户搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sessionIdList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param keyword 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userTable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param page 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchSessions(userId, keyword, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "select s.id, s.name, s.type, s.create_date, s.business_type," + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "(SELECT group_concat(d.name) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id and d.name like ?) as members," + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "(SELECT group_concat(d.avatar) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id) as images from sessions s" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            " where s.id in (select id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "and s.type <> 0 and s.name like ? limit ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchUser(sessionIdList, keyword, userTable, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "SELECT u.id, u.name, u.sex, u.avatar FROM sessions s, participants p, " + userTable + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            " u WHERE s.id in (?) AND s.id = p.session_id AND p.participant_id = u.id AND u.name like ? limit ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [ '%' + keyword + '%',userId, '%' + keyword + '%', page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [sessionIdList, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 搜索会话消息。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param keyword 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param page 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 会话搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchSessions(sessionIdList, keyword, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(sessionIdList.length == 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return handler(null, []); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type FROM sessions s WHERE s.id in (?) AND s.name LIKE ? LIMIT ?, ? "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [sessionIdList, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 消息搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchMessages(userId, keyword, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "SELECT * FROM( " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "FROM sessions s, participants p, muc_messages m " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         "UNION " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "FROM sessions s, participants p, group_messages m " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "UNION " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "FROM sessions s, participants p, p2p_messages m " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ") X LIMIT ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchMessages(sessionIdList, 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 ? GROUP BY s.id" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            " 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 ? GROUP BY s.id" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            " 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` = 3 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id) X " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "ORDER BY X.timestamp"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [userId, keyword, userId, keyword, userId, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 |