session.repo.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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 S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"CREATE_DATE\" AS \"create_date\",S.\"BUSINESS_TYPE\" as \"business_type\" FROM " + DB_TABLES.Sessions + " S WHERE S.ID = :ID";
  24. oracledbUtil.query({
  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 = :PARTICIPANT_ID 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 S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  42. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+")";
  43. oracledbUtil.query({
  44. "sql": sessionSQL,
  45. "args": [userId],
  46. "handler": handler || function (err, res) {
  47. if(err) log.error(err);
  48. }
  49. });
  50. }
  51. /**
  52. * 获取用户全部(未结束的)会话不包含角色未1的会话
  53. * @param userId
  54. * @param handler
  55. */
  56. static findUnEndAll(userId, handler) {
  57. let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID AND PARTICIPANT_ROLE =0 GROUP BY W.SESSION_ID";
  58. 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";
  59. let sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  60. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+") AND S.`STATUS` = 0";
  61. oracledbUtil.query({
  62. "sql": sessionSQL,
  63. "args": [userId],
  64. "handler": handler || function (err, res) {
  65. if(err) log.error(err);
  66. }
  67. });
  68. }
  69. /**
  70. * 获取用户全部会话忽略角色
  71. *
  72. * @param userId
  73. * @param handler
  74. */
  75. static findAllIgnoreRole(userId, handler) {
  76. let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  77. 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";
  78. let sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  79. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+")";
  80. oracledbUtil.query({
  81. "sql": sessionSQL,
  82. "args": [userId],
  83. "handler": handler || function (err, res) {
  84. if(err) log.error(err);
  85. }
  86. });
  87. }
  88. /**
  89. * 获取用户全部会话
  90. *
  91. * @param userId
  92. * @param type
  93. * @param handler
  94. */
  95. static findAllByType(userId, type, handler) {
  96. let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID AND TYPE=:TYPE GROUP BY W.SESSION_ID";
  97. let sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  98. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") ";
  99. oracledbUtil.query({
  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\" as \"session_id\" COUNT as \"count\" FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  115. let sessionSQL = "SELECT COUNT(ID) COUNT as \"count\" FROM " + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.TYPE=:TYPE ";
  116. if(status != null){
  117. sessionSQL = sessionSQL + " AND S.STATUS="+status;
  118. }
  119. oracledbUtil.query({
  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 SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN(:USER_ID) GROUP BY W.SESSION_ID";
  143. 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 "
  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. let sql = "SELECT * FROM ( "+sessionSQL+" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page
  149. // log.info(sessionSQL)
  150. oracledbUtil.query({
  151. "sql": sql,
  152. "args": [userId],
  153. "handler": handler || function (err, res) {
  154. if(err) log.error(err);
  155. }
  156. });
  157. }
  158. static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
  159. if (page > 0) {
  160. if (page == 1) {
  161. page = 0;
  162. }else{
  163. page = (parseInt(page)-1) * parseInt(pagesize);
  164. }
  165. }
  166. let sessionSQL ="";
  167. let sql ="";
  168. if(status == SESSION_STATUS.ENDED){
  169. if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
  170. //找出已经结束的咨询
  171. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  172. //找出角色讨论组中为旁听且未结束的咨询
  173. let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
  174. sessionSQL = "SELECT rownum r, S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM " + DB_TABLES.Sessions + " S, " + DB_TABLES.Participants + " P " +
  175. " WHERE ((S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.STATUS = 0)) " +
  176. // " 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;
  177. " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = :PARTICIPANT_ID ";
  178. sessionSQL = "SELECT*FROM ( " + sessionSQL +" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page;
  179. oracledbUtil.query({
  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 = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  189. //找出角色讨论组中为旁听且未结束的咨询
  190. let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
  191. sessionSQL = "SELECT rownum r, S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  192. + DB_TABLES.Sessions + " S WHERE (S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.STATUS = 0) ";
  193. sessionSQL = "SELECT*FROM ( " + sessionSQL +" AND rownum<="+pagesize+") WHERE r>="+page;
  194. log.info("findAllByTypeAndStatus: sql " + sessionSQL);
  195. log.info("findAllByTypeAndStatus: args " + [userId, businessType,userId,businessType]);
  196. oracledbUtil.query({
  197. "sql": sessionSQL,
  198. "args": [userId, businessType,userId,businessType],
  199. "handler": handler || function (err, res) {
  200. if(err) log.error(err);
  201. }
  202. });
  203. }
  204. }else{
  205. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.HOST+" GROUP BY W.SESSION_ID";
  206. sessionSQL = "SELECT rownum r, S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  207. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.STATUS = :STATUS ";
  208. sessionSQL = "SELECT*FROM ( " + sessionSQL +" AND rownum<="+pagesize+") WHERE r>="+page;
  209. log.info("findAllByTypeAndStatus: sql : "+sessionSQL);
  210. log.info("findAllByTypeAndStatus: args : "+[userId, businessType,status]);
  211. oracledbUtil.query({
  212. "sql": sessionSQL,
  213. "args": [userId, businessType,status],
  214. "handler": handler || function (err, res) {
  215. if(err) log.error(err);
  216. }
  217. });
  218. }
  219. }
  220. static findAllByType(userId, businessType,page,pagesize, handler) {
  221. if (page > 0) {
  222. if (page == 1) {
  223. page = 0;
  224. }else{
  225. page = (parseInt(page)-1) * parseInt(pagesize);
  226. }
  227. }
  228. // MDT 不执行 businessType 的过滤查询 20191028
  229. if(businessType){
  230. let sessionSQL ="";
  231. let sql ="";
  232. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  233. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  234. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  235. sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  236. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = :BUSINESS_TYPE AND S.TYPE!=0 LIMIT "+page+","+pagesize;
  237. oracledbUtil.query({
  238. "sql": sessionSQL,
  239. "args": [userId, businessType],
  240. "handler": handler || function (err, res) {
  241. if(err) log.error(err);
  242. }
  243. });
  244. }else{
  245. let sessionSQL ="";
  246. let sql ="";
  247. //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
  248. //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
  249. sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :userId GROUP BY W.SESSION_ID";
  250. sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"BUSINESS_TYPE\" AS \"business_type\",S.\"STATUS\" AS \"status\",S.\"CREATE_DATE\" AS \"create_date\",S.\"LAST_SENDER_ID\" AS \"last_sender_id\",S.\"LAST_SENDER_NAME\" AS \"last_sender_name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"LAST_CONTENT\" AS \"last_content\",S.\"LAST_MESSAGE_TIME\" AS \"last_message_time\",S.\"BAK_ID\" AS \"bak_id\" FROM "
  251. + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.TYPE!=0 LIMIT "+page+","+pagesize;
  252. oracledbUtil.query({
  253. "sql": sessionSQL,
  254. "args": [userId],
  255. "handler": handler || function (err, res) {
  256. if(err) log.error(err);
  257. }
  258. });
  259. }
  260. }
  261. /**
  262. * 按时间跨度查询会话。
  263. *
  264. * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
  265. *
  266. * @param userId
  267. * @param dateSpan
  268. * @param handler
  269. */
  270. static findAllByTimestampAndType(userId, dateSpan, handler) {
  271. let sql = "SELECT DISTINCT S.\"ID\" AS \"id\",CASE WHEN TYPE=2 THEN D.\"NAME\" AS \"name\" ELSE S.\"NAME\" AS \"name\" END 'NAME' AS \"name\",S.\"LAST_CONTENT_TYPE\" AS \"last_content_type\",S.\"TYPE\" AS \"type\",S.\"CREATE_DATE\" AS \"create_date\",S.\"BUSINESS_TYP\" E AS \"business_type\" " +
  272. "FROM SESSIONS S, PARTICIPANTS P " +
  273. "LEFT JOIN DOCTORS D ON P.PARTICIPANT_ID = D.ID " +
  274. "WHERE S.ID = P.SESSION_ID AND S.LAST_SENDER_ID <> 'system' " +
  275. "AND UNIX_TIMESTAMP(S.LAST_MESSAGE_TIME) > UNIX_TIMESTAMP(NOW()) - "+dateSpan * 3600 * 24+" " +
  276. "AND P.PARTICIPANT_ID <> :PARTICIPANT_ID AND S.TYPE <> 1 AND S.BUSINESS_TYPE = 1 " +
  277. "AND S.ID IN (SELECT S.ID FROM SESSIONS S, PARTICIPANTS P WHERE S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = :PARTICIPANT_ID) " +
  278. "ORDER BY S.LAST_MESSAGE_TIME DESC";
  279. oracledbUtil.query({
  280. sql: sql,
  281. args: [ userId, userId],
  282. handler: handler || function (err, res) {
  283. if(err) log.error(err);
  284. }
  285. });
  286. }
  287. /**
  288. * 获取用户置顶会话
  289. *
  290. * @param userId
  291. * @param handler
  292. */
  293. static findStickySessions(userId, handler) {
  294. let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = :PARTICIPANT_ID GROUP BY W.SESSION_ID";
  295. let sessionSQL = "SELECT S.\"ID\" AS \"id\",S.\"NAME\" AS \"name\",S.\"TYPE\" AS \"type\",S.\"CREATE_DATE\" AS \"create_date\" FROM " + DB_TABLES.Sessions + " S," + DB_TABLES.StickySessions + " SS WHERE S.ID = SS.SESSION_ID S.ID IN(" + sql + ")";
  296. oracledbUtil.query({
  297. "sql": sessionSQL,
  298. "args": [userId],
  299. "handler": handler || function (err, res) {
  300. if(err) log.error(err);
  301. }
  302. });
  303. }
  304. /**
  305. * 保存session。若会话重复创建,则更新会话名称。
  306. *
  307. * @param sessionId
  308. * @param name
  309. * @param type
  310. * @param createDate
  311. * @param businessType
  312. * @param handler
  313. */
  314. static saveSession(sessionId, name, type, createDate, businessType, handler) {
  315. let sql = "INSERT INTO " + DB_TABLES.Sessions + " (ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE) VALUES (:ID,:NAME,:TYPE,:CREATE_DATE,:BUSINESS_TYPE) " +
  316. "ON DUPLICATE KEY UPDATE NAME = :NAME,TYPE = :TYPE";
  317. oracledbUtil.query({
  318. "sql": sql,
  319. "args": [sessionId, name, type, createDate, businessType, name,type],
  320. "handler": handler || function (err, res) {
  321. if(err) log.error(err);
  322. }
  323. });
  324. }
  325. /**
  326. * 更新会话的最终状态。
  327. *
  328. * @param lastSenderId
  329. * @param lastSenderName
  330. * @param lastMessageTime
  331. * @param lastContent
  332. * @param lastContentType
  333. * @param sessionId
  334. * @param handler
  335. */
  336. static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
  337. let sql = "UPDATE " + DB_TABLES.Sessions + " SET LAST_SENDER_ID=:LAST_SENDER_ID,LAST_SENDER_NAME=:LAST_SENDER_NAME,LAST_MESSAGE_TIME=:LAST_MESSAGE_TIME,LAST_CONTENT=:LAST_CONTENT,LAST_CONTENT_TYPE=:LAST_CONTENT_TYPE WHERE ID = :ID";
  338. oracledbUtil.query({
  339. "sql": sql,
  340. "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
  341. "handler": handler || function (err, res) {
  342. if(err) log.error(err);
  343. }
  344. });
  345. }
  346. /**
  347. * 保存置顶会话。
  348. *
  349. * @param sessionId
  350. * @param user
  351. * @param score
  352. */
  353. static saveStickySession(sessionId, user, score) {
  354. let sql = "INSERT INTO " + DB_TABLES.StickySessions + " (USER_ID,SESSION_ID,SCORE) VALUES (:USER_ID,:SESSION_ID,:SCORE) ";
  355. oracledbUtil.query({
  356. "sql": sql,
  357. "args": [user, sessionId, score],
  358. "handler": function (err, res) {
  359. if (err) {
  360. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
  361. }
  362. }
  363. });
  364. }
  365. /**
  366. * 取消会话置顶。
  367. *
  368. * @param sessionId
  369. * @param userId
  370. */
  371. static unStickySession(sessionId, userId) {
  372. let sql = "DELETE FROM " + DB_TABLES.StickySessions + " WHERE USER_ID=:USER_ID AND SESSION_ID=:SESSION_ID ";
  373. oracledbUtil.query({
  374. "sql": sql,
  375. "args": [userId, sessionId],
  376. "handler": function (err, res) {
  377. if (err) {
  378. log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
  379. }
  380. }
  381. });
  382. }
  383. static updateSessionStatus(sessionId,status,handler){
  384. let sql = "UPDATE " + DB_TABLES.Sessions + " SET STATUS=:STATUS WHERE ID = :ID";
  385. oracledbUtil.query({
  386. "sql": sql,
  387. "args": [status, sessionId],
  388. "handler": handler || function (err, res) {
  389. if(err) log.error(err);
  390. }
  391. });
  392. }
  393. static updateSessionName(sessionId,name,handler){
  394. let sql = "UPDATE " + DB_TABLES.Sessions + " SET NAME=:NAME WHERE ID = :ID";
  395. oracledbUtil.query({
  396. "sql": sql,
  397. "args": [name, sessionId],
  398. "handler": handler || function (err, res) {
  399. if(err) log.error(err);
  400. }
  401. });
  402. }
  403. }
  404. module.exports = SessionRepo;