MessageDataManager.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. using Model.Enum;
  2. using Model.Notice;
  3. using ZmajService.Common;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using TF.Common.Tools;
  11. using TF.Logger;
  12. namespace ZmajService.Service.Message
  13. {
  14. class MessageDataManager
  15. {
  16. /// <summary>
  17. /// 将上报的消息写入数据库
  18. /// </summary>
  19. /// <param name="models"></param>
  20. /// <returns></returns>
  21. public async Task<MessageResultModel> Add(UploadMessageModel models)
  22. {
  23. OracleHelper orcl = new OracleHelper();
  24. if (models == null || models.ReceiveUser == null || models.ReceiveUser.Count == 0)
  25. {
  26. return null;
  27. }
  28. List<string> sqls = new List<string>();
  29. List<MessageModel> results = new List<MessageModel>();
  30. for (int i = 0; i < models.ReceiveUser.Count; i++)
  31. {
  32. string id = Guid.NewGuid().ToString("N");
  33. string sid = models.SourceId;
  34. ReceiveUser receiveUser = models.ReceiveUser[i];
  35. if (receiveUser == null || string.IsNullOrEmpty(receiveUser.ReceiveUserId))
  36. {
  37. throw new Exception($"Receice user is null, index is {i}");
  38. }
  39. string receiveType = models.ReceiveUserType.ToString();
  40. if (receiveType == ReceiveUserType.Group.ToString())
  41. {
  42. if (string.IsNullOrEmpty(receiveUser.ReceiveUserId) || string.IsNullOrEmpty(receiveUser.ReceiveCompanyId))
  43. {
  44. throw new Exception($"If receive type is group, receive user and receive com can not null, index is {i}");
  45. }
  46. }
  47. string messageType = models.MessageType.ToString();
  48. string content = models.Content;
  49. if (string.IsNullOrEmpty(content))
  50. {
  51. throw new Exception($"Content is null, index is {i}");
  52. }
  53. string custum = models.Custum;
  54. string url = models.Url;
  55. string urlname = models.UrlName;
  56. int startTime = models.StartTime;
  57. int stopTime = models.StopTime;
  58. int blankTime = models.BlankTime;
  59. int isNoticeApp = models.IsNoticeApp ? 1 : 0;
  60. string createUser = models.CreateUser;
  61. int createTime = TimeUtil.Timestamp();
  62. if (string.IsNullOrEmpty(createUser))
  63. {
  64. throw new Exception($"CreateUser is null, index is {i}");
  65. }
  66. string insertSql = $@"insert into sys_msg
  67. (id,sourceid, receiveuser,receivecompany, receiveusertype, messagetype, content, custum, url, starttime, stoptime, blanktime, isactive, isnoticeapp, createuser,createtime,urlname)
  68. values
  69. ('{id}', '{sid}','{receiveUser.ReceiveUserId}', '{receiveUser.ReceiveCompanyId}', '{receiveType}', '{messageType}', '{content}', '{custum}', '{url}', {startTime}, {stopTime}, {blankTime}, 1, {isNoticeApp}, '{createUser}',{createTime},'{urlname}')";
  70. sqls.Add(insertSql);
  71. if (models.ReceiveUserType == ReceiveUserType.Company)
  72. {
  73. string companySql = $"select ocode from sys_operators where ossgs = '{receiveUser.ReceiveUserId}'";
  74. DataTable comDt = await orcl.Query(companySql);
  75. if (comDt.Rows.Count <= 0)
  76. {
  77. continue;
  78. }
  79. foreach (DataRow item in comDt.Rows)
  80. {
  81. string comUid = item["ocode"].ToString();
  82. if (string.IsNullOrEmpty(comUid))
  83. {
  84. continue;
  85. }
  86. string itemId = Guid.NewGuid().ToString("N");
  87. string stateSql = $@"insert into sys_msg_state
  88. (id, sourceid, userid, mid, lasttime, nexttime, isread, iscancel, canceltime, appstate)
  89. values
  90. ('{itemId}', '{sid}', '{comUid}', '{id}', 0, 0, 0, 0, 0, 0)";
  91. results.Add(new MessageModel()
  92. {
  93. Id = itemId,
  94. });
  95. sqls.Add(stateSql);
  96. }
  97. }
  98. else if (models.ReceiveUserType == ReceiveUserType.Group)
  99. {
  100. string groupSql = $"select ocode from sys_operators where ossbm='{receiveUser.ReceiveUserId}' and ossgs = '{receiveUser.ReceiveCompanyId}'";
  101. DataTable groupDt = await orcl.Query(groupSql);
  102. if (groupDt.Rows.Count <= 0)
  103. {
  104. continue;
  105. }
  106. foreach (DataRow item in groupDt.Rows)
  107. {
  108. string groupUid = item["ocode"].ToString();
  109. if (string.IsNullOrEmpty(groupUid))
  110. {
  111. continue;
  112. }
  113. string itemId = Guid.NewGuid().ToString("N");
  114. string stateSql = $@"insert into sys_msg_state
  115. (id, sourceid, userid, mid, lasttime, nexttime, isread, iscancel, canceltime, appstate)
  116. values
  117. ('{itemId}', '{sid}', '{groupUid}', '{id}', 0, 0, 0, 0, 0, 0)";
  118. results.Add(new MessageModel()
  119. {
  120. Id = itemId,
  121. });
  122. sqls.Add(stateSql);
  123. }
  124. }
  125. else
  126. {
  127. string itemId = Guid.NewGuid().ToString("N");
  128. string stateSql = $@"insert into sys_msg_state
  129. (id, sourceid, userid, mid, lasttime, nexttime, isread, iscancel, canceltime, appstate)
  130. values
  131. ('{itemId}', '{sid}', '{receiveUser.ReceiveUserId}', '{id}', 0, 0, 0, 0, 0, 0)";
  132. results.Add(new MessageModel()
  133. {
  134. Id = itemId,
  135. });
  136. sqls.Add(stateSql);
  137. }
  138. }
  139. try
  140. {
  141. if (await orcl.ExecuteSqlTran(sqls))
  142. {
  143. return new MessageResultModel()
  144. {
  145. Code = 0,
  146. Message = "Success",
  147. Data = results,
  148. };
  149. }
  150. else
  151. {
  152. throw new Exception("Save models to db failed.");
  153. }
  154. }
  155. catch (Exception ex)
  156. {
  157. Log.Error($"Save data failed.{ex.Message}", ex);
  158. throw new Exception($"Save data failed.{ex.Message}");
  159. }
  160. }
  161. /// <summary>
  162. /// 获取全部待发送的消息
  163. /// </summary>
  164. /// <returns></returns>
  165. public async Task<List<MessageModel>> GetAllMessage()
  166. {
  167. try
  168. {
  169. int nowTime = TimeUtil.Timestamp();
  170. string sql = $@"select state.id,
  171. msg.sourceid,
  172. msg.receiveuser,
  173. msg.receivecompany,
  174. msg.receiveusertype,
  175. msg.messagetype,
  176. msg.content,
  177. msg.custum,
  178. msg.url,
  179. msg.starttime,
  180. msg.stoptime,
  181. msg.isactive,
  182. msg.isnoticeapp,
  183. msg.createuser,
  184. msg.blanktime,
  185. msg.createtime,
  186. state.userid,
  187. state.lasttime,
  188. state.nexttime,
  189. state.isread,
  190. state.iscancel,
  191. state.appstate
  192. from sys_msg msg
  193. left join sys_msg_state state
  194. on msg.id = state.mid
  195. where msg.starttime <= {nowTime}
  196. and (msg.stoptime >= {nowTime} or msg.stoptime = 0)
  197. and msg.isactive = 1
  198. and msg.blanktime != 0
  199. and state.nexttime <= {nowTime}
  200. and state.iscancel = 0";
  201. OracleHelper orcl = new OracleHelper();
  202. DataTable dt = await orcl.Query(sql);
  203. if (dt == null || dt.Rows.Count == 0)
  204. {
  205. return null;
  206. }
  207. List<MessageModel> models = new List<MessageModel>();
  208. foreach (DataRow row in dt.Rows)
  209. {
  210. MessageModel model = new MessageModel()
  211. {
  212. Id = row["ID"].ToString(),
  213. SourceId = row["SOURCEID"].ToString(),
  214. ReceiveUserId = row["USERID"].ToString(),
  215. ReceiveUserType = Enum.Parse<ReceiveUserType>(row["RECEIVEUSERTYPE"].ToString()),
  216. MessageType = Enum.Parse<MessageType>(row["MESSAGETYPE"].ToString()),
  217. Content = row["CONTENT"].ToString(),
  218. Custum = row["CUSTUM"].ToString(),
  219. Url = row["URL"].ToString(),
  220. StartTime = Convert.ToInt32(row["STARTTIME"]),
  221. StopTime = Convert.ToInt32(row["STOPTIME"]),
  222. LastTime = Convert.ToInt32(row["LASTTIME"]),
  223. BlankTime = Convert.ToInt32(row["BLANKTIME"]),
  224. NextTime = Convert.ToInt32(row["NEXTTIME"]),
  225. IsActive = row["ISACTIVE"].ToString() == "1" ? true : false,
  226. IsCancel = row["ISCANCEL"].ToString() == "1" ? true : false,
  227. IsRead = row["ISREAD"].ToString() == "1" ? true : false,
  228. IsNoticeApp = row["ISNOTICEAPP"].ToString() == "1" ? true : false,
  229. UserId = row["USERID"].ToString(),
  230. CreateUser = row["CREATEUSER"].ToString(),
  231. CreateTime = Convert.ToInt32(row["CREATETIME"]),
  232. AppState = row["APPSTATE"].ToString() == "1" ? true : false,
  233. };
  234. models.Add(model);
  235. }
  236. return models;
  237. }
  238. catch (Exception ex)
  239. {
  240. Log.Error($"Get data failed.{ex.Message}", ex);
  241. return null;
  242. }
  243. }
  244. /// <summary>
  245. /// 获取登录用户待发送消息
  246. /// </summary>
  247. /// <returns></returns>
  248. public async Task<List<MessageModel>> GetMessageByUid(string userid)
  249. {
  250. try
  251. {
  252. int nowTime = TimeUtil.Timestamp();
  253. string sql = $@"select state.id,
  254. msg.sourceid,
  255. msg.receiveuser,
  256. msg.receivecompany,
  257. msg.receiveusertype,
  258. msg.messagetype,
  259. msg.content,
  260. msg.custum,
  261. msg.url,
  262. msg.starttime,
  263. msg.stoptime,
  264. msg.isactive,
  265. msg.isnoticeapp,
  266. msg.createuser,
  267. msg.blanktime,
  268. msg.createtime,
  269. state.userid,
  270. state.lasttime,
  271. state.nexttime,
  272. state.isread,
  273. state.iscancel,
  274. state.appstate
  275. from sys_msg msg
  276. left join sys_msg_state state
  277. on msg.id = state.mid
  278. where msg.starttime <= {nowTime}
  279. and (msg.stoptime >= {nowTime} or msg.stoptime = 0)
  280. and msg.isactive = 1
  281. and state.iscancel = 0
  282. and state.nexttime <= {nowTime}
  283. and state.userid = '{userid}'";
  284. OracleHelper orcl = new OracleHelper();
  285. DataTable dt = await orcl.Query(sql);
  286. if (dt == null || dt.Rows.Count == 0)
  287. {
  288. return null;
  289. }
  290. List<MessageModel> models = new List<MessageModel>();
  291. foreach (DataRow row in dt.Rows)
  292. {
  293. MessageModel model = new MessageModel()
  294. {
  295. Id = row["ID"].ToString(),
  296. SourceId = row["SOURCEID"].ToString(),
  297. ReceiveUserId = row["USERID"].ToString(),
  298. ReceiveUserType = Enum.Parse<ReceiveUserType>(row["RECEIVEUSERTYPE"].ToString()),
  299. MessageType = Enum.Parse<MessageType>(row["MESSAGETYPE"].ToString()),
  300. Content = row["CONTENT"].ToString(),
  301. Custum = row["CUSTUM"].ToString(),
  302. Url = row["URL"].ToString(),
  303. StartTime = Convert.ToInt32(row["STARTTIME"]),
  304. StopTime = Convert.ToInt32(row["STOPTIME"]),
  305. LastTime = Convert.ToInt32(row["LASTTIME"]),
  306. BlankTime = Convert.ToInt32(row["BLANKTIME"]),
  307. NextTime = Convert.ToInt32(row["NEXTTIME"]),
  308. IsActive = row["ISACTIVE"].ToString() == "1" ? true : false,
  309. IsCancel = row["ISCANCEL"].ToString() == "1" ? true : false,
  310. IsRead = row["ISREAD"].ToString() == "1" ? true : false,
  311. IsNoticeApp = row["ISNOTICEAPP"].ToString() == "1" ? true : false,
  312. UserId = row["USERID"].ToString(),
  313. CreateUser = row["CREATEUSER"].ToString(),
  314. CreateTime = Convert.ToInt32(row["CREATETIME"]),
  315. AppState = row["APPSTATE"].ToString() == "1" ? true : false,
  316. };
  317. models.Add(model);
  318. }
  319. return models;
  320. }
  321. catch (Exception ex)
  322. {
  323. Log.Error($"Get data failed.{ex.Message}", ex);
  324. return null;
  325. }
  326. }
  327. /// <summary>
  328. /// 更具消息ID获取消息
  329. /// </summary>
  330. /// <returns></returns>
  331. public async Task<List<MessageModel>> GetMessageByReceiveUser(List<MessageModel> receiveIdList)
  332. {
  333. try
  334. {
  335. if (receiveIdList == null || receiveIdList.Count == 0)
  336. {
  337. return null;
  338. }
  339. StringBuilder sb = new StringBuilder();
  340. sb.Append("(");
  341. for (int i = 0; i < receiveIdList.Count; i++)
  342. {
  343. if (i == receiveIdList.Count - 1)
  344. {
  345. sb.Append($"'{receiveIdList[i].Id}'");
  346. }
  347. else
  348. {
  349. sb.Append($"'{receiveIdList[i].Id}',");
  350. }
  351. }
  352. sb.Append(")");
  353. int nowTime = TimeUtil.Timestamp() + 3;
  354. OracleHelper orcl = new OracleHelper();
  355. List<MessageModel> models = new List<MessageModel>();
  356. string sql = $@"select state.id,
  357. msg.sourceid,
  358. msg.receiveuser,
  359. msg.receivecompany,
  360. msg.receiveusertype,
  361. msg.messagetype,
  362. msg.content,
  363. msg.custum,
  364. msg.url,
  365. msg.starttime,
  366. msg.stoptime,
  367. msg.isactive,
  368. msg.isnoticeapp,
  369. msg.createuser,
  370. msg.blanktime,
  371. msg.createtime,
  372. state.userid,
  373. state.lasttime,
  374. state.nexttime,
  375. state.isread,
  376. state.iscancel,
  377. state.appstate
  378. from sys_msg msg
  379. left join sys_msg_state state
  380. on msg.id = state.mid
  381. where msg.starttime <= {nowTime}
  382. and (msg.stoptime >= {nowTime} or msg.stoptime = 0)
  383. and msg.isactive = 1
  384. and state.iscancel = 0
  385. and state.id in {sb.ToString()}";
  386. DataTable dt = await orcl.Query(sql);
  387. if (dt == null || dt.Rows.Count == 0)
  388. {
  389. return null;
  390. }
  391. foreach (DataRow row in dt.Rows)
  392. {
  393. MessageModel model = new MessageModel()
  394. {
  395. Id = row["ID"].ToString(),
  396. SourceId = row["SOURCEID"].ToString(),
  397. ReceiveUserId = row["USERID"].ToString(),
  398. ReceiveUserType = Enum.Parse<ReceiveUserType>(row["RECEIVEUSERTYPE"].ToString()),
  399. MessageType = Enum.Parse<MessageType>(row["MESSAGETYPE"].ToString()),
  400. Content = row["CONTENT"].ToString(),
  401. Custum = row["CUSTUM"].ToString(),
  402. Url = row["URL"].ToString(),
  403. StartTime = Convert.ToInt32(row["STARTTIME"]),
  404. StopTime = Convert.ToInt32(row["STOPTIME"]),
  405. LastTime = Convert.ToInt32(row["LASTTIME"]),
  406. BlankTime = Convert.ToInt32(row["BLANKTIME"]),
  407. NextTime = Convert.ToInt32(row["NEXTTIME"]),
  408. IsActive = row["ISACTIVE"].ToString() == "1" ? true : false,
  409. IsCancel = row["ISCANCEL"].ToString() == "1" ? true : false,
  410. IsRead = row["ISREAD"].ToString() == "1" ? true : false,
  411. IsNoticeApp = row["ISNOTICEAPP"].ToString() == "1" ? true : false,
  412. UserId = row["USERID"].ToString(),
  413. CreateUser = row["CREATEUSER"].ToString(),
  414. CreateTime = Convert.ToInt32(row["CREATETIME"]),
  415. AppState = row["APPSTATE"].ToString() == "1" ? true : false,
  416. };
  417. models.Add(model);
  418. }
  419. return models;
  420. }
  421. catch (Exception ex)
  422. {
  423. Log.Error($"Get data failed.{ex.Message}", ex);
  424. return null;
  425. }
  426. }
  427. /// <summary>
  428. /// 取消发送某条消息
  429. /// </summary>
  430. /// <returns></returns>
  431. public async Task<bool> Cancel(CancelMeesageModel cancel)
  432. {
  433. try
  434. {
  435. string messageId = cancel.MessageId;
  436. string cancelSql = $"update sys_msg_state set iscancel = 1,canceltime = {TimeUtil.Timestamp()} where id = '{messageId}'";
  437. OracleHelper orcl = new OracleHelper();
  438. int cout = await orcl.ExecuteNonQuery(cancelSql);
  439. if (cout > 0)
  440. {
  441. return true;
  442. }
  443. else
  444. {
  445. return false;
  446. }
  447. }
  448. catch (Exception ex)
  449. {
  450. Log.Error($"Cancel data failed.{ex.Message}", ex);
  451. return false;
  452. }
  453. }
  454. /// <summary>
  455. /// 取消发送某条消息
  456. /// </summary>
  457. /// <returns></returns>
  458. public async Task<bool> Read(ReadMeesageModel read)
  459. {
  460. try
  461. {
  462. string messageId = read.MessageId;
  463. string readSql = $"update sys_msg_state set isread = 1 where id = '{messageId}'";
  464. OracleHelper orcl = new OracleHelper();
  465. int cout = await orcl.ExecuteNonQuery(readSql);
  466. if (cout > 0)
  467. {
  468. return true;
  469. }
  470. else
  471. {
  472. return false;
  473. }
  474. }
  475. catch (Exception ex)
  476. {
  477. Log.Error($"Read data failed.{ex.Message}", ex);
  478. return false;
  479. }
  480. }
  481. /// <summary>
  482. /// 设置消息发送状态
  483. /// </summary>
  484. /// <param name="model"></param>
  485. /// <returns></returns>
  486. public async Task<bool> SetPublishState(MessageModel model)
  487. {
  488. if (model == null)
  489. {
  490. return false;
  491. }
  492. try
  493. {
  494. string updateSql = $@"update sys_msg_state
  495. set lasttime = {model.LastTime},
  496. nexttime = {model.NextTime}
  497. where id = '{model.Id}'";
  498. OracleHelper orcl = new OracleHelper();
  499. int cout = await orcl.ExecuteNonQuery(updateSql);
  500. if (cout > 0)
  501. {
  502. return true;
  503. }
  504. else
  505. {
  506. return false;
  507. }
  508. }
  509. catch (Exception ex)
  510. {
  511. Log.Error($"Update publish state data failed.{ex.Message}", ex);
  512. return false;
  513. }
  514. }
  515. /// <summary>
  516. /// 设置消息发送状态
  517. /// </summary>
  518. /// <param name="model"></param>
  519. /// <returns></returns>
  520. public async Task<bool> SetAppPublishState(MessageModel model)
  521. {
  522. if (model == null)
  523. {
  524. return false;
  525. }
  526. try
  527. {
  528. string updateSql = $@"update sys_msg_state set appstate = 1 where id = '{model.Id}'";
  529. OracleHelper orcl = new OracleHelper();
  530. int cout = await orcl.ExecuteNonQuery(updateSql);
  531. if (cout > 0)
  532. {
  533. return true;
  534. }
  535. else
  536. {
  537. return false;
  538. }
  539. }
  540. catch (Exception ex)
  541. {
  542. Log.Error($"Update app publish state data failed.{ex.Message}", ex);
  543. return false;
  544. }
  545. }
  546. }
  547. }