| 
					
				 | 
			
			
				@ -3,6 +3,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let ImDb = require('../mysql/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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -30,7 +31,6 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [userId, userId], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -42,39 +42,33 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchAll(sessionIdList, keyword, userTable, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let data = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    let buffer = SearchRepo.userForge(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    userTable == DB_TABLES.Doctors ? data.doctors = buffer : data.patients = buffer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (data, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                SearchRepo.searchSessions(sessionIdList, keyword, userTable, 0, 3, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) return handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    data.sessions = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    data.sessions = SearchRepo.sessionForge(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    callback(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (data, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    data.messages = SearchRepo.messageForge(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(null, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -93,9 +87,11 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    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 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "SELECT DISTINCT u.id, u.name, u.sex, u.birthdate, u.avatar %s 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 ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', hospital_name' : '']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -105,19 +101,22 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 会话搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchSessions(sessionIdList, keyword, page, size, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(sessionIdList.length == 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static searchSessions(sessionIdList, keyword, userTable, 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 ?, ? "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type, u.name participant_name " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "FROM sessions s, participants p, " + userTable + " u " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "WHERE s.id IN (?) AND s.id = p.session_id AND p.participant_id = u.id AND (s.name LIKE ? or u.name like ?) " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "GROUP by s.id LIMIT ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            sql: sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [sessionIdList, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            args: [sessionIdList, keyword, keyword, page * size, size], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -129,16 +128,16 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        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" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "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 ? GROUP BY s.id" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "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` = 3 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id) X " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "ORDER BY X.timestamp"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 3 AND m.content_type = 1 AND m.content LIKE ? ) X " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "ORDER BY X.session_id, X.message_id LIMIT ?, ?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        keyword = '%' + keyword + '%'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ImDb.execQuery({ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -147,6 +146,55 @@ class SearchRepo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            handler: handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static userForge(res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        res.forEach(function (user) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!user.avatar) user.avatar = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            user.birthdate = user.birthdate ? ObjectUtil.timestampToLong(user.birthdate) : ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    static sessionForge(res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        res.forEach(function (session) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            session.create_date = ObjectUtil.timestampToLong(session.timestamp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				module.exports = SearchRepo; 
			 |