WebPortalController.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947
  1. using DataSharing.FwDataExchange;
  2. using DataSharing.RawData;
  3. using DataSharing.Share.Dtos.HotlineSetting;
  4. using DataSharing.Share.Dtos.WebPortal;
  5. using DataSharing.WebPortal;
  6. using DotNetCore.CAP;
  7. using Fw.Utility.UnifyResponse;
  8. using Hotline.Api.Sdk;
  9. using Hotline.Share.Dtos.Order;
  10. using Hotline.Share.Enums.Push;
  11. using MapsterMapper;
  12. using MediatR;
  13. using Microsoft.AspNetCore.Authorization;
  14. using Microsoft.AspNetCore.Mvc;
  15. using SqlSugar;
  16. using XF.Domain.Cache;
  17. using XF.Domain.Filters;
  18. using XF.Domain.Repository;
  19. namespace DataSharing.Host.Controllers
  20. {
  21. /// <summary>
  22. /// 门户网站数据获取
  23. /// </summary>
  24. public class WebPortalController : BaseController
  25. {
  26. private readonly IMapper _mapper;
  27. private readonly IMediator _mediator;
  28. private readonly ICapPublisher _capPublisher;
  29. private readonly IRepository<DsBulletin> _bulletinRepository;
  30. private readonly IRepository<DsOrder> _dataOrderRepository;
  31. private readonly IRepository<DsWebFlowAccept> _webFlowAcceptRepository;
  32. private readonly IRepository<DsWebUserRegister> _webUserRegisterRepository;
  33. private readonly IRepository<DsWebUserAuth> _webUserAuthRepository;
  34. private readonly IChannelConfigurationManager _channelConfigurationManager;
  35. private readonly ITypedCache<WriteLettersSendSmsDto> _writeLettersSendSms;
  36. private readonly IRepository<DsHotspot> _dsHotspotRepository;
  37. private readonly IRepository<DsOrderVisit> _dsOrderVisitRepository;
  38. private readonly FwClient _fwClient;
  39. /// <summary>
  40. ///
  41. /// </summary>
  42. /// <param name="mapper"></param>
  43. /// <param name="mediator"></param>
  44. /// <param name="capPublisher"></param>
  45. /// <param name="bulletinRepository"></param>
  46. /// <param name="dataOrderRepository"></param>
  47. /// <param name="webFlowAcceptRepository"></param>
  48. /// <param name="webUserRegisterRepository"></param>
  49. /// <param name="webUserAuthRepository"></param>
  50. /// <param name="channelConfigurationManager"></param>
  51. /// <param name="writeLettersSendSms"></param>
  52. /// <param name="dsHotspotRepository"></param>
  53. /// <param name="dsOrderVisitRepository"></param>
  54. /// <param name="fwClient"></param>
  55. public WebPortalController(IMapper mapper, IMediator mediator, ICapPublisher capPublisher,
  56. IRepository<DsBulletin> bulletinRepository,
  57. IRepository<DsOrder> dataOrderRepository,
  58. IRepository<DsWebFlowAccept> webFlowAcceptRepository,
  59. IRepository<DsWebUserRegister> webUserRegisterRepository,
  60. IRepository<DsWebUserAuth> webUserAuthRepository,
  61. IChannelConfigurationManager channelConfigurationManager,
  62. ITypedCache<WriteLettersSendSmsDto> writeLettersSendSms,
  63. IRepository<DsHotspot> dsHotspotRepository,
  64. IRepository<DsOrderVisit> dsOrderVisitRepository, FwClient fwClient)
  65. {
  66. _mapper = mapper;
  67. _mediator = mediator;
  68. _capPublisher = capPublisher;
  69. _bulletinRepository = bulletinRepository;
  70. _dataOrderRepository = dataOrderRepository;
  71. _webFlowAcceptRepository = webFlowAcceptRepository;
  72. _webUserRegisterRepository = webUserRegisterRepository;
  73. _webUserAuthRepository = webUserAuthRepository;
  74. _channelConfigurationManager = channelConfigurationManager;
  75. _writeLettersSendSms = writeLettersSendSms;
  76. _dsHotspotRepository = dsHotspotRepository;
  77. _dsOrderVisitRepository = dsOrderVisitRepository;
  78. _fwClient = fwClient;
  79. }
  80. #region 通知
  81. /// <summary>
  82. /// 获取列表
  83. /// </summary>
  84. /// <returns></returns>
  85. [AllowAnonymous]
  86. [HttpPost("getarticlelist")]
  87. public async Task<OpenResponse> GetArticleList([FromBody] QueryArticleListDto dto)
  88. {
  89. RefAsync<int> total = 0;
  90. var items = await _bulletinRepository.Queryable()
  91. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  92. .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2"))
  93. .Where(p => p.BulletinTypeId == dto.NoticeType)
  94. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  95. .OrderByDescending(p => p.BulletinTime)
  96. .Select(it => new
  97. {
  98. Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "),
  99. NoticeID = it.Id,
  100. NoticeContent = it.Content,
  101. NoticeTypeName = it.BulletinTypeName,
  102. NoticeTitle = it.Title,
  103. NoticeBMName = it.SourceOrgName,
  104. NoticeCreateDate = it.BulletinTime,
  105. VideoUrl = "",
  106. WNLT_FullCode = ""
  107. })
  108. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  109. //计算总页数
  110. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  111. ArticleListDataDto dataDto = new()
  112. {
  113. PageCount = nPageCount,
  114. data = _mapper.Map<IReadOnlyList<ArticleListDto>>(items)
  115. };
  116. return OpenResponse.Ok(WebPortalDeResponse<ArticleListDataDto>.Success(dataDto));
  117. }
  118. /// <summary>
  119. /// 获取通知公告前几条数据
  120. /// </summary>
  121. /// <param name="dto"></param>
  122. /// <returns></returns>
  123. [AllowAnonymous]
  124. [HttpPost("getarticlelistbynum")]
  125. public async Task<OpenResponse> GetArticleListByNum([FromBody] ArticleIdByNumDto dto)
  126. {
  127. var items = await _bulletinRepository.Queryable()
  128. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  129. .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2"))
  130. .Where(p => p.BulletinTypeId == dto.BulletinTypeId)
  131. .WhereIF(!string.IsNullOrEmpty(dto.CheckChar), p => p.Content.Contains(dto.CheckChar))
  132. .OrderByDescending(p => p.BulletinTime)
  133. .Select(it => new
  134. {
  135. DataID = it.Id,
  136. Title = it.Title,
  137. CreateDate = it.BulletinTime,
  138. Content = it.Content
  139. })
  140. .Take(dto.Num)
  141. .ToListAsync();
  142. var data = _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  143. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<DataListTopDto>>.Success(data, "成功"));
  144. }
  145. /// <summary>
  146. /// 获取详情,修改阅读次数
  147. /// </summary>
  148. /// <param name="dto"></param>
  149. /// <returns></returns>
  150. [AllowAnonymous]
  151. [HttpPost("getarticledetails")]
  152. public async Task<OpenResponse> GetArticleDetails([FromBody] ArticleIdDto dto)
  153. {
  154. var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  155. ArticleDetailsDto detailsDto = null;
  156. if (data != null)
  157. {
  158. data.ReadedNum = data.ReadedNum++;
  159. await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted);
  160. detailsDto = new()
  161. {
  162. NoticeID = data.Id,
  163. NoticeTypeName = data.BulletinTypeName,
  164. NoticeTitle = data.Title,
  165. NoticeBMName = data.SourceOrgName,
  166. NoticeCreateDate = data.BulletinTime,
  167. NoticeRCount = data.ReadedNum,
  168. WNED_VideoUrl = "",
  169. NoticeContent = data.Content
  170. };
  171. }
  172. else
  173. detailsDto = new();
  174. List<ArticleDetailsDto> dataDto = new() { detailsDto };
  175. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<ArticleDetailsDto>>.Success(dataDto));
  176. }
  177. /// <summary>
  178. /// 上一条和下一条
  179. /// </summary>
  180. /// <param name="dto"></param>
  181. /// <returns></returns>
  182. [AllowAnonymous]
  183. [HttpPost("getpreviousandnext")]
  184. public async Task<OpenResponse> GetPreviousAndNext([FromBody] ArticlePreviousAndNextDto dto)
  185. {
  186. var sugar = _bulletinRepository.Queryable()
  187. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  188. .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2"))
  189. ;
  190. if (dto.FullSearch == "1")//全文搜索
  191. {
  192. sugar.Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
  193. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition));
  194. }
  195. else//指定分类
  196. {
  197. sugar.WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  198. .Where(p => p.BulletinTypeId == dto.NoticeTypeId);
  199. }
  200. var list = await sugar.OrderByDescending(p => p.BulletinTime)
  201. .Select(it => new
  202. {
  203. Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "),
  204. NoticeID = it.Id,
  205. NoticeTitle = it.Title,
  206. NoticeCreateDate = it.BulletinTime
  207. })
  208. .ToListAsync();
  209. //数据为空返回空数据
  210. if (list == null || list.Count == 0)
  211. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(null));
  212. else
  213. {
  214. var temp = list.Find(p => p.NoticeID == dto.ID);
  215. if (temp != null)
  216. {
  217. List<ArticlePreviousAndNextDataDto> returnDto = new();
  218. //上一条
  219. var pTemp = list.Find(p => p.Page == temp.Page - 1);
  220. if (pTemp != null)
  221. returnDto.Add(new()
  222. {
  223. NoticeID = pTemp.NoticeID,
  224. NoticeTitle = pTemp.NoticeTitle,
  225. pntype = "p"
  226. });
  227. //下一条
  228. var nTemp = list.Find(p => p.Page == temp.Page + 1);
  229. if (nTemp != null)
  230. returnDto.Add(new()
  231. {
  232. NoticeID = nTemp.NoticeID,
  233. NoticeTitle = nTemp.NoticeTitle,
  234. pntype = "n"
  235. });
  236. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(returnDto));
  237. }
  238. else
  239. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(null));
  240. }
  241. }
  242. /// <summary>
  243. /// 全文检索
  244. /// </summary>
  245. /// <param name="dto"></param>
  246. /// <returns></returns>
  247. [AllowAnonymous]
  248. [HttpPost("getfulltextsearchlist")]
  249. public async Task<OpenResponse> GetFullTextSearchList([FromBody] QueryArticleListDto dto)
  250. {
  251. if (string.IsNullOrEmpty(dto.Condition))
  252. return OpenResponse.Ok(WebPortalDeResponse<FullTextSearchListDataDto>.Success(null));
  253. RefAsync<int> total = 0;
  254. var items = await _bulletinRepository.Queryable()
  255. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  256. .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2"))
  257. .Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
  258. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  259. .OrderByDescending(p => p.BulletinTime)
  260. .Select(it => new
  261. {
  262. Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "),
  263. NoticeID = it.Id,
  264. Content = it.Content,
  265. NoticeTypeID = it.BulletinTypeId,
  266. NoticeTypeName = it.BulletinTypeName,
  267. NoticeTitle = it.Title,
  268. NoticeBMName = it.SourceOrgName,
  269. NoticeCreateDate = it.BulletinTime,
  270. TypeCode = "",
  271. })
  272. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  273. //计算总页数
  274. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  275. FullTextSearchListDataDto dataDto = new()
  276. {
  277. PageCount = nPageCount,
  278. data = _mapper.Map<IReadOnlyList<FullTextSearchListDto>>(items)
  279. };
  280. return OpenResponse.Ok(WebPortalDeResponse<FullTextSearchListDataDto>.Success(dataDto));
  281. }
  282. #endregion
  283. #region 办件
  284. /// <summary>
  285. /// 获取信件前6条数据
  286. /// </summary>
  287. /// <param name="dto"></param>
  288. /// <returns></returns>
  289. [HttpPost("getorderlistbynum")]
  290. [AllowAnonymous]
  291. public async Task<OpenResponse> GetOrderListByNum([FromBody] QueryOrderListByNumDto dto)
  292. {
  293. var items = await _dataOrderRepository.Queryable()
  294. .Where(p => p.IsPublish == DataSharing.Share.Enums.EDsPublishState.Open)
  295. .Where(p => p.HandleState == "办理完成")
  296. .OrderByDescending(p => p.PublishDate)
  297. .Select(it => new
  298. {
  299. DataID = it.OrderId,
  300. Title = it.Title,
  301. CreateDate = it.PublishDate
  302. })
  303. .Take(dto.Num)
  304. .ToListAsync();
  305. var data = _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  306. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<DataListTopDto>>.Success(data, "成功"));
  307. }
  308. /// <summary>
  309. /// 办件摘编列表数据
  310. /// </summary>
  311. /// <param name="dto"></param>
  312. /// <returns></returns>
  313. [HttpPost("getorderlist")]
  314. [AllowAnonymous]
  315. public async Task<OpenResponse> GetOrderList([FromBody] QueryOrderListDto dto)
  316. {
  317. RefAsync<int> total = 0;
  318. var items = await _dataOrderRepository.Queryable()
  319. .Where(p => p.IsPublish == DataSharing.Share.Enums.EDsPublishState.Open)
  320. .Where(p => p.HandleState == "办理完成")
  321. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), d => d.OrderNo == dto.FlowCode)
  322. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), d => d.Title.Contains(dto.FlowName))
  323. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), d => d.CaseTypeCode == dto.FlowSType)
  324. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), d => d.HotspotId == dto.FlowRType)
  325. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), d => d.CaseDate >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  326. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), d => d.CaseDate <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  327. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), d => d.FromName.Contains(dto.FlowFrom))
  328. .OrderByDescending(p => p.PublishDate)
  329. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  330. //计算总页数
  331. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  332. OrderListReturnDto returnDto = new()
  333. {
  334. PageNum = dto.PageIndex,
  335. PageCount = nPageCount,
  336. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  337. };
  338. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  339. }
  340. /// <summary>
  341. /// 办件摘编详情
  342. /// </summary>
  343. /// <param name="dto"></param>
  344. /// <returns></returns>
  345. [AllowAnonymous]
  346. [HttpPost("getorderdetailbyid")]
  347. public async Task<OpenResponse> GetOrderDetailById([FromBody] ArticleIdDto dto)
  348. {
  349. var data = await _dataOrderRepository.GetAsync(p => p.OrderId == dto.Id);
  350. var orderDetail = _mapper.Map<OrderDetail>(data);
  351. if (data != null)
  352. {
  353. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  354. if (data.IsProvince == true || data.CaseSourceCode == "ZMHD")
  355. orderDetail.IsProvinceOrder = "1";
  356. else
  357. orderDetail.IsProvinceOrder = "0";
  358. //orderDetail.IsProvinceOrder = data.IsProvince == true ? "1" : "0";
  359. switch (data.VisitTypeState)
  360. {
  361. case DataSharing.Share.Enums.EVisitTypeState.UnVisit:
  362. orderDetail.VisitType = "0";
  363. break;
  364. case DataSharing.Share.Enums.EVisitTypeState.Visit:
  365. orderDetail.VisitType = "1";
  366. break;
  367. case DataSharing.Share.Enums.EVisitTypeState.Reviewed:
  368. orderDetail.VisitType = "2";
  369. break;
  370. default:
  371. break;
  372. }
  373. }
  374. List<OrderDetail> dataDto = new() { orderDetail };
  375. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderDetail>>.Success(dataDto));
  376. }
  377. /// <summary>
  378. /// 根据编号和密码查询信件ID
  379. /// </summary>
  380. /// <param name="dto"></param>
  381. /// <returns></returns>
  382. [AllowAnonymous]
  383. [HttpPost("getorderid")]
  384. public async Task<OpenResponse> GetOrderId([FromBody] GetOrderCodePwd dto)
  385. {
  386. //var data = await _webFlowAcceptRepository.GetAsync(p => p.Code == dto.OrderNo && p.Pwd == dto.Pwd);
  387. var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.OrderNo && p.Password == dto.Pwd);
  388. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(data?.OrderId));
  389. }
  390. /// <summary>
  391. /// 办件摘编详情
  392. /// </summary>
  393. /// <param name="dto"></param>
  394. /// <returns></returns>
  395. [AllowAnonymous]
  396. [HttpPost("getorderdetailbyno")]
  397. public async Task<OpenResponse> GetOrderDetailByNo([FromBody] GetOrderCodePwd dto)
  398. {
  399. var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.OrderNo && p.Password == dto.Pwd);
  400. if (data != null)
  401. {
  402. var orderDetail = _mapper.Map<OrderDetail>(data);
  403. if (data != null)
  404. {
  405. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  406. if (data.IsProvince == true || data.CaseSourceCode == "ZMHD")
  407. orderDetail.IsProvinceOrder = "1";
  408. else
  409. orderDetail.IsProvinceOrder = "0";
  410. //orderDetail.IsProvinceOrder = data.IsProvince == true ? "1" : "0";
  411. switch (data.VisitTypeState)
  412. {
  413. case DataSharing.Share.Enums.EVisitTypeState.UnVisit:
  414. orderDetail.VisitType = "0";
  415. break;
  416. case DataSharing.Share.Enums.EVisitTypeState.Visit:
  417. orderDetail.VisitType = "1";
  418. break;
  419. case DataSharing.Share.Enums.EVisitTypeState.Reviewed:
  420. orderDetail.VisitType = "2";
  421. break;
  422. default:
  423. break;
  424. }
  425. }
  426. List<OrderDetail> dataDto = new() { orderDetail };
  427. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderDetail>>.Success(dataDto));
  428. }
  429. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<string>>.Failed(description: "查询失败"));
  430. }
  431. /// <summary>
  432. /// 写信接口
  433. /// </summary>
  434. /// <param name="dto"></param>
  435. /// <returns></returns>
  436. [AllowAnonymous]
  437. [HttpPost("orderacceptance")]
  438. public async Task<OpenResponse> OrderAcceptance([FromBody] DsWebFlowAccept dto)
  439. {
  440. var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
  441. data.SourceChannel = "网站";
  442. data.SourceChannelCode = "WZ";
  443. data.Source = Hotline.Share.Enums.Order.ESource.WebPortal;
  444. if (!string.IsNullOrEmpty(data.LicenceNo))
  445. {
  446. data.LicenceTypeCode = "10";
  447. data.LicenceType = "中华人民共和国居民身份证";
  448. }
  449. data.ExternalId = Guid.NewGuid().ToString();
  450. // await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderCreation, data, cancellationToken: HttpContext.RequestAborted);
  451. //调用工单创建接口
  452. // var result1 = await _hotlineClient.ReceiveOrderAsync(data, HttpContext.RequestAborted);
  453. var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
  454. OrderAcceptanceReturnDto returnDto = new();
  455. if (result != null && result.code == 0)
  456. {
  457. returnDto.PWD = result.result.password;
  458. returnDto.Code = result.result.no;
  459. returnDto.State = "1";
  460. dto.Pwd = result.result.password;
  461. dto.Code = result.result.no;
  462. dto.OrderId = result.result.id;
  463. await _webFlowAcceptRepository.AddAsync(dto, HttpContext.RequestAborted);
  464. }
  465. else
  466. returnDto.State = "0";
  467. //OrderAcceptanceReturnDto returnDto = new()
  468. //{
  469. // PWD = "12345",
  470. // Code = "12345",
  471. // State = "1"
  472. //};
  473. //dto.Pwd = "12345";
  474. //dto.Code = "12345";
  475. //dto.OrderId = "12345";
  476. //await _webFlowAcceptRepository.AddAsync(dto, HttpContext.RequestAborted);
  477. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Success(returnDto));
  478. }
  479. /// <summary>
  480. /// 受理类型和热点统计
  481. /// </summary>
  482. /// <returns></returns>
  483. [AllowAnonymous]
  484. [HttpPost("getchartdata")]
  485. public async Task<OpenResponse> GetChartData()
  486. {
  487. var startDate = Convert.ToDateTime(DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd 00:00:00"));
  488. var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  489. //数据查询
  490. var listType = await _dataOrderRepository.Queryable()
  491. .Where(p => p.CaseDate >= startDate)
  492. .Where(p => p.CaseDate <= endDate)
  493. .Select(it => new
  494. {
  495. it.CaseType,
  496. it.CaseTypeCode
  497. })
  498. .MergeTable()//将查询出来的结果合并成一个新表
  499. .GroupBy(it => new { it.CaseType, it.CaseTypeCode })//对新表进行分组
  500. .Select(it => new
  501. {
  502. name = it.CaseType,
  503. value = SqlFunc.AggregateCount(it.CaseTypeCode)
  504. })
  505. .ToListAsync();
  506. //数据查询-查询总数前5的数据
  507. var listHot = await _dataOrderRepository.Queryable()
  508. .Where(p => p.CaseDate >= startDate)
  509. .Where(p => p.CaseDate <= endDate)
  510. .Select(it => new
  511. {
  512. it.HotspotId,
  513. it.HotspotName
  514. })
  515. .MergeTable()//将查询出来的结果合并成一个新表
  516. .GroupBy(it => new { it.HotspotId, it.HotspotName })//对新表进行分组
  517. .Select(it => new
  518. {
  519. typeName = it.HotspotName,
  520. num = SqlFunc.AggregateCount(it.HotspotId)
  521. })
  522. .OrderByDescending(it => it.num)
  523. .Take(5)
  524. .ToListAsync();
  525. GetChartDataDto dataDto = new()
  526. {
  527. formCount = _mapper.Map<IReadOnlyList<OrderFormCount>>(listType),
  528. hotCount = _mapper.Map<IReadOnlyList<OrderHotCount>>(listHot)
  529. };
  530. return OpenResponse.Ok(WebPortalDeResponse<GetChartDataDto>.Success(dataDto));
  531. }
  532. /// <summary>
  533. /// 获取统计数据
  534. /// </summary>
  535. /// <returns></returns>
  536. [AllowAnonymous]
  537. [HttpPost("getstatist")]
  538. public async Task<OpenResponse> GetStatist()
  539. {
  540. var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  541. var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  542. GetStatistDto getStatistDto = new()
  543. {
  544. AllCount = await _dataOrderRepository.Queryable().CountAsync(),
  545. AllTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").CountAsync(),
  546. DayCount = await _dataOrderRepository.Queryable().Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync(),
  547. DayTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync()
  548. };
  549. return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));
  550. }
  551. #endregion
  552. #region 用户
  553. /// <summary>
  554. /// 添加统一认证用户数据
  555. /// </summary>
  556. /// <param name="dto"></param>
  557. /// <returns></returns>
  558. [AllowAnonymous]
  559. [HttpPost("adduserauth")]
  560. public async Task<OpenResponse> AddUserAuth([FromBody] UserModelDto dto)
  561. {
  562. bool bResult = false;
  563. // 唯一记录ID
  564. string id = dto.id;
  565. // 注册用户ID
  566. string webUserID = "";
  567. // 统一认证用户注册ID
  568. string wUAID = "";
  569. //查询是否有注册用户
  570. var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == id, HttpContext.RequestAborted);
  571. if (dataUser != null)
  572. {
  573. webUserID = dataUser.WebUserID;
  574. wUAID = dataUser.Id;
  575. }
  576. //没有注册用户添加数据
  577. if (string.IsNullOrEmpty(webUserID))
  578. {
  579. var userRegister = _mapper.Map<DsWebUserRegister>(dto);
  580. userRegister.RegDate = DateTime.Now;
  581. userRegister.LastDate = DateTime.Now;
  582. webUserID = await _webUserRegisterRepository.AddAsync(userRegister, HttpContext.RequestAborted);
  583. }
  584. //统一认证数据
  585. var userAuth = _mapper.Map<DsWebUserAuth>(dto);
  586. if (!string.IsNullOrEmpty(wUAID))
  587. {
  588. //修改数据
  589. userAuth.Id = wUAID;
  590. await _webUserAuthRepository.UpdateAsync(userAuth, HttpContext.RequestAborted);
  591. bResult = true;
  592. }
  593. else
  594. {
  595. //新增数据
  596. userAuth.WebGUID = Guid.NewGuid().ToString();
  597. userAuth.WebUserID = webUserID;
  598. var addId = await _webUserAuthRepository.AddAsync(userAuth, HttpContext.RequestAborted);
  599. if (!string.IsNullOrEmpty(addId))
  600. bResult = true;
  601. }
  602. //判断是否成功
  603. if (bResult)
  604. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(webUserID));
  605. else
  606. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed());
  607. }
  608. /// <summary>
  609. /// 用户中心用户写信数据
  610. /// </summary>
  611. /// <param name="dto"></param>
  612. /// <returns></returns>
  613. [HttpPost("getorderbyuserlist")]
  614. [AllowAnonymous]
  615. public async Task<OpenResponse> GetOrderByUserList([FromBody] QueryOrderListByUserDto dto)
  616. {
  617. var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == dto.UserId, HttpContext.RequestAborted);
  618. if (dataUser != null)
  619. {
  620. RefAsync<int> total = 0;
  621. var items = await _webFlowAcceptRepository.Queryable()
  622. .LeftJoin<DsOrder>((o, or) => o.OrderId == or.OrderId)
  623. .Where(o => o.WebUserID == dataUser.WebUserID)
  624. //重新构建数据
  625. .Select((o, or) => new
  626. {
  627. FlowID = o.OrderId,
  628. FlowCode = o.Code,
  629. FlowPwd = o.Pwd,
  630. FlowTitle = o.Title,
  631. FlowFromName = or.CaseSource,
  632. FlowPurTypeName = o.PurTypeName,
  633. ConTypeName = or.HotspotName,
  634. FlowAddDate = o.CreationTime,
  635. RSFlagName = or.HandleState,
  636. WebUserID = o.WebUserID
  637. })
  638. //将结果合并成一个表
  639. .MergeTable()
  640. // .Where(p => p.WebUserID == dataUser.WebUserID)
  641. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  642. //计算总页数
  643. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  644. OrderListReturnDto returnDto = new()
  645. {
  646. PageNum = dto.PageIndex,
  647. PageCount = nPageCount,
  648. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  649. };
  650. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  651. }
  652. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(new OrderListReturnDto(), "成功"));
  653. }
  654. #endregion
  655. #region 短信、基础设置
  656. /// <summary>
  657. /// 短信验证码发送
  658. /// </summary>
  659. /// <param name="dto"></param>
  660. /// <returns></returns>
  661. [AllowAnonymous]
  662. [HttpPost("writeletterssendsms")]
  663. public async Task<OpenResponse> WriteLettersSendSms([FromBody] SendSmsModelDto dto)
  664. {
  665. string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd");
  666. var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted);
  667. if (data != null)//已经发过短信
  668. {
  669. //是否可以继续发送短信(10次)
  670. if (data.SendCount > 10)
  671. //短信发送超过10条
  672. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-2"));
  673. // 验证是否在两分钟之内
  674. TimeSpan duration = DateTime.Now - data.AddTime; // 计算时间差
  675. if ((int)duration.TotalSeconds < 120)
  676. // 距离上次发送时间不足两分钟
  677. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-4"));
  678. //修改缓存信息
  679. data.SendCount++;
  680. data.SmsCode = dto.SmsCode;
  681. data.AddTime = DateTime.Now;
  682. }
  683. else
  684. {
  685. //没有发过短信,直接写入数据
  686. data = new WriteLettersSendSmsDto
  687. {
  688. AddTime = DateTime.Now,
  689. SmsCode = dto.SmsCode,
  690. MobileNum = dto.TelNum,
  691. SendCount = 1
  692. };
  693. }
  694. //这里发送短信 宜宾12345市民服务热线网站验证码{0},用于写信时验证联系电话。验证码有效期10分钟。
  695. string Content = "宜宾12345市民服务热线网站验证码" + dto.SmsCode + ",用于写信时验证联系电话。验证码有效期10分钟。";
  696. PushMessageDto pushMessageDto = new PushMessageDto()
  697. {
  698. ClientId = "Web",
  699. ExternalId = "",
  700. Content = Content,
  701. Remark = "",
  702. Name = dto.TelNum,
  703. TelNumber = dto.TelNum
  704. };
  705. await _capPublisher.PublishAsync("send.sms", pushMessageDto, cancellationToken: HttpContext.RequestAborted);
  706. //修改缓存
  707. await _writeLettersSendSms.SetAsync(keyToken, data, TimeSpan.FromDays(1), HttpContext.RequestAborted);
  708. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("1"));
  709. }
  710. /// <summary>
  711. /// 验证短信验证码是否正确 正确返回1,错误返回-1
  712. /// </summary>
  713. /// <param name="dto"></param>
  714. /// <returns></returns>
  715. [AllowAnonymous]
  716. [HttpPost("checksmscode")]
  717. public async Task<OpenResponse> CheckSmsCode([FromBody] SendSmsModelDto dto)
  718. {
  719. string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd");
  720. var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted);
  721. //检测是否存在
  722. if (data != null)
  723. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(data.SmsCode));
  724. //不存在
  725. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-1"));
  726. }
  727. /// <summary>
  728. /// 获取热点分类的树形
  729. /// </summary>
  730. /// <returns></returns>
  731. [AllowAnonymous]
  732. [HttpPost("gethotspottreelist")]
  733. public async Task<OpenResponse> GetHotspotTreeList()
  734. {
  735. var data = await _dsHotspotRepository.Queryable().ToTreeAsync(it => it.children, it => it.ParentId, null);
  736. return OpenResponse.Ok(WebPortalDeResponse<List<DsHotspot>>.Success(data));
  737. }
  738. /// <summary>
  739. /// 系统主题颜色
  740. /// </summary>
  741. /// <returns></returns>
  742. [AllowAnonymous]
  743. [HttpPost("getsystemsettingstheme")]
  744. public async Task<OpenResponse> GetSystemSettingsTheme()
  745. {
  746. var data = _channelConfigurationManager.GetConfigurationWebPortal();
  747. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(data.SystemSettingsTheme));
  748. }
  749. #endregion
  750. #region 评价
  751. /// <summary>
  752. /// 获取待评价部门信息
  753. /// </summary>
  754. /// <param name="dto"></param>
  755. /// <returns></returns>
  756. [AllowAnonymous]
  757. [HttpPost("getwaitvisitdata")]
  758. public async Task<OpenResponse> GetWaitVisitData([FromBody] ArticleIdDto dto)
  759. {
  760. var dataOrder = await _dataOrderRepository.AnyAsync(p => p.OrderId == dto.Id && p.VisitTypeState == Share.Enums.EVisitTypeState.Visit, HttpContext.RequestAborted);
  761. if (!dataOrder)
  762. return OpenResponse.Ok(WebPortalDeResponse<List<WaitVisitListDataDto>>.Failed("工单已经评价!"));
  763. var data = await _dsOrderVisitRepository.Queryable().Where(p => p.OrderId == dto.Id && p.IsEffective == true && p.VisitTarget == Hotline.Share.Enums.Order.EVisitTarget.Org.ToString()).ToListAsync();
  764. var listDat = _mapper.Map<List<WaitVisitListDataDto>>(data);
  765. return OpenResponse.Ok(WebPortalDeResponse<List<WaitVisitListDataDto>>.Success(listDat));
  766. }
  767. /// <summary>
  768. /// 评价内容
  769. /// </summary>
  770. /// <param name="dto"></param>
  771. /// <returns></returns>
  772. [AllowAnonymous]
  773. [HttpPost("receivevisitdata")]
  774. public async Task<OpenResponse> ReceiveVisitData([FromBody] OrderVisitListDataDto dto)
  775. {
  776. if (dto == null || dto.VistListDtos == null || dto.VistListDtos.Count == 0)
  777. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed("评价数据不能为空!"));
  778. var dataOrder = await _dataOrderRepository.GetAsync(p => p.OrderId == dto.OrderId && p.VisitTypeState == Share.Enums.EVisitTypeState.Visit, HttpContext.RequestAborted);
  779. if (dataOrder == null)
  780. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed("工单已经评价!"));
  781. //组装数据
  782. OrderVisitWebDto visitWebDto = new()
  783. {
  784. VisitType = Hotline.Share.Enums.Order.EVisitType.WebVisit,
  785. VisitTime = DateTime.Now
  786. };
  787. List<OrderVisitDetailWebDto> orderVisitDetails = new();
  788. int count = 0;
  789. #region 查询是否有需要评价的语音---已取消语音评价
  790. ////查询是否有需要评价的语音
  791. //var seatVisit = await _dsOrderVisitRepository.GetAsync(p => p.OrderId == dto.OrderId && p.IsEffective == true
  792. // && p.VisitTarget == Hotline.Share.Enums.Order.EVisitTarget.Seat.ToString(), HttpContext.RequestAborted);
  793. //if (seatVisit != null)
  794. //{
  795. // //修改本地数据
  796. // seatVisit.VoiceEvaluate = Hotline.Share.Enums.Order.EVoiceEvaluate.VerySatisfied.ToString();
  797. // seatVisit.SeatEvaluate = Hotline.Share.Enums.Order.ESeatEvaluate.VerySatisfied.ToString();
  798. // await _dsOrderVisitRepository.UpdateAsync(seatVisit, HttpContext.RequestAborted);
  799. // visitWebDto.Id = seatVisit.VisitId;
  800. // //业务系统语音以及坐席默认评价
  801. // OrderVisitDetailWebDto detailDto = new()
  802. // {
  803. // Id = seatVisit.VisitDetailId,
  804. // VoiceEvaluate = Hotline.Share.Enums.Order.EVoiceEvaluate.VerySatisfied,
  805. // SeatEvaluate = Hotline.Share.Enums.Order.ESeatEvaluate.VerySatisfied,
  806. // VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Seat
  807. // };
  808. // orderVisitDetails.Add(detailDto);
  809. //}
  810. #endregion
  811. #region 部门评价
  812. //部门评价
  813. //遍历数据
  814. foreach (var item in dto.VistListDtos)
  815. {
  816. Hotline.Share.Dtos.Kv kv = item.SatisfactionCode switch
  817. {
  818. "5" => new Hotline.Share.Dtos.Kv { Key = "5", Value = "非常满意" },
  819. "4" => new Hotline.Share.Dtos.Kv { Key = "4", Value = "满意" },
  820. "2" => new Hotline.Share.Dtos.Kv { Key = "2", Value = "不满意" },
  821. _ => new Hotline.Share.Dtos.Kv { Key = "7", Value = "不做评价" },
  822. };
  823. //查询数据
  824. var tempData = await _dsOrderVisitRepository.GetAsync(p => p.OrderId == dto.OrderId && p.Id == item.Id, HttpContext.RequestAborted);
  825. if (tempData != null)
  826. {
  827. //修改当前数据
  828. tempData.OrgProcessingResults = _mapper.Map<DataSharing.WebPortal.Kv>(kv);
  829. tempData.OrgHandledAttitude = _mapper.Map<DataSharing.WebPortal.Kv>(kv);
  830. tempData.OrgNoSatisfiedReason = new List<Kv>();
  831. tempData.VisitContent = item.VisitContent;
  832. tempData.VisitOrgName = item.VisitOrgName;
  833. tempData.VisitOrgCode = item.VisitOrgCode;
  834. tempData.VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Org.ToString();
  835. tempData.VisitType = Hotline.Share.Enums.Order.EVisitType.WebVisit.ToString();
  836. tempData.VisitTime = DateTime.Now;
  837. tempData.IsEffective = true;
  838. await _dsOrderVisitRepository.UpdateAsync(tempData, HttpContext.RequestAborted);
  839. count++;
  840. //组装回访数据
  841. visitWebDto.Id = tempData.VisitId;
  842. OrderVisitDetailWebDto detailDto = new()
  843. {
  844. Id = tempData.VisitDetailId,
  845. VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Org,
  846. OrgProcessingResults = kv,
  847. OrgNoSatisfiedReason = new List<Hotline.Share.Dtos.Kv>(),
  848. OrgHandledAttitude = kv,
  849. VisitContent = item.VisitContent
  850. };
  851. orderVisitDetails.Add(detailDto);
  852. }
  853. }
  854. #endregion
  855. //修改工单评价状态为已评价
  856. if (count == dto.VistListDtos.Count)
  857. {
  858. dataOrder.VisitTypeState = Share.Enums.EVisitTypeState.Reviewed;
  859. await _dataOrderRepository.UpdateAsync(dataOrder, HttpContext.RequestAborted);
  860. }
  861. visitWebDto.OrderVisitDetailDto = orderVisitDetails;
  862. //推送数据
  863. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderVisitAllOther, visitWebDto, cancellationToken: HttpContext.RequestAborted);
  864. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("1"));
  865. }
  866. #endregion
  867. }
  868. }