session.repo.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /**
  2. * 会话库。
  3. */
  4. "use strict";
  5. let ImDb = require('../oracle/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. log.info("type="+type);
  135. if (page > 0) {
  136. if (page == 1) {
  137. page = 0;
  138. }else{
  139. page = (parseInt(page)-1) * parseInt(pagesize);
  140. }
  141. }
  142. let sqlTemp = "SELECT rownum r,SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN(?) GROUP BY W.SESSION_ID";
  143. let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME FROM "
  144. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sqlTemp + ") AND S.TYPE IN("+type+") ";
  145. if(status != null && status != ""){
  146. sessionSQL += " AND S.STATUS="+status
  147. }
  148. sessionSQL += " ORDER BY S.LAST_MESSAGE_TIME DESC "
  149. let sql = "SELECT*FROM ( "+sessionSQL+" AND rownum<="+pagesize+") WHERE r>="+page
  150. log.info(sessionSQL)
  151. ImDb.execQuery({
  152. "sql": sql,
  153. "args": [userId],
  154. "handler": handler || function (err, res) {
  155. if(err) log.error(err);
  156. }
  157. });
  158. }
  159. static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
  160. if (page > 0) {
  161. if (page == 1) {
  162. page = 0;
  163. }else{
  164. page = (parseInt(page)-1) * parseInt(pagesize);
  165. }
  166. }
  167. let sessionSQL ="";
  168. let sql ="";
  169. if(status == SESSION_STATUS.ENDED){
  170. if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
  171. //找出已经结束的咨询
  172. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
  173. //找出角色讨论组中为旁听且未结束的咨询
  174. 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")
  175. sessionSQL = "SELECT S.* FROM " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " P " +
  176. " 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)) " +
  177. // " 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;
  178. " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ? ORDER BY S.LAST_MESSAGE_TIME DESC LIMIT "+page+","+pagesize;
  179. ImDb.execQuery({
  180. "sql": sessionSQL,
  181. "args": [userId, businessType,userId,businessType,userId],
  182. "handler": handler || function (err, res) {
  183. if(err) log.error(err);
  184. }
  185. });
  186. }else{
  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 * FROM "
  192. + 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;
  193. log.info("findAllByTypeAndStatus: sql " + sessionSQL);
  194. log.info("findAllByTypeAndStatus: args " + [userId, businessType,userId,businessType]);
  195. ImDb.execQuery({
  196. "sql": sessionSQL,
  197. "args": [userId, businessType,userId,businessType],
  198. "handler": handler || function (err, res) {
  199. if(err) log.error(err);
  200. }
  201. });
  202. }
  203. }else{
  204. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.HOST+" GROUP BY W.SESSION_ID";
  205. sessionSQL = "SELECT * FROM "
  206. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = ? LIMIT "+page+","+pagesize;
  207. log.info("findAllByTypeAndStatus: sql : "+sessionSQL);
  208. log.info("findAllByTypeAndStatus: args : "+[userId, businessType,status]);
  209. ImDb.execQuery({
  210. "sql": sessionSQL,
  211. "args": [userId, businessType,status],
  212. "handler": handler || function (err, res) {
  213. if(err) log.error(err);
  214. }
  215. });
  216. }
  217. }
  218. static findAllByType(userId, businessType,page,pagesize, handler) {
  219. if (page > 0) {
  220. if (page == 1) {
  221. page = 0;
  222. }else{
  223. page = (parseInt(page)-1) * parseInt(pagesize);
  224. }
  225. }
  226. // MDT 不执行 businessType 的过滤查询 20191028
  227. if(businessType){
  228. let sessionSQL ="";
  229. let sql ="";
  230. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  231. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  232. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
  233. sessionSQL = "SELECT * FROM "
  234. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.TYPE!=0 LIMIT "+page+","+pagesize;
  235. ImDb.execQuery({
  236. "sql": sessionSQL,
  237. "args": [userId, businessType],
  238. "handler": handler || function (err, res) {
  239. if(err) log.error(err);
  240. }
  241. });
  242. }else{
  243. let sessionSQL ="";
  244. let sql ="";
  245. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  246. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  247. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
  248. sessionSQL = "SELECT * FROM "
  249. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.TYPE!=0 LIMIT "+page+","+pagesize;
  250. ImDb.execQuery({
  251. "sql": sessionSQL,
  252. "args": [userId],
  253. "handler": handler || function (err, res) {
  254. if(err) log.error(err);
  255. }
  256. });
  257. }
  258. }
  259. /**
  260. * 按时间跨度查询会话。
  261. *
  262. * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
  263. *
  264. * @param userId
  265. * @param dateSpan
  266. * @param handler
  267. */
  268. static findAllByTimestampAndType(userId, dateSpan, handler) {
  269. 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 " +
  270. "FROM SESSIONS S, PARTICIPANTS P " +
  271. "LEFT JOIN DOCTORS D ON P.PARTICIPANT_ID = D.ID " +
  272. "WHERE S.ID = P.SESSION_ID AND S.LAST_SENDER_ID <> 'system' " +
  273. "AND UNIX_TIMESTAMP(S.LAST_MESSAGE_TIME) > UNIX_TIMESTAMP(NOW()) - ? " +
  274. "AND P.PARTICIPANT_ID <> ? AND S.TYPE <> 1 AND S.BUSINESS_TYPE = 1 " +
  275. "AND S.ID IN (SELECT S.ID FROM SESSIONS S, PARTICIPANTS P WHERE S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ?) " +
  276. "ORDER BY S.LAST_MESSAGE_TIME DESC";
  277. ImDb.execQuery({
  278. sql: sql,
  279. args: [dateSpan * 3600 * 24, userId, userId],
  280. handler: handler || function (err, res) {
  281. if(err) log.error(err);
  282. }
  283. });
  284. }
  285. /**
  286. * 获取用户置顶会话
  287. *
  288. * @param userId
  289. * @param handler
  290. */
  291. static findStickySessions(userId, handler) {
  292. let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
  293. 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 + ")";
  294. ImDb.execQuery({
  295. "sql": sessionSQL,
  296. "args": [userId],
  297. "handler": handler || function (err, res) {
  298. if(err) log.error(err);
  299. }
  300. });
  301. }
  302. /**
  303. * 保存session。若会话重复创建,则更新会话名称。
  304. *
  305. * @param sessionId
  306. * @param name
  307. * @param type
  308. * @param createDate
  309. * @param businessType
  310. * @param handler
  311. */
  312. static saveSession(sessionId, name, type, createDate, businessType, handler) {
  313. let sql = "INSERT INTO " + DB_TABLES.Sessions + " (ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE) VALUES (?,?,?,?,?) " +
  314. "ON DUPLICATE KEY UPDATE NAME = ?,TYPE = ?";
  315. ImDb.execQuery({
  316. "sql": sql,
  317. "args": [sessionId, name, type, createDate, businessType, name,type],
  318. "handler": handler || function (err, res) {
  319. if(err) log.error(err);
  320. }
  321. });
  322. }
  323. /**
  324. * 更新会话的最终状态。
  325. *
  326. * @param lastSenderId
  327. * @param lastSenderName
  328. * @param lastMessageTime
  329. * @param lastContent
  330. * @param lastContentType
  331. * @param sessionId
  332. * @param handler
  333. */
  334. static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
  335. let sql = "UPDATE " + DB_TABLES.Sessions + " SET LAST_SENDER_ID=?,LAST_SENDER_NAME=?,LAST_MESSAGE_TIME=?,LAST_CONTENT=?,LAST_CONTENT_TYPE=? WHERE ID = ?";
  336. ImDb.execQuery({
  337. "sql": sql,
  338. "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
  339. "handler": handler || function (err, res) {
  340. if(err) log.error(err);
  341. }
  342. });
  343. }
  344. /**
  345. * 保存置顶会话。
  346. *
  347. * @param sessionId
  348. * @param user
  349. * @param score
  350. */
  351. static saveStickySession(sessionId, user, score) {
  352. let sql = "INSERT INTO " + DB_TABLES.StickySessions + " (USER_ID,SESSION_ID,SCORE) VALUES (?,?,?) ";
  353. ImDb.execQuery({
  354. "sql": sql,
  355. "args": [user, sessionId, score],
  356. "handler": function (err, res) {
  357. if (err) {
  358. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
  359. }
  360. }
  361. });
  362. }
  363. /**
  364. * 取消会话置顶。
  365. *
  366. * @param sessionId
  367. * @param userId
  368. */
  369. static unStickySession(sessionId, userId) {
  370. let sql = "DELETE FROM " + DB_TABLES.StickySessions + " WHERE USER_ID=? AND SESSION_ID=? ";
  371. ImDb.execQuery({
  372. "sql": sql,
  373. "args": [userId, sessionId],
  374. "handler": function (err, res) {
  375. if (err) {
  376. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
  377. }
  378. }
  379. });
  380. }
  381. static updateSessionStatus(sessionId,status,handler){
  382. let sql = "UPDATE " + DB_TABLES.Sessions + " SET STATUS=? WHERE ID = ?";
  383. ImDb.execQuery({
  384. "sql": sql,
  385. "args": [status, sessionId],
  386. "handler": handler || function (err, res) {
  387. if(err) log.error(err);
  388. }
  389. });
  390. }
  391. static updateSessionName(sessionId,name,handler){
  392. let sql = "UPDATE " + DB_TABLES.Sessions + " SET NAME=? WHERE ID = ?";
  393. ImDb.execQuery({
  394. "sql": sql,
  395. "args": [name, sessionId],
  396. "handler": handler || function (err, res) {
  397. if(err) log.error(err);
  398. }
  399. });
  400. }
  401. }
  402. module.exports = SessionRepo;