session.repo.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /**
  2. * 会话库。
  3. */
  4. "use strict";
  5. let ImDb = require('../mysql/db/im.db');
  6. let log = require('../../util/log.js');
  7. const DB_TABLES = require('../../include/commons').DB_TABLES;
  8. const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
  9. const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
  10. class SessionRepo {
  11. constructor() {
  12. }
  13. /**
  14. * 获取单个session对象
  15. *
  16. * @param sessionId
  17. * @param handler
  18. */
  19. static findOne(sessionId, handler) {
  20. let sessionSQL = "select id,name,type,create_date from " + DB_TABLES.Sessions + " s where s.id = ?";
  21. ImDb.execQuery({
  22. "sql": sessionSQL,
  23. "args": [sessionId],
  24. "handler": handler || function (err, res) {
  25. if(err) log.error(err);
  26. }
  27. });
  28. }
  29. /**
  30. * 获取用户全部会话不包含角色未1的会话
  31. *
  32. * @param userId
  33. * @param handler
  34. */
  35. static findAll(userId, handler) {
  36. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0 group by w.session_id";
  37. let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0 group by w.session_id";
  38. let sessionSQL = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
  39. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
  40. ImDb.execQuery({
  41. "sql": sessionSQL,
  42. "args": [userId],
  43. "handler": handler || function (err, res) {
  44. if(err) log.error(err);
  45. }
  46. });
  47. }
  48. /**
  49. * 获取用户全部会话忽略角色
  50. *
  51. * @param userId
  52. * @param handler
  53. */
  54. static findAllIgnoreRole(userId, handler) {
  55. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  56. let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0 group by w.session_id";
  57. let sessionSQL = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
  58. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
  59. ImDb.execQuery({
  60. "sql": sessionSQL,
  61. "args": [userId],
  62. "handler": handler || function (err, res) {
  63. if(err) log.error(err);
  64. }
  65. });
  66. }
  67. /**
  68. * 获取用户全部会话
  69. *
  70. * @param userId
  71. * @param type
  72. * @param handler
  73. */
  74. static findAllByType(userId, type, handler) {
  75. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and type=? group by w.session_id";
  76. let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
  77. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") ";
  78. ImDb.execQuery({
  79. "sql": sessionSQL,
  80. "args": [userId, type],
  81. "handler": handler || function (err, res) {
  82. if(err) log.error(err);
  83. }
  84. });
  85. }
  86. static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
  87. if (page > 0) {
  88. if (page == 1) {
  89. page = 0;
  90. }else{
  91. page = (parseInt(page)-1) * parseInt(pagesize);
  92. }
  93. }
  94. let sessionSQL ="";
  95. let sql ="";
  96. if(status == SESSION_STATUS.ENDED){
  97. //找出已经结束的咨询
  98. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  99. //找出角色讨论组中为旁听且未结束的咨询
  100. let sql1 = ("select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.REGULAR+" group by w.session_id")
  101. sessionSQL = "select * from "
  102. + DB_TABLES.Sessions + " s where (s.id in(" + sql + ") and s.business_type = ? and s.status = 1) or (s.id in(" + sql1 + ") and s.business_type = ? and s.status = 0) limit "+page+","+pagesize;
  103. ImDb.execQuery({
  104. "sql": sessionSQL,
  105. "args": [userId, businessType,userId,businessType],
  106. "handler": handler || function (err, res) {
  107. if(err) log.error(err);
  108. }
  109. });
  110. }else{
  111. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  112. sessionSQL = "select * from "
  113. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.business_type = ? and s.status = ? limit "+page+","+pagesize;
  114. ImDb.execQuery({
  115. "sql": sessionSQL,
  116. "args": [userId, businessType,status],
  117. "handler": handler || function (err, res) {
  118. if(err) log.error(err);
  119. }
  120. });
  121. }
  122. }
  123. /**
  124. * 按时间跨度查询会话。
  125. *
  126. * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
  127. *
  128. * @param userId
  129. * @param dateSpan
  130. * @param handler
  131. */
  132. static findAllByTimestampAndType(userId, dateSpan, handler) {
  133. let sql = "SELECT DISTINCT s.id, CASE WHEN TYPE = 2 THEN d.name ELSE s.name END 'name', s.type, s.create_date, s.business_type " +
  134. "FROM sessions s, participants p " +
  135. "LEFT JOIN doctors d ON p.participant_id = d.id " +
  136. "WHERE s.id = p.session_id AND s.last_sender_id <> 'system' " +
  137. "AND UNIX_TIMESTAMP(s.last_message_time) > UNIX_TIMESTAMP(NOW()) - ? " +
  138. "AND p.participant_id <> ? AND s.type <> 1 AND s.business_type = 1 " +
  139. "AND s.id in (select s.id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " +
  140. "ORDER BY s.last_message_time DESC";
  141. ImDb.execQuery({
  142. sql: sql,
  143. args: [dateSpan * 3600 * 24, userId, userId],
  144. handler: handler || function (err, res) {
  145. if(err) log.error(err);
  146. }
  147. });
  148. }
  149. /**
  150. * 获取用户置顶会话
  151. *
  152. * @param userId
  153. * @param handler
  154. */
  155. static findStickySessions(userId, handler) {
  156. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  157. let sessionSQL = "select s.id,s.name,s.type,s.create_date from " + DB_TABLES.Sessions + " s," + DB_TABLES.StickySessions + " ss where s.id = ss.session_id s.id in(" + sql + ")";
  158. ImDb.execQuery({
  159. "sql": sessionSQL,
  160. "args": [userId],
  161. "handler": handler || function (err, res) {
  162. if(err) log.error(err);
  163. }
  164. });
  165. }
  166. /**
  167. * 保存session。若会话重复创建,则更新会话名称。
  168. *
  169. * @param sessionId
  170. * @param name
  171. * @param type
  172. * @param createDate
  173. * @param businessType
  174. * @param handler
  175. */
  176. static saveSession(sessionId, name, type, createDate, businessType, handler) {
  177. let sql = "insert into " + DB_TABLES.Sessions + " (id, name, type, create_date,business_type) VALUES (?,?,?,?,?) " +
  178. "ON DUPLICATE KEY UPDATE name = ?,type = ?";
  179. ImDb.execQuery({
  180. "sql": sql,
  181. "args": [sessionId, name, type, createDate, businessType, name,type],
  182. "handler": handler || function (err, res) {
  183. if(err) log.error(err);
  184. }
  185. });
  186. }
  187. /**
  188. * 更新会话的最终状态。
  189. *
  190. * @param lastSenderId
  191. * @param lastSenderName
  192. * @param lastMessageTime
  193. * @param lastContent
  194. * @param lastContentType
  195. * @param sessionId
  196. * @param handler
  197. */
  198. static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
  199. let sql = "update " + DB_TABLES.Sessions + " set last_sender_id=?,last_sender_name=?,last_message_time=?,last_content=?,last_content_type=? where id = ?";
  200. ImDb.execQuery({
  201. "sql": sql,
  202. "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
  203. "handler": handler || function (err, res) {
  204. if(err) log.error(err);
  205. }
  206. });
  207. }
  208. /**
  209. * 保存置顶会话。
  210. *
  211. * @param sessionId
  212. * @param user
  213. * @param score
  214. */
  215. static saveStickySession(sessionId, user, score) {
  216. let sql = "insert into " + DB_TABLES.StickySessions + " (user_id,session_id,score) VALUES (?,?,?) ";
  217. ImDb.execQuery({
  218. "sql": sql,
  219. "args": [user, sessionId, score],
  220. "handler": function (err, res) {
  221. if (err) {
  222. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
  223. }
  224. }
  225. });
  226. }
  227. /**
  228. * 取消会话置顶。
  229. *
  230. * @param sessionId
  231. * @param userId
  232. */
  233. static unStickySession(sessionId, userId) {
  234. let sql = "delete from " + DB_TABLES.StickySessions + " where user_id=? and session_id=? ";
  235. ImDb.execQuery({
  236. "sql": sql,
  237. "args": [userId, sessionId],
  238. "handler": function (err, res) {
  239. if (err) {
  240. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
  241. }
  242. }
  243. });
  244. }
  245. static updateSessionStatus(sessionId,status,handler){
  246. let sql = "update " + DB_TABLES.Sessions + " set status=? where id = ?";
  247. ImDb.execQuery({
  248. "sql": sql,
  249. "args": [status, sessionId],
  250. "handler": handler || function (err, res) {
  251. if(err) log.error(err);
  252. }
  253. });
  254. }
  255. }
  256. module.exports = SessionRepo;