session.repo.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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. const SESSION_BUSINESS_TYPE = require('../../include/commons').SESSION_BUSINESS_TYPE;
  11. class SessionRepo {
  12. constructor() {
  13. }
  14. /**
  15. * 获取单个session对象
  16. *
  17. * @param sessionId
  18. * @param handler
  19. */
  20. static findOne(sessionId, handler) {
  21. let sessionSQL = "select id,name,type,create_date,business_type from " + DB_TABLES.Sessions + " s where s.id = ?";
  22. ImDb.execQuery({
  23. "sql": sessionSQL,
  24. "args": [sessionId],
  25. "handler": handler || function (err, res) {
  26. if(err) log.error(err);
  27. }
  28. });
  29. }
  30. /**
  31. * 获取用户全部会话不包含角色未1的会话
  32. *
  33. * @param userId
  34. * @param handler
  35. */
  36. static findAll(userId, handler) {
  37. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0 group by w.session_id";
  38. 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";
  39. 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 "
  40. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
  41. ImDb.execQuery({
  42. "sql": sessionSQL,
  43. "args": [userId],
  44. "handler": handler || function (err, res) {
  45. if(err) log.error(err);
  46. }
  47. });
  48. }
  49. /**
  50. * 获取用户全部(未结束的)会话不包含角色未1的会话
  51. * @param userId
  52. * @param handler
  53. */
  54. static findUnEndAll(userId, handler) {
  55. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0 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+") and s.`status` = 0";
  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 handler
  72. */
  73. static findAllIgnoreRole(userId, handler) {
  74. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  75. 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";
  76. 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 "
  77. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
  78. ImDb.execQuery({
  79. "sql": sessionSQL,
  80. "args": [userId],
  81. "handler": handler || function (err, res) {
  82. if(err) log.error(err);
  83. }
  84. });
  85. }
  86. /**
  87. * 获取用户全部会话
  88. *
  89. * @param userId
  90. * @param type
  91. * @param handler
  92. */
  93. static findAllByType(userId, type, handler) {
  94. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and type=? group by w.session_id";
  95. let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
  96. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") ";
  97. log.info("获取用户全部会话: sql :" + sql);
  98. log.info("获取用户全部会话: args :" + args);
  99. ImDb.execQuery({
  100. "sql": sessionSQL,
  101. "args": [userId, type],
  102. "handler": handler || function (err, res) {
  103. if(err) log.error(err);
  104. }
  105. });
  106. }
  107. /**
  108. * 查找某类型的用户的会话数量
  109. * @param userId
  110. * @param type
  111. * @param handler
  112. */
  113. static findSessionCountByType(userId,type,status,handler){
  114. let sql = "select session_id count from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  115. let sessionSQL = "select count(id) count from " + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type=?";
  116. if(status != null){
  117. sessionSQL = sessionSQL + " and s.status="+status;
  118. }
  119. ImDb.execQuery({
  120. "sql": sessionSQL,
  121. "args": [userId, type],
  122. "handler": handler || function (err, res) {
  123. if(err) log.error(err);
  124. }
  125. });
  126. }
  127. /**
  128. * 分页获取用户会话列表
  129. * @param userId
  130. * @param type
  131. * @param handler
  132. */
  133. static findListByType(userId, type,page,pagesize, status,handler) {
  134. if (page > 0) {
  135. if (page == 1) {
  136. page = 0;
  137. }else{
  138. page = (parseInt(page)-1) * parseInt(pagesize);
  139. }
  140. }
  141. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id in(?) group by w.session_id";
  142. let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
  143. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type=? ";
  144. if(status != null && status != ""){
  145. sessionSQL += " and s.status="+status
  146. }
  147. sessionSQL += " order by s.last_message_time desc limit "+page+","+pagesize;
  148. ImDb.execQuery({
  149. "sql": sessionSQL,
  150. "args": [userId, type],
  151. "handler": handler || function (err, res) {
  152. if(err) log.error(err);
  153. }
  154. });
  155. }
  156. static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
  157. if (page > 0) {
  158. if (page == 1) {
  159. page = 0;
  160. }else{
  161. page = (parseInt(page)-1) * parseInt(pagesize);
  162. }
  163. }
  164. let sessionSQL ="";
  165. let sql ="";
  166. if(status == SESSION_STATUS.ENDED){
  167. if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
  168. //找出已经结束的咨询
  169. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  170. //找出角色讨论组中为旁听且未结束的咨询
  171. 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")
  172. sessionSQL = "select s.* from " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " p " +
  173. " 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)) " +
  174. // " and s.id = p.session_id and p.participant_id = ? ORDER BY (p.last_fetch_time - s.last_message_time+1)>0,s.create_date desc limit "+page+","+pagesize;
  175. " and s.id = p.session_id and p.participant_id = ? ORDER BY s.last_message_time desc limit "+page+","+pagesize;
  176. ImDb.execQuery({
  177. "sql": sessionSQL,
  178. "args": [userId, businessType,userId,businessType,userId],
  179. "handler": handler || function (err, res) {
  180. if(err) log.error(err);
  181. }
  182. });
  183. }else{
  184. //找出已经结束的咨询
  185. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  186. //找出角色讨论组中为旁听且未结束的咨询
  187. 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")
  188. sessionSQL = "select * from "
  189. + 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;
  190. log.info("findAllByTypeAndStatus: sql " + sessionSQL);
  191. log.info("findAllByTypeAndStatus: args " + [userId, businessType,userId,businessType]);
  192. ImDb.execQuery({
  193. "sql": sessionSQL,
  194. "args": [userId, businessType,userId,businessType],
  195. "handler": handler || function (err, res) {
  196. if(err) log.error(err);
  197. }
  198. });
  199. }
  200. }else{
  201. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  202. sessionSQL = "select * from "
  203. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.business_type = ? and s.status = ? limit "+page+","+pagesize;
  204. log.info("findAllByTypeAndStatus: sql : "+sessionSQL);
  205. log.info("findAllByTypeAndStatus: args : "+[userId, businessType,status]);
  206. ImDb.execQuery({
  207. "sql": sessionSQL,
  208. "args": [userId, businessType,status],
  209. "handler": handler || function (err, res) {
  210. if(err) log.error(err);
  211. }
  212. });
  213. }
  214. }
  215. static findAllByType(userId, businessType,page,pagesize, handler) {
  216. if (page > 0) {
  217. if (page == 1) {
  218. page = 0;d
  219. }else{
  220. page = (parseInt(page)-1) * parseInt(pagesize);
  221. }
  222. }
  223. // MDT 不执行 businessType 的过滤查询 20191028
  224. if(businessType){
  225. let sessionSQL ="";
  226. let sql ="";
  227. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  228. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  229. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  230. sessionSQL = "select * from "
  231. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.business_type = ? and s.type!=0 limit "+page+","+pagesize;
  232. ImDb.execQuery({
  233. "sql": sessionSQL,
  234. "args": [userId, businessType],
  235. "handler": handler || function (err, res) {
  236. if(err) log.error(err);
  237. }
  238. });
  239. }else{
  240. let sessionSQL ="";
  241. let sql ="";
  242. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  243. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  244. sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  245. sessionSQL = "select * from "
  246. + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type!=0 limit "+page+","+pagesize;
  247. ImDb.execQuery({
  248. "sql": sessionSQL,
  249. "args": [userId],
  250. "handler": handler || function (err, res) {
  251. if(err) log.error(err);
  252. }
  253. });
  254. }
  255. }
  256. /**
  257. * 按时间跨度查询会话。
  258. *
  259. * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
  260. *
  261. * @param userId
  262. * @param dateSpan
  263. * @param handler
  264. */
  265. static findAllByTimestampAndType(userId, dateSpan, handler) {
  266. let sql = "SELECT DISTINCT s.id, CASE WHEN TYPE = 2 THEN d.name ELSE s.name END 'name',s.last_content_type, s.type, s.create_date, s.business_type " +
  267. "FROM sessions s, participants p " +
  268. "LEFT JOIN doctors d ON p.participant_id = d.id " +
  269. "WHERE s.id = p.session_id AND s.last_sender_id <> 'system' " +
  270. "AND UNIX_TIMESTAMP(s.last_message_time) > UNIX_TIMESTAMP(NOW()) - ? " +
  271. "AND p.participant_id <> ? AND s.type <> 1 AND s.business_type = 1 " +
  272. "AND s.id in (select s.id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " +
  273. "ORDER BY s.last_message_time DESC";
  274. ImDb.execQuery({
  275. sql: sql,
  276. args: [dateSpan * 3600 * 24, userId, userId],
  277. handler: handler || function (err, res) {
  278. if(err) log.error(err);
  279. }
  280. });
  281. }
  282. /**
  283. * 获取用户置顶会话
  284. *
  285. * @param userId
  286. * @param handler
  287. */
  288. static findStickySessions(userId, handler) {
  289. let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
  290. 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 + ")";
  291. ImDb.execQuery({
  292. "sql": sessionSQL,
  293. "args": [userId],
  294. "handler": handler || function (err, res) {
  295. if(err) log.error(err);
  296. }
  297. });
  298. }
  299. /**
  300. * 保存session。若会话重复创建,则更新会话名称。
  301. *
  302. * @param sessionId
  303. * @param name
  304. * @param type
  305. * @param createDate
  306. * @param businessType
  307. * @param handler
  308. */
  309. static saveSession(sessionId, name, type, createDate, businessType, handler) {
  310. let sql = "insert into " + DB_TABLES.Sessions + " (id, name, type, create_date,business_type) VALUES (?,?,?,?,?) " +
  311. "ON DUPLICATE KEY UPDATE name = ?,type = ?";
  312. ImDb.execQuery({
  313. "sql": sql,
  314. "args": [sessionId, name, type, createDate, businessType, name,type],
  315. "handler": handler || function (err, res) {
  316. if(err) log.error(err);
  317. }
  318. });
  319. }
  320. /**
  321. * 更新会话的最终状态。
  322. *
  323. * @param lastSenderId
  324. * @param lastSenderName
  325. * @param lastMessageTime
  326. * @param lastContent
  327. * @param lastContentType
  328. * @param sessionId
  329. * @param handler
  330. */
  331. static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
  332. let sql = "update " + DB_TABLES.Sessions + " set last_sender_id=?,last_sender_name=?,last_message_time=?,last_content=?,last_content_type=? where id = ?";
  333. ImDb.execQuery({
  334. "sql": sql,
  335. "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
  336. "handler": handler || function (err, res) {
  337. if(err) log.error(err);
  338. }
  339. });
  340. }
  341. /**
  342. * 保存置顶会话。
  343. *
  344. * @param sessionId
  345. * @param user
  346. * @param score
  347. */
  348. static saveStickySession(sessionId, user, score) {
  349. let sql = "insert into " + DB_TABLES.StickySessions + " (user_id,session_id,score) VALUES (?,?,?) ";
  350. ImDb.execQuery({
  351. "sql": sql,
  352. "args": [user, sessionId, score],
  353. "handler": function (err, res) {
  354. if (err) {
  355. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
  356. }
  357. }
  358. });
  359. }
  360. /**
  361. * 取消会话置顶。
  362. *
  363. * @param sessionId
  364. * @param userId
  365. */
  366. static unStickySession(sessionId, userId) {
  367. let sql = "delete from " + DB_TABLES.StickySessions + " where user_id=? and session_id=? ";
  368. ImDb.execQuery({
  369. "sql": sql,
  370. "args": [userId, sessionId],
  371. "handler": function (err, res) {
  372. if (err) {
  373. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
  374. }
  375. }
  376. });
  377. }
  378. static updateSessionStatus(sessionId,status,handler){
  379. let sql = "update " + DB_TABLES.Sessions + " set status=? where id = ?";
  380. ImDb.execQuery({
  381. "sql": sql,
  382. "args": [status, sessionId],
  383. "handler": handler || function (err, res) {
  384. if(err) log.error(err);
  385. }
  386. });
  387. }
  388. static updateSessionName(sessionId,name,handler){
  389. let sql = "update " + DB_TABLES.Sessions + " set name=? where id = ?";
  390. ImDb.execQuery({
  391. "sql": sql,
  392. "args": [name, sessionId],
  393. "handler": handler || function (err, res) {
  394. if(err) log.error(err);
  395. }
  396. });
  397. }
  398. }
  399. module.exports = SessionRepo;