|
@ -4,7 +4,6 @@
|
|
"use strict";
|
|
"use strict";
|
|
|
|
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var util = require('util');
|
|
|
|
|
|
|
|
var log = require("../util/log.js");
|
|
var log = require("../util/log.js");
|
|
var modelUtil = require('../util/modelUtil');
|
|
var modelUtil = require('../util/modelUtil');
|
|
@ -21,385 +20,372 @@ var MODEL_EVENTS = require('../include/commons').MODEL_EVENTS;
|
|
var CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
|
|
var CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
|
|
var PLATFORMS = require('../include/commons').PLATFORM;
|
|
var PLATFORMS = require('../include/commons').PLATFORM;
|
|
|
|
|
|
function Doctor(){
|
|
|
|
EventEmitter.call(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 向医生发送消息。
|
|
|
|
*
|
|
|
|
* @param message
|
|
|
|
*/
|
|
|
|
Doctor.prototype.sendMessage = function(message){
|
|
|
|
var self = this;
|
|
|
|
userRepo.isExist(message.to, function (err, rows) {
|
|
|
|
if (err) {
|
|
|
|
modelUtil.emitDbError(self, 'Lookup receiving users failed', err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rows.length == 0) {
|
|
|
|
self.emit(MODEL_EVENTS.DataNotFound, {});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
class Doctor{
|
|
|
|
constructor(){
|
|
|
|
this._eventEmitter = new EventEmitter();
|
|
|
|
}
|
|
|
|
|
|
// 保存消息
|
|
|
|
var tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content;
|
|
|
|
pmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
|
|
|
|
|
|
/**
|
|
|
|
* 向医生发送消息。
|
|
|
|
*
|
|
|
|
* @param message
|
|
|
|
*/
|
|
|
|
sendMessage(message){
|
|
|
|
var self = this;
|
|
|
|
userRepo.isExist(message.to, function (err, rows) {
|
|
if (err) {
|
|
if (err) {
|
|
modelUtil.emitDbError(self, 'Save private message failed.', err);
|
|
|
|
|
|
modelUtil.emitDbError(self, 'Lookup receiving users failed', err);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
// 返回发送成功后的消息记录,控制器可选择结束网络连接
|
|
|
|
pmRepo.findOneMessage(result.insertId, function (err, msg) {
|
|
|
|
if (err) {
|
|
|
|
modelUtil.emitDbError(self, 'Save private message success, but return last message failed.', err);
|
|
|
|
} else {
|
|
|
|
self.emit(MODEL_EVENTS.OK, fillMessages(msg));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 更新自身的聊天统计信息
|
|
|
|
statsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
|
|
|
|
if (err) modelUtil.logDbError(null, err);
|
|
|
|
});
|
|
|
|
|
|
|
|
// 更新对端的聊天统计信息
|
|
|
|
statsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
|
|
|
|
if (err) modelUtil.logDbError(null, err);
|
|
|
|
});
|
|
|
|
|
|
if (rows.length == 0) {
|
|
|
|
self.emit(MODEL_EVENTS.DataNotFound, {});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
// 获取对方状态,即对端的系统平台,token等信息,并推送通知消息给对端
|
|
|
|
userRepo.getUserStatus(message.to, function (err, result) {
|
|
|
|
|
|
// 保存消息
|
|
|
|
var tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content;
|
|
|
|
pmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
|
|
if (err) {
|
|
if (err) {
|
|
modelUtil.logDbError('Get target user status for private message failed: ' + message.to, err);
|
|
|
|
|
|
modelUtil.emitDbError(self, 'Save private message failed.', err);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
// 构建通知消息
|
|
|
|
var title = '新消息';
|
|
|
|
var content = '';
|
|
|
|
if (message.contentType === CONTENT_TYPES.PlainText) {
|
|
|
|
content = message.content;
|
|
|
|
} else if (message.contentType === CONTENT_TYPES.Image) {
|
|
|
|
content = '[图片]';
|
|
|
|
} else if (message.contentType === CONTENT_TYPES.Audio) {
|
|
|
|
content = '[语音]';
|
|
|
|
} else {
|
|
|
|
content = '接收到一条新消息';
|
|
|
|
}
|
|
|
|
|
|
|
|
var isOnline = false;
|
|
|
|
var target;
|
|
|
|
if (result.length > 0) {
|
|
|
|
target = result[0];
|
|
|
|
if (target.is_online) {
|
|
|
|
isOnline = true;
|
|
|
|
|
|
// 返回发送成功后的消息记录,控制器可选择结束网络连接
|
|
|
|
pmRepo.findOneMessage(result.insertId, function (err, msg) {
|
|
|
|
if (err) {
|
|
|
|
modelUtil.emitDbError(self, 'Save private message success, but return last message failed.', err);
|
|
|
|
} else {
|
|
|
|
self.emit(MODEL_EVENTS.OK, fillMessages(msg));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
var notifyMessage = JSON.stringify({type: 'p2p_msg', from_uid: message.from});
|
|
|
|
|
|
// 更新自身的聊天统计信息
|
|
|
|
statsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
|
|
|
|
if (err) modelUtil.logDbError(null, err);
|
|
|
|
});
|
|
|
|
|
|
// 保存通知消息到数据库中并根据用户在线状态推送此消息
|
|
|
|
nmRepo.save(message.to, message.contentType, title, content, notifyMessage, isOnline, function (err, result) {
|
|
|
|
|
|
// 更新对端的聊天统计信息
|
|
|
|
statsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
|
|
|
|
if (err) modelUtil.logDbError(null, err);
|
|
|
|
});
|
|
|
|
|
|
|
|
// 获取对方状态,即对端的系统平台,token等信息,并推送通知消息给对端
|
|
|
|
userRepo.getUserStatus(message.to, function (err, result) {
|
|
if (err) {
|
|
if (err) {
|
|
log.error('Save private notify message failed, ', err);
|
|
|
|
|
|
modelUtil.logDbError('Get target user status for private message failed: ' + message.to, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 构建通知消息
|
|
|
|
var title = '新消息';
|
|
|
|
var content = '';
|
|
|
|
if (message.contentType === CONTENT_TYPES.PlainText) {
|
|
|
|
content = message.content;
|
|
|
|
} else if (message.contentType === CONTENT_TYPES.Image) {
|
|
|
|
content = '[图片]';
|
|
|
|
} else if (message.contentType === CONTENT_TYPES.Audio) {
|
|
|
|
content = '[语音]';
|
|
} else {
|
|
} else {
|
|
if (isOnline === true) {
|
|
|
|
if (target.platform === PLATFORMS.iOS) {
|
|
|
|
getui.pushAPN(message.to,
|
|
|
|
target.token,
|
|
|
|
message.contentType,
|
|
|
|
title,
|
|
|
|
content,
|
|
|
|
notifyMessage,
|
|
|
|
function (err, result) {
|
|
|
|
if (err != null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (target.platform === PLATFORMS.Android) {
|
|
|
|
getui.pushAndroid(target.client_id,
|
|
|
|
message.contentType,
|
|
|
|
title,
|
|
|
|
content,
|
|
|
|
notifyMessage,
|
|
|
|
target.status,
|
|
|
|
function (err, result) {
|
|
|
|
if (err != null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
content = '接收到一条新消息';
|
|
|
|
}
|
|
|
|
|
|
|
|
var isOnline = false;
|
|
|
|
var target;
|
|
|
|
if (result.length > 0) {
|
|
|
|
target = result[0];
|
|
|
|
if (target.is_online) {
|
|
|
|
isOnline = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
var notifyMessage = JSON.stringify({type: 'p2p_msg', from_uid: message.from});
|
|
|
|
|
|
|
|
// 保存通知消息到数据库中并根据用户在线状态推送此消息
|
|
|
|
nmRepo.save(message.to, message.contentType, title, content, notifyMessage, isOnline, function (err, result) {
|
|
|
|
if (err) {
|
|
|
|
log.error('Save private notify message failed, ', err);
|
|
|
|
} else {
|
|
|
|
if (isOnline === true) {
|
|
|
|
if (target.platform === PLATFORMS.iOS) {
|
|
|
|
getui.pushAPN(message.to,
|
|
|
|
target.token,
|
|
|
|
message.contentType,
|
|
|
|
title,
|
|
|
|
content,
|
|
|
|
notifyMessage,
|
|
|
|
function (err, result) {
|
|
|
|
if (err != null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (target.platform === PLATFORMS.Android) {
|
|
|
|
getui.pushAndroid(target.client_id,
|
|
|
|
message.contentType,
|
|
|
|
title,
|
|
|
|
content,
|
|
|
|
notifyMessage,
|
|
|
|
target.status,
|
|
|
|
function (err, result) {
|
|
|
|
if (err != null) {
|
|
|
|
console.log(err);
|
|
|
|
} else {
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
* 获取最近聊天的用户,组。
|
|
|
|
*/
|
|
|
|
Doctor.prototype.getRecentChats = function(){
|
|
|
|
statsRepo.getRecentChats(userId, days, function (err, result) {
|
|
|
|
if (err) {
|
|
|
|
log.error('Get recent chat objects failed: ', err);
|
|
|
|
|
|
/**
|
|
|
|
* 获取最近聊天的用户,组。
|
|
|
|
*/
|
|
|
|
getRecentChats(){
|
|
|
|
statsRepo.getRecentChats(userId, days, function (err, result) {
|
|
|
|
if (err) {
|
|
|
|
log.error('Get recent chat objects failed: ', err);
|
|
|
|
|
|
res.status(500).send({message: 'Get recent chat objects failed.'});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
res.status(500).send({message: 'Get recent chat objects failed.'});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
var data = {patients: [], doctors: [], groups: []};
|
|
|
|
if (result.length === 0) {
|
|
|
|
res.status(200).send(data);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
var data = {patients: [], doctors: [], groups: []};
|
|
|
|
if (result.length === 0) {
|
|
|
|
res.status(200).send(data);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
for (var i = 0; i < result.length; ++i) {
|
|
|
|
var row = result[i];
|
|
|
|
if (row.type.indexOf('patient') > -1) {
|
|
|
|
data.patients.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name,
|
|
|
|
birthday: row.birthday === null ? "" : row.birthday,
|
|
|
|
sex: row.sex,
|
|
|
|
avatar: row.photo === null ? "" : row.photo
|
|
|
|
});
|
|
|
|
} else if (row.type.indexOf('doctor') > -1) {
|
|
|
|
data.doctors.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name,
|
|
|
|
birthday: row.birthday === null ? "" : row.birthday,
|
|
|
|
sex: row.sex,
|
|
|
|
avatar: row.photo === null ? "" : row.photo
|
|
|
|
});
|
|
|
|
} else if (row.type.indexOf('group') > -1) {
|
|
|
|
data.groups.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name
|
|
|
|
});
|
|
|
|
|
|
for (var i = 0; i < result.length; ++i) {
|
|
|
|
var row = result[i];
|
|
|
|
if (row.type.indexOf('patient') > -1) {
|
|
|
|
data.patients.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name,
|
|
|
|
birthday: row.birthday === null ? "" : row.birthday,
|
|
|
|
sex: row.sex,
|
|
|
|
avatar: row.photo === null ? "" : row.photo
|
|
|
|
});
|
|
|
|
} else if (row.type.indexOf('doctor') > -1) {
|
|
|
|
data.doctors.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name,
|
|
|
|
birthday: row.birthday === null ? "" : row.birthday,
|
|
|
|
sex: row.sex,
|
|
|
|
avatar: row.photo === null ? "" : row.photo
|
|
|
|
});
|
|
|
|
} else if (row.type.indexOf('group') > -1) {
|
|
|
|
data.groups.push({
|
|
|
|
code: row.code,
|
|
|
|
name: row.name
|
|
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
res.status(200).send(data);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
res.status(200).send(data);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
* 获取参与的聊天列表,包括:点对点,参与的讨论组,系统消息等。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
*/
|
|
|
|
Doctor.prototype.getChatList = function (userId) {
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
// 与患者的私信
|
|
|
|
pmRepo.findAllP2PWithPatient(userId, function (err, patients) {
|
|
|
|
if (err) {
|
|
|
|
modelUtil.emitDbError(self, 'Get chat list with patient failed', err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
* 获取参与的聊天列表,包括:点对点,参与的讨论组,系统消息等。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
*/
|
|
|
|
getChatList(userId) {
|
|
|
|
var self = this;
|
|
|
|
|
|
var chats = {patients: [], doctors: [], groups: []};
|
|
|
|
for (var i = 0; i < patients.length; i++) {
|
|
|
|
var patient = patients[i];
|
|
|
|
chats.patients.push({
|
|
|
|
code: patient.code,
|
|
|
|
name: patient.name,
|
|
|
|
birthday: patient.birthday,
|
|
|
|
sex: patient.sex,
|
|
|
|
avatar: patient.photo == null ? "" : patient.photo,
|
|
|
|
newMessageCount: patient.new_msg_count,
|
|
|
|
lastContentType: patient.last_content_type,
|
|
|
|
lastContent: patient.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(patient.timestamp)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// 含有患者的群
|
|
|
|
gmRepo.findAllGroupsWithPatient(userId, function (err, groups) {
|
|
|
|
|
|
// 与患者的私信
|
|
|
|
pmRepo.findAllP2PWithPatient(userId, function (err, patients) {
|
|
if (err) {
|
|
if (err) {
|
|
modelUtil.emitDbError(self, 'Get group list with patient failed', err);
|
|
|
|
|
|
modelUtil.emitDbError(self, 'Get chat list with patient failed', err);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
|
|
|
|
// 过滤掉医生间的求助团队
|
|
|
|
if(group.group_type === 2) continue;
|
|
|
|
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.msg_type,
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
|
|
|
|
var chats = {patients: [], doctors: [], groups: []};
|
|
|
|
for (var i = 0; i < patients.length; i++) {
|
|
|
|
var patient = patients[i];
|
|
|
|
chats.patients.push({
|
|
|
|
code: patient.code,
|
|
|
|
name: patient.name,
|
|
|
|
birthday: patient.birthday,
|
|
|
|
sex: patient.sex,
|
|
|
|
avatar: patient.photo == null ? "" : patient.photo,
|
|
|
|
newMessageCount: patient.new_msg_count,
|
|
|
|
lastContentType: patient.last_content_type,
|
|
|
|
lastContent: patient.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(patient.timestamp)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
// 医生间的私聊
|
|
|
|
pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
|
|
|
|
|
|
// 含有患者的群
|
|
|
|
gmRepo.findAllGroupsWithPatient(userId, function (err, groups) {
|
|
if (err) {
|
|
if (err) {
|
|
modelUtil.emitDbError(self, 'Get chat list with doctor failed', err);
|
|
|
|
|
|
modelUtil.emitDbError(self, 'Get group list with patient failed', err);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
for (var i = 0; i < doctors.length; i++) {
|
|
|
|
var doctor = doctors[i];
|
|
|
|
chats.doctors.push({
|
|
|
|
code: doctor.code,
|
|
|
|
name: doctor.name,
|
|
|
|
sex: doctor.sex,
|
|
|
|
avatar: doctor.photo === null ? "" : doctor.photo,
|
|
|
|
newMessageCount: doctor.new_msg_count,
|
|
|
|
lastContentType: doctor.last_content_type,
|
|
|
|
lastContent: doctor.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(doctor.timestamp)
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
|
|
|
|
// 过滤掉医生间的求助团队
|
|
|
|
if(group.group_type === 2) continue;
|
|
|
|
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.msg_type,
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
// 获取医生间的组
|
|
|
|
gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
|
|
|
|
|
|
// 医生间的私聊
|
|
|
|
pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
|
|
if (err) {
|
|
if (err) {
|
|
modelUtil.emitDbError(self, 'Get group list with doctor failed', err);
|
|
|
|
|
|
modelUtil.emitDbError(self, 'Get chat list with doctor failed', err);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.group_type, // 行政团队 or 求助
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
|
|
|
|
for (var i = 0; i < doctors.length; i++) {
|
|
|
|
var doctor = doctors[i];
|
|
|
|
chats.doctors.push({
|
|
|
|
code: doctor.code,
|
|
|
|
name: doctor.name,
|
|
|
|
sex: doctor.sex,
|
|
|
|
avatar: doctor.photo === null ? "" : doctor.photo,
|
|
|
|
newMessageCount: doctor.new_msg_count,
|
|
|
|
lastContentType: doctor.last_content_type,
|
|
|
|
lastContent: doctor.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(doctor.timestamp)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
self.emit(MODEL_EVENTS.OK, chats);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
})
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
// 获取医生间的组
|
|
|
|
gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
|
|
|
|
if (err) {
|
|
|
|
modelUtil.emitDbError(self, 'Get group list with doctor failed', err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
* 获取与医生的聊天列表,包括:点对点,参与的讨论组。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
*/
|
|
|
|
Doctor.prototype.getChatListWithDoctor = function(userId){
|
|
|
|
// 先获取医生间的私聊
|
|
|
|
pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
|
|
|
|
if (err) {
|
|
|
|
log.error('Get chat list with doctor failed: ', err);
|
|
|
|
|
|
|
|
res.status(500).send({message: 'Get chat list with doctor failed.'});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.group_type, // 行政团队 or 求助
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
var chats = {doctors: [], groups: []};
|
|
|
|
for (var i = 0; i < doctors.length; i++) {
|
|
|
|
var doctor = doctors[i];
|
|
|
|
chats.doctors.push({
|
|
|
|
code: doctor.code,
|
|
|
|
name: doctor.name,
|
|
|
|
sex: doctor.sex,
|
|
|
|
avatar: doctor.photo === null ? "" : doctor.photo,
|
|
|
|
newMessageCount: doctor.new_msg_count,
|
|
|
|
lastContentType: doctor.last_content_type,
|
|
|
|
lastContent: doctor.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(doctor.timestamp)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
self.emit(MODEL_EVENTS.OK, chats);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
// 再获取医生间的组
|
|
|
|
gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
|
|
|
|
|
|
/**
|
|
|
|
* 获取与医生的聊天列表,包括:点对点,参与的讨论组。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
*/
|
|
|
|
getChatListWithDoctor(userId){
|
|
|
|
// 先获取医生间的私聊
|
|
|
|
pmRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
|
|
if (err) {
|
|
if (err) {
|
|
log.error('Get group list with doctor failed: ', err);
|
|
|
|
|
|
log.error('Get chat list with doctor failed: ', err);
|
|
|
|
|
|
res.status(500).send({message: 'Get group list with doctor failed.'});
|
|
|
|
|
|
res.status(500).send({message: 'Get chat list with doctor failed.'});
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.group_type, // 行政团队 or 求助
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
|
|
|
|
var chats = {doctors: [], groups: []};
|
|
|
|
for (var i = 0; i < doctors.length; i++) {
|
|
|
|
var doctor = doctors[i];
|
|
|
|
chats.doctors.push({
|
|
|
|
code: doctor.code,
|
|
|
|
name: doctor.name,
|
|
|
|
sex: doctor.sex,
|
|
|
|
avatar: doctor.photo === null ? "" : doctor.photo,
|
|
|
|
newMessageCount: doctor.new_msg_count,
|
|
|
|
lastContentType: doctor.last_content_type,
|
|
|
|
lastContent: doctor.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(doctor.timestamp)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
res.status(200).send(chats);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取与指定用户的聊天记录。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
* @param peerId
|
|
|
|
*/
|
|
|
|
Doctor.prototype.getPrivateMessages = function(userId, peerId){
|
|
|
|
pmRepo.findAllMessages(userId, peerId, contentType === undefined ? "1,2,3,5,6" : contentType, msgStartId, msgEndId, count, closedInterval, function (err, rows) {
|
|
|
|
if (err) {
|
|
|
|
log.error("Get private message failed, ", err);
|
|
|
|
|
|
// 再获取医生间的组
|
|
|
|
gmRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
|
|
|
|
if (err) {
|
|
|
|
log.error('Get group list with doctor failed: ', err);
|
|
|
|
|
|
res.status(500).send({message: "Get private messages failed."});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
res.status(500).send({message: 'Get group list with doctor failed.'});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
var messages = fillMessages(rows);
|
|
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
var group = groups[i];
|
|
|
|
chats.groups.push({
|
|
|
|
code: group.code,
|
|
|
|
name: group.name,
|
|
|
|
groupType: group.group_type, // 行政团队 or 求助
|
|
|
|
newMessageCount: group.new_msg_count,
|
|
|
|
lastContentType: group.last_content_type,
|
|
|
|
lastContent: group.last_content,
|
|
|
|
timestamp: objectUtil.timestampToLong(group.timestamp)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
// 清空统计信息
|
|
|
|
statsRepo.clearPrivateChatSummary(userId, peerId, function (err, result) {
|
|
|
|
if (err) console.log(err);
|
|
|
|
|
|
res.status(200).send(chats);
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
}
|
|
|
|
|
|
res.status(200).send(messages);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
|
* 获取与指定用户的聊天记录。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
* @param peerId
|
|
|
|
*/
|
|
|
|
getPrivateMessages(userId, peerId){
|
|
|
|
pmRepo.findAllMessages(userId, peerId, contentType === undefined ? "1,2,3,5,6" : contentType, msgStartId, msgEndId, count, closedInterval, function (err, rows) {
|
|
|
|
if (err) {
|
|
|
|
log.error("Get private message failed, ", err);
|
|
|
|
|
|
/**
|
|
|
|
* 获取与指定用户的未读聊天记录。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
* @param peerId
|
|
|
|
*/
|
|
|
|
Doctor.prototype.getUnreadPrivateMessages = function (userId, peerId) {
|
|
|
|
statsRepo.getPrivateChatSummary(userId, peerId, function (err, summary) {
|
|
|
|
if (err) {
|
|
|
|
log.error("Get unread private messages failed: ", err);
|
|
|
|
|
|
res.status(500).send({message: "Get private messages failed."});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
res.status(500).send({message: "Get unread private messages failed."});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
var messages = fillMessages(rows);
|
|
|
|
|
|
// 没有未读消息,直接返回
|
|
|
|
if (summary.length == 0 || summary[0].new_msg_count === 0) {
|
|
|
|
res.status(200).send({startId: 0, count: 0, records: []});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
// 清空统计信息
|
|
|
|
statsRepo.clearPrivateChatSummary(userId, peerId, function (err, result) {
|
|
|
|
if (err) console.log(err);
|
|
|
|
});
|
|
|
|
|
|
pmRepo.findUnread(peerId, userId, MAX_INT, summary[0].new_msg_count, function (err, rows) {
|
|
|
|
|
|
res.status(200).send(messages);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取与指定用户的未读聊天记录。
|
|
|
|
*
|
|
|
|
* @param userId
|
|
|
|
* @param peerId
|
|
|
|
*/
|
|
|
|
getUnreadPrivateMessages(userId, peerId) {
|
|
|
|
statsRepo.getPrivateChatSummary(userId, peerId, function (err, summary) {
|
|
if (err) {
|
|
if (err) {
|
|
log.error("Get unread private messages failed: ", err);
|
|
log.error("Get unread private messages failed: ", err);
|
|
|
|
|
|
@ -407,41 +393,59 @@ Doctor.prototype.getUnreadPrivateMessages = function (userId, peerId) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
var messages = fillMessages(rows);
|
|
|
|
|
|
// 没有未读消息,直接返回
|
|
|
|
if (summary.length == 0 || summary[0].new_msg_count === 0) {
|
|
|
|
res.status(200).send({startId: 0, count: 0, records: []});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
res.status(200).send(messages);
|
|
|
|
|
|
pmRepo.findUnread(peerId, userId, MAX_INT, summary[0].new_msg_count, function (err, rows) {
|
|
|
|
if (err) {
|
|
|
|
log.error("Get unread private messages failed: ", err);
|
|
|
|
|
|
|
|
res.status(500).send({message: "Get unread private messages failed."});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var messages = fillMessages(rows);
|
|
|
|
|
|
|
|
res.status(200).send(messages);
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
* 将消息的返回结果合并成JSON。
|
|
|
|
*
|
|
|
|
* @param rows
|
|
|
|
*
|
|
|
|
* @returns {startId: 0, count: 0, records: []}
|
|
|
|
*/
|
|
|
|
function fillMessages(rows) {
|
|
|
|
var messages = {startId: rows.length > 0 ? rows[0].msg_id : '', count: rows.length, records: []};
|
|
|
|
for (var i = 0; i < rows.length; i++) {
|
|
|
|
var row = rows[i];
|
|
|
|
var record = {
|
|
|
|
id: row.msg_id,
|
|
|
|
from: row.from_uid,
|
|
|
|
contentType: row.type,
|
|
|
|
content: row.content,
|
|
|
|
timestamp: objectUtil.timestampToLong(row.timestamp)
|
|
|
|
};
|
|
|
|
|
|
|
|
if (row.to_uid !== undefined) record.to = row.to_uid;
|
|
|
|
if (row.at_uid !== undefined) record.at = row.at_uid;
|
|
|
|
|
|
|
|
messages.records.push(record);
|
|
|
|
|
|
on(message, handler){
|
|
|
|
this._eventEmitter.on(message, handler);
|
|
}
|
|
}
|
|
|
|
|
|
return messages;
|
|
|
|
|
|
/**
|
|
|
|
* 将消息的返回结果合并成JSON。
|
|
|
|
*
|
|
|
|
* @param rows
|
|
|
|
*
|
|
|
|
* @returns {startId: 0, count: 0, records: []}
|
|
|
|
*/
|
|
|
|
static fillMessages(rows) {
|
|
|
|
var messages = {startId: rows.length > 0 ? rows[0].msg_id : '', count: rows.length, records: []};
|
|
|
|
for (var i = 0; i < rows.length; i++) {
|
|
|
|
var row = rows[i];
|
|
|
|
var record = {
|
|
|
|
id: row.msg_id,
|
|
|
|
from: row.from_uid,
|
|
|
|
contentType: row.type,
|
|
|
|
content: row.content,
|
|
|
|
timestamp: objectUtil.timestampToLong(row.timestamp)
|
|
|
|
};
|
|
|
|
|
|
|
|
if (row.to_uid !== undefined) record.to = row.to_uid;
|
|
|
|
if (row.at_uid !== undefined) record.at = row.at_uid;
|
|
|
|
|
|
|
|
messages.records.push(record);
|
|
|
|
}
|
|
|
|
|
|
|
|
return messages;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// This class inherits from EventEmitter and expose class
|
|
|
|
util.inherits(Doctor, EventEmitter);
|
|
|
|
|
|
// Expose class
|
|
module.exports = Doctor;
|
|
module.exports = Doctor;
|