session.repo.js 19 KB

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