Просмотр исходного кода

为表DDL增加字符集定义

Sand 8 лет назад
Родитель
Сommit
b5fc554d68

+ 52 - 41
src/server/models/search/mysql.searcher.js

@ -13,8 +13,9 @@
let BaseModel = require('../base.model');
let SearchRepo = require('../../repository/mysql/search.repo');
let ModelUtil = require("../../util/model.util");
let ObjectUtil = require("../../util/object.util.js");
let async = require("async");
var ObjectUtil = require("../../util/object.util.js");
class MySqlSearcher extends BaseModel {
    constructor() {
@ -27,53 +28,59 @@ class MySqlSearcher extends BaseModel {
     * @param userId
     * @param keyword
     */
    searchAll(userId, keyword){
    searchAll(userId, keyword) {
        let self = this;
        async.waterfall([
            function (callback) {
                self.searchDoctors(keyword, 0, 4, function (err, doctors) {
                    if(err) return callback(err, null);
                function (callback) {
                    self.searchDoctors(keyword, 0, 4, function (err, doctors) {
                        if (err) return callback(err, null);
                    let data = [];
                    let datas={};
                    doctors.forEach(function (doctor) {
                        data.push(doctor);
                        let data = {};
                        let buffer = [];
                        doctors.forEach(function (doctor) {
                            buffer.push(doctor);
                        });
                        data.doctor = buffer;
                        callback(null, data);
                    });
                    datas.doctor = data;
                    callback(null, datas);
                });
            },
            function (datas, callback) {
                self.searchSessions(userId, keyword, 0,4, function (err, sessions) {
                    if(err) return callback(err, null);
                    let data = [];
                    sessions.forEach(function (session) {
                        data.push(session);
                },
                function (data, callback) {
                    self.searchSessions(userId, keyword, 0, 4, function (err, sessions) {
                        if (err) return callback(err, null);
                        let buffer = [];
                        sessions.forEach(function (session) {
                            buffer.push(session);
                        });
                        data.groups = buffer;
                        callback(null, data);
                    });
                    datas.groups = data;
                    callback(null, datas);
                });
            },
            function (datas, callback) {
                self.searchMessages(userId, keyword, 0, 4, function (err, sessions) {
                    if(err) return callback(err, null);
                    let data = [];
                    sessions.forEach(function (session) {
                        data.push(session);
                },
                function (data, callback) {
                    self.searchMessages(userId, keyword, 0, 4, function (err, sessions) {
                        if (err) return callback(err, null);
                        let buffer = [];
                        sessions.forEach(function (session) {
                            buffer.push(session);
                        });
                        data.content = buffer;
                        callback(null, data);
                    });
                    datas.content = data;
                    callback(null, datas);
                });
            }
        ],
        function (err, res) {
            if(err) {
                ModelUtil.emitError(self.eventEmitter, "Search all object types failed", err);
            } else {
                ModelUtil.emitOK(self.eventEmitter, res);
            }
        });
                }
            ],
            function (err, res) {
                if (err) {
                    ModelUtil.emitError(self.eventEmitter, "Search all object types failed", err);
                } else {
                    ModelUtil.emitOK(self.eventEmitter, res);
                }
            });
    }
    /**
@ -122,6 +129,10 @@ class MySqlSearcher extends BaseModel {
                if (err) {
                    ModelUtil.emitError(self.eventEmitter, "Search sessions failed", err);
                } else {
                    sessions.forEach(function (session) {
                        session.create_date = ObjectUtil.timestampToLong(session.create_date);
                    });
                    ModelUtil.emitOK(self.eventEmitter, sessions);
                }
            }

+ 26 - 0
src/server/resources/schema/case/search.sql

@ -0,0 +1,26 @@
--会话搜索
SELECT d.id, d.name, d.sex, d.birthdate, d.avatar, d.level
FROM doctors d
WHERE d.name LIKE '%张%'
LIMIT 2, 2;
SELECT s.id, s.name, s.type, s.create_date, s.business_type
FROM sessions s
WHERE s.id IN (
SELECT id
FROM sessions s, participants p
WHERE s.id = p.session_id AND p.participant_id = 'D2016008240002') AND s.type <> 0 AND s.name LIKE '%全%';
--消息搜索
SELECT * FROM(
SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, m.id message_id, m.content message_content
FROM sessions s, participants p, muc_messages m 
WHERE p.participant_id = 'D2016008240002' and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE '%哦%'
UNION
SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, m.id message_id, m.content message_content
FROM sessions s, participants p, group_messages m 
WHERE p.participant_id = 'D2016008240002' and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE '%哦%'
UNION
SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, m.id message_id, m.content message_content
FROM sessions s, participants p, p2p_messages m 
WHERE p.participant_id = 'D2016008240002' and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE '%哦%'
) X LIMIT 0, 10;

+ 0 - 79
src/server/resources/schema/case/医生页-与医生相关的会话.sql

@ -1,79 +0,0 @@
#医生间会话测试用户: D20161008002
#组间会话测试用户: 0de7421c62dd11e69faffa163e8aee56 ,或组ID:265
#与医生的私人会话
SELECT DISTINCT
    d.code,
    d.name,
    d.sex,
    d.photo,
    ms3.last_content_type,
    ms3.last_content,
    ms3.timestamp,
    'doctor' type
FROM
    (SELECT DISTINCT
        CASE
                WHEN ms1.timestamp > ms2.timestamp THEN ms1.id
                ELSE ms2.id
            END id
    FROM
        msg_statistic ms1, msg_statistic ms2
    WHERE
        ms1.uid = ms2.peer_uid
            AND ms1.from_gid IS NULL
            AND ms2.from_gid IS NULL
            AND ms1.peer_uid = ms2.uid) x,
    msg_statistic ms3,
    wlyy.wlyy_doctor d
WHERE
    x.id = ms3.id AND ms3.last_content_type in (1,2,3,5,6) 
        AND ((ms3.uid = d.code
        AND ms3.peer_uid = 'shiliuD20160926003')
        OR (ms3.uid = 'shiliuD20160926003'
        AND ms3.peer_uid = d.code));
        
####医生群聊,包括讨论组与行政团队####
#行政团队的记录
SELECT 
    g.id,
    g.name,
    '',
    '',
    ms.last_content_type,
    ms.last_content,
    MAX(ms.timestamp),
    '1' type
FROM
    wlyy.wlyy_admin_team g,
    wlyy.wlyy_admin_team_member m,
    wlyy.wlyy_doctor d,
    msg_statistic ms
WHERE
    d.code = 'shiliuD20160926003'
        AND d.code = m.doctor_code
        AND m.team_id = g.id
        AND g.id = ms.from_gid
        AND ms.last_content_type IN (1 , 2, 3, 5, 6)
GROUP BY g.id , g.name;
        
#讨论组的记录
SELECT 
    m.group_code,
    m.group_name,
    '',
    '',
    ms.last_content_type,
    ms.last_content,
    ms.timestamp,
    '2' type
FROM
    wlyy.wlyy_talk_group_member m,
    wlyy.wlyy_doctor d,
    msg_statistic ms
WHERE
    d.code = '0de7421c62dd11e69faffa163e8aee56'
        AND d.code = m.member_code
        AND m.group_code = ms.from_gid
GROUP BY m.group_code , m.group_name
;

+ 0 - 3
src/server/resources/schema/case/团队修改日志.sql

@ -1,3 +0,0 @@
alter table wlyy_admin_team add column last_modified TIMESTAMP default  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间';
alter table wlyy_admin_team_member add column available int(1) default 1 COMMENT '是否有效';
alter table wlyy_admin_team_member add column last_modified TIMESTAMP default  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间';

+ 0 - 38
src/server/resources/schema/case/居民页-所有与居民相关的会话.sql

@ -1,38 +0,0 @@
#医生 <---> 患者
SELECT 
    p.code,
    p.name,
    p.birthday,
    p.sex,
    p.photo,
    ms.last_content_type,
    ms.last_content,
    ms.timestamp,
    ms.new_msg_count
FROM
    msg_statistic ms,
    wlyy.wlyy_patient p
WHERE
    ms.msg_type = 1
        AND ms.last_content_type IN (1 , 2, 3, 5, 6)
        AND (ms.from_uid = 'shiliuD20160926003'
        AND ms.uid = p.code)
        OR (ms.uid = 'shiliuD20160926003'
        AND ms.from_uid = p.code)
;
# 有居民参与的咨询/求助
select 
g.code,
    g.name,
    '',
    '',
    '',
    ms.last_content_type,
    ms.last_content,
    ms.timestamp
from im_new.msg_statistic ms, 
(
SELECT g.code code, g.name name, g.type type FROM wlyy.wlyy_talk_group g, wlyy.wlyy_talk_group_member m where g.code = m.group_code and m.member_code = 'D20161008003'
) g, wlyy.wlyy_patient p
where ((ms.uid = 'D20161008003' and ms.from_uid = p.code) OR (ms.uid = p.code and ms.from_uid = 'D20161008003'))
and ms.from_gid = g.code and ms.msg_type = 2;

+ 0 - 60
src/server/resources/schema/case/最近聊天列表.sql

@ -1,60 +0,0 @@
select * from(
# 最近聊天患者
SELECT DISTINCT
    p.code code, p.name name, p.birthday birthday, p.sex sex, p.photo photo, ms.timestamp timestamp, 'type' ':patient'
FROM
    im_new.msg_statistic ms,
    wlyy.wlyy_patient p
WHERE
    ms.uid = 'shiliuD20160926003' AND ms.uid = p.code
        AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < 6048000
        AND msg_type = 1
union
## 最近聊天医生,测试医生ID:D2016008240002
SELECT DISTINCT
    d.code code,
    d.name name,
    d.birthday birthday,
    d.sex sex,
    d.photo photo,
    ms.timestamp timestamp,
    'doctor' type
FROM
    im_new.msg_statistic ms,
    wlyy.wlyy_doctor d,
    (SELECT 
        CASE
                WHEN ms1.timestamp > ms2.timestamp THEN ms1.id
                ELSE ms2.id
            END id
    FROM
        msg_statistic ms1, msg_statistic ms2
    WHERE
        ms1.from_gid IS NULL
            AND ms2.from_gid IS NULL
            AND ms1.uid = ms2.peer_uid
            AND ms1.peer_uid = ms2.uid) x
WHERE
    x.id = ms.id
        AND ((ms.uid = 'D2016008240002' AND ms.peer_uid = d.code) OR (ms.uid = d.code AND ms.peer_uid = 'D2016008240002'))
        AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < 6048000
        
union
#最近聊天群,测试医生ID:0de7295862dd11e69faffa163e8aee56
SELECT 
    g.id code, g.name name, '' birthday, '' sex, '' photo, max(ms.timestamp) timestamp, 'type' ':group'
FROM
    im_new.msg_statistic ms,
    wlyy.wlyy_admin_team g,
    wlyy.wlyy_admin_team_member m,
    wlyy.wlyy_doctor d
WHERE
	d.code = '0de7295862dd11e69faffa163e8aee56'
    AND d.code = m.doctor_code
    AND m.team_id = g.id
    AND g.id = ms.from_gid
    AND (ms.uid = d.code or ms.from_uid = d.code)
        AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < 604800000 group by g.id, g.name
) x order by timestamp

+ 0 - 118
src/server/resources/schema/case/用户搜索-居民与医生.sql

@ -1,118 +0,0 @@
#------------------------------------------居民搜索----------------------------------------------------
#搜索与医生签约过的患者,条件:患者姓名。测试全科医生: 66bd8ee165b711e69f7c005056850d66,测试健管师: 3b723bb8699a11e69f7c005056850d66
select * from wlyy.wlyy_sign_family f, wlyy.wlyy_patient p where f.patient = p.code AND p.name LIKE '%王%'
#and f.doctor = ''	#全科医生
#and f.doctor_health = '' #健管师
;
#搜索与患者的聊天记录
SELECT 
    p.code,
    p.name,
    p.birthday,
    p.sex,
    p.photo,
    m.msg_id,
    m.content
FROM
    (SELECT 
        CASE
                WHEN msg.from_uid = 'D2016082409' THEN msg.to_uid
                ELSE msg.from_uid
            END peer_id,
            msg.msg_id,
            msg.content
    FROM
        msg_p2p msg
    WHERE
        (msg.from_uid = 'D2016082409'
            OR msg.to_uid = 'D2016082409')
            AND msg.content LIKE '%1%'
            AND type = 1) m,
    wlyy.wlyy_patient p
WHERE
    m.peer_id = p.code
;
#------------------------------------------医生搜索----------------------------------------------------
#搜索聊天过的医生,条件:医生姓名
SELECT DISTINCT
    d.code, d.name, d.photo, d.hospital
FROM
    msg_statistic ms,
    wlyy.wlyy_doctor d
WHERE
    d.code = '0de6e08062dd11e69faffa163e8aee56'
		AND ms.from_gid IS NULL
        AND (ms.peer_uid = d.code OR ms.uid = d.code) 
        AND d.name like '%汤%'
UNION
#搜索行政团队内的成员
SELECT 
    d.code, d.name, d.photo, d.hospital
FROM
    wlyy.wlyy_admin_team_member m1,
    wlyy.wlyy_admin_team_member m2,
    wlyy.wlyy_doctor d
WHERE
    m1.doctor_code = '0de6e08062dd11e69faffa163e8aee56'
        AND m1.team_id = m2.team_id
        AND m2.doctor_code = d.code
        AND d.name like '%汤%';
# 搜索讨论组名称及讨论组成员姓名含有关键字记录
SELECT g.code, g.name, m.member_code, m.member_name from wlyy.wlyy_talk_group g left join wlyy.wlyy_talk_group_member m on g.code = m.group_code
where g.name like '%王%' or m.member_name like '%王%' and m.member_code = 'test_ch_9a0a4138a281e7c6316eb9be'
order by g.code
;
#### 搜索与医生、讨论组的聊天记录
#与医生的聊天记录
SELECT 
    d.code, d.name, d.photo, m.msg_id, m.content
FROM
    (SELECT 
        CASE
                WHEN msg.from_uid = '5fa5e88f7a4111e69f7c005056850d66' THEN msg.to_uid
                ELSE msg.from_uid
            END peer_id,
            msg.msg_id,
            msg.content
    FROM
        msg_p2p msg
    WHERE
        (msg.from_uid = '5fa5e88f7a4111e69f7c005056850d66'
            OR msg.to_uid = '5fa5e88f7a4111e69f7c005056850d66')
            AND msg.content LIKE '%sdf%'
            AND type = 1) m,
    wlyy.wlyy_doctor d
WHERE
    m.peer_id = d.code order by d.code;
    
#搜索讨论组与行政团队的聊天记录
SELECT 
    g.code, g.name, gm.msg_id, gm.content
FROM
    msg_group gm,
    (SELECT 
        t.id code, t.name name
    FROM
        wlyy.wlyy_admin_team t, wlyy.wlyy_admin_team_member m
    WHERE
        m.doctor_code = '0de6e08062dd11e69faffa163e8aee56'
            AND t.id = m.team_id UNION SELECT 
        m.group_code code, m.group_name name
    FROM
        wlyy.wlyy_talk_group_member m
    WHERE
        m.member_code = '0de6e08062dd11e69faffa163e8aee56') g
WHERE
    g.code = gm.to_gid AND gm.type = 1
        AND gm.content LIKE '%圣%'
ORDER BY g.name ASC, gm.msg_id DESC;
    
#---------------------------------------

+ 21 - 1
src/server/resources/schema/ichat_1.2.8_table_schema.sql

@ -52,6 +52,8 @@ CREATE TABLE `system_messages`
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='P2P会话消息'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `sticky_sessions`
@ -61,6 +63,8 @@ CREATE TABLE `sticky_sessions`
	`score` NUMERIC(15,0) COMMENT '置顶分值',
	CONSTRAINT `PK_sticky_sessions` PRIMARY KEY (`user_id`,`session_id`)
) COMMENT='置顶会话'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `wechat_access_tokens`
@ -70,6 +74,8 @@ CREATE TABLE `wechat_access_tokens`
	`create_time` TIMESTAMP(0) COMMENT '数据创建时间',
	CONSTRAINT `PK_wechat_access_tokens` PRIMARY KEY (`access_token`)
) COMMENT='微信接口调用所需要token'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `app_status`
@ -81,6 +87,8 @@ CREATE TABLE `app_status`
	`app_in_bg` TINYINT COMMENT 'App是否处于后台状态',
	CONSTRAINT `PK_user_status` PRIMARY KEY (`user_id`)
) COMMENT='app端状态'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `topics`
@ -96,7 +104,9 @@ CREATE TABLE `topics`
	`status` INT COMMENT '议题状态,0新建,1已回复未结束,10结束',
	`description` VARCHAR(1024) COMMENT '议题描述',
	CONSTRAINT `PK_topics` PRIMARY KEY (`id`)
) COMMENT='议题,仅MUC模式使用。'
) COMMENT='议题,仅MUC模式使用'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `p2p_messages`
@ -111,6 +121,8 @@ CREATE TABLE `p2p_messages`
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='P2P会话消息'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `group_messages`
@ -126,6 +138,8 @@ CREATE TABLE `group_messages`
	`at` VARCHAR(1024) COMMENT '发送时,at某人',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='群会话消息'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `muc_messages`
@ -140,6 +154,8 @@ CREATE TABLE `muc_messages`
	`timestamp` TIMESTAMP(0) COMMENT '发送时间',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='MUC会话消息'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `participants`
@ -150,6 +166,8 @@ CREATE TABLE `participants`
	`last_fetch_time` TIMESTAMP(0) COMMENT '最后获取此会话消息的时间',
	CONSTRAINT `PK_participants` PRIMARY KEY (`session_id`,`participant_id`)
) COMMENT='会话参与者'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `sessions`
@ -166,6 +184,8 @@ CREATE TABLE `sessions`
	`last_message_time` TIMESTAMP(0) COMMENT '消息最后时间',
	CONSTRAINT `PK_sessions` PRIMARY KEY (`id`)
) COMMENT='会话'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
/* Create Primary Keys, Indexes, Uniques, Checks */

+ 1 - 5
src/server/resources/schema/ichat_1.2.8_view_schema.sql

@ -10,8 +10,4 @@ from wlyy.wlyy_patient;
create or replace view wechat_status as
select code user_id, openid open_id
from wlyy.wlyy_patient
;
ALTER TABLE `wlyy_consult_team`
MODIFY COLUMN `end_msg_id`  varchar(50) NULL DEFAULT NULL AFTER `guidance`,
MODIFY COLUMN `start_msg_id`  varchar(50) NULL DEFAULT NULL AFTER `end_msg_id`;
;

+ 171 - 2
src/server/resources/schema/temp.sql

@ -1,6 +1,6 @@
/* ---------------------------------------------------- */
/*  Generated by Enterprise Architect Version 12.0 		*/
/*  Created On : 10-Jan-2017 5:32:13 PM 				*/
/*  Created On : 18-Jan-2017 2:35:45 PM 				*/
/*  DBMS       : MySql 						*/
/* ---------------------------------------------------- */
@ -8,11 +8,126 @@ SET FOREIGN_KEY_CHECKS=0
/* Drop Tables */
DROP TABLE IF EXISTS `system_messages` CASCADE
;
DROP TABLE IF EXISTS `sticky_sessions` CASCADE
;
DROP TABLE IF EXISTS `wechat_access_tokens` CASCADE
;
DROP TABLE IF EXISTS `app_status` CASCADE
;
DROP TABLE IF EXISTS `topics` CASCADE
;
DROP TABLE IF EXISTS `p2p_messages` CASCADE
;
DROP TABLE IF EXISTS `group_messages` CASCADE
;
DROP TABLE IF EXISTS `muc_messages` CASCADE
;
DROP TABLE IF EXISTS `participants` CASCADE
;
DROP TABLE IF EXISTS `sessions` CASCADE
;
/* Create Tables */
CREATE TABLE `system_messages`
(
	`id` VARCHAR(32) NOT NULL COMMENT '消息ID',
	`session_id` VARCHAR(50) NOT NULL COMMENT '所属会话',
	`sender_id` VARCHAR(50) NOT NULL COMMENT '消息发送者',
	`sender_name` VARCHAR(50),
	`content_type` INTEGER NOT NULL COMMENT '消息类型,1文本,2图片,3语音,4文章,5跳转,6咨询开始,7咨询结束',
	`content` VARCHAR(1024) COMMENT '消息内容',
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	`timestamp` TIMESTAMP(0) COMMENT '发送时间',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='P2P会话消息'
;
CREATE TABLE `sticky_sessions`
(
	`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
	`session_id` VARCHAR(50) NOT NULL COMMENT '会话ID',
	`score` NUMERIC(15,0) COMMENT '置顶分值',
	CONSTRAINT `PK_sticky_sessions` PRIMARY KEY (`user_id`,`session_id`)
) COMMENT='置顶会话'
;
CREATE TABLE `wechat_access_tokens`
(
	`access_token` VARCHAR(50) NOT NULL COMMENT '访问token',
	`expiry_date` TIMESTAMP(0) COMMENT '过期时间',
	`create_time` TIMESTAMP(0) COMMENT '数据创建时间',
	CONSTRAINT `PK_wechat_access_tokens` PRIMARY KEY (`access_token`)
) COMMENT='微信接口调用所需要token'
;
CREATE TABLE `app_status`
(
	`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
	`platform` TINYINT COMMENT '平台,0为iOS,1为安卓',
	`token` VARCHAR(100) COMMENT '个推Token',
	`client_id` VARCHAR(100) COMMENT '客户端ID',
	`app_in_bg` TINYINT COMMENT 'App是否处于后台状态',
	CONSTRAINT `PK_user_status` PRIMARY KEY (`user_id`)
) COMMENT='app端状态'
;
CREATE TABLE `topics`
(
	`id` VARCHAR(32) NOT NULL COMMENT 'ID',
	`session_id` VARCHAR(50) NOT NULL COMMENT 'MUC会话ID',
	`name` VARCHAR(50) COMMENT '议题名称',
	`create_time` TIMESTAMP(0) COMMENT '创建时间',
	`end_by` VARCHAR(50) COMMENT '结束人ID',
	`end_time` TIMESTAMP(0) COMMENT '结束时间',
	`start_message_id` INTEGER COMMENT '消息起始ID',
	`end_message_id` INTEGER COMMENT '消息结束ID',
	`status` INT COMMENT '议题状态,0新建,1已回复未结束,10结束',
	`description` VARCHAR(1024) COMMENT '议题描述',
	CONSTRAINT `PK_topics` PRIMARY KEY (`id`)
) COMMENT='议题,仅MUC模式使用。'
;
CREATE TABLE `p2p_messages`
(
	`id` VARCHAR(32) NOT NULL COMMENT '消息ID',
	`session_id` VARCHAR(50) NOT NULL COMMENT '所属会话',
	`sender_id` VARCHAR(50) NOT NULL COMMENT '消息发送者',
	`sender_name` VARCHAR(50),
	`content_type` INTEGER NOT NULL COMMENT '消息类型,1文本,2图片,3语音,4文章,5跳转,6咨询开始,7咨询结束',
	`content` VARCHAR(1024) COMMENT '消息内容',
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	`timestamp` TIMESTAMP(0) COMMENT '发送时间',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='P2P会话消息'
;
CREATE TABLE `group_messages`
(
	`id` VARCHAR(32) NOT NULL COMMENT '消息ID',
	`session_id` VARCHAR(50) NOT NULL COMMENT '所属会话',
	`sender_id` VARCHAR(50) NOT NULL COMMENT '消息发送者',
	`sender_name` VARCHAR(50),
	`content_type` INTEGER NOT NULL COMMENT '消息类型,1文本,2图片,3语音,4文章,5跳转,6咨询开始,7咨询结束',
	`content` VARCHAR(1024) COMMENT '消息内容',
	`timestamp` TIMESTAMP(0) COMMENT '发送时间',
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	`at` VARCHAR(1024) COMMENT '发送消息时,at某人',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='群会话消息'
;
CREATE TABLE `muc_messages`
(
	`id` VARCHAR(32) NOT NULL COMMENT '消息ID',
@ -21,14 +136,68 @@ CREATE TABLE `muc_messages`
	`sender_name` VARCHAR(50),
	`content_type` INTEGER NOT NULL COMMENT '消息类型,1文本,2图片,3语音,4文章,5跳转,6咨询开始,7咨询结束',
	`content` VARCHAR(1024) COMMENT '消息内容',
	`business_type` INT COMMENT '业务类型,IM不处理,只做存储与转发',
	`business_type` VARCHAR(50) COMMENT '业务类型,IM不处理,只做存储与转发',
	`timestamp` TIMESTAMP(0) COMMENT '发送时间',
	CONSTRAINT `PK_messages` PRIMARY KEY (`id`)
) COMMENT='MUC会话消息'
;
CREATE TABLE `participants`
(
	`session_id` VARCHAR(50) NOT NULL COMMENT '会话ID。ID结构:以患者ID+最大次数',
	`participant_id` VARCHAR(50) NOT NULL COMMENT '参与者ID',
	`participant_role` INTEGER COMMENT 'MUC中的参与者角色。0为主持人, 1为普通参与者, 10为旁听者',
	`last_fetch_time` TIMESTAMP(0) COMMENT '最后获取此会话消息的时间',
	CONSTRAINT `PK_participants` PRIMARY KEY (`session_id`,`participant_id`)
) ENGINE=InnoDB COMMENT='会话参与者'
;
CREATE TABLE `sessions`
(
	`id` VARCHAR(50) NOT NULL COMMENT '会话标识。会话标识来源根据业务场景:1 医生间P2P会话使用随机生成的ID;2 医生间的群会话使用行政团队的ID;3 医生与患者间的咨询以患者的ID+当前咨询次数为ID',
	`name` VARCHAR(50) NOT NULL COMMENT '会话名称',
	`type` INTEGER NOT NULL COMMENT '会话类型,0表示系统会话,1表示MUC会话,2表示P2P,3表示群会话,4表示临时讨论组',
	`business_type` INT COMMENT '业务相关类型',
	`create_date` DATETIME(0) NOT NULL COMMENT '创建时间',
	`last_sender_id` VARCHAR(50) COMMENT '消息最后发送人ID',
	`last_sender_name` VARCHAR(50) COMMENT '消息最后发送人姓名',
	`last_content_type` VARCHAR(50) COMMENT '消息最后内容类型',
	`last_content` VARCHAR(1024) COMMENT '消息最后内容',
	`last_message_time` TIMESTAMP(0) COMMENT '消息最后时间',
	CONSTRAINT `PK_sessions` PRIMARY KEY (`id`)
) COMMENT='会话'
;
/* Create Primary Keys, Indexes, Uniques, Checks */
ALTER TABLE `system_messages` 
 ADD INDEX `IXFK_messages_participants` (`session_id` ASC,`sender_id` ASC)
;
ALTER TABLE `system_messages` 
 ADD INDEX `IXFK_messages_sessions` (`session_id` ASC)
;
ALTER TABLE `topics` 
 ADD INDEX `IXFK_topics_sessions` (`session_id` ASC)
;
ALTER TABLE `p2p_messages` 
 ADD INDEX `IXFK_messages_participants` (`session_id` ASC,`sender_id` ASC)
;
ALTER TABLE `p2p_messages` 
 ADD INDEX `IXFK_messages_sessions` (`session_id` ASC)
;
ALTER TABLE `group_messages` 
 ADD INDEX `IXFK_messages_participants` (`session_id` ASC,`sender_id` ASC)
;
ALTER TABLE `group_messages` 
 ADD INDEX `IXFK_messages_sessions` (`session_id` ASC)
;
ALTER TABLE `muc_messages` 
 ADD INDEX `IXFK_messages_participants` (`session_id` ASC,`sender_id` ASC)
;