WebPortalController.cs 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551
  1. using DocumentFormat.OpenXml.Spreadsheet;
  2. using Hotline.Application.Bulletin;
  3. using Hotline.Application.Orders;
  4. using Hotline.Article;
  5. using Hotline.Caching.Interfaces;
  6. using Hotline.Configurations;
  7. using Hotline.KnowledgeBase;
  8. using Hotline.Orders;
  9. using Hotline.Push.Notifies;
  10. using Hotline.Repository.SqlSugar.Extensions;
  11. using Hotline.Settings;
  12. using Hotline.Settings.Hotspots;
  13. using Hotline.Share.Dtos;
  14. using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
  15. using Hotline.Share.Dtos.Order;
  16. using Hotline.Share.Dtos.Schedulings;
  17. using Hotline.Share.Dtos.WebPortal;
  18. using Hotline.Share.Enums.KnowledgeBase;
  19. using Hotline.Share.Enums.Order;
  20. using Hotline.Share.Enums.Push;
  21. using Hotline.WebPortal;
  22. using MapsterMapper;
  23. using MathNet.Numerics;
  24. using MediatR;
  25. using Microsoft.AspNetCore.Authorization;
  26. using Microsoft.AspNetCore.Mvc;
  27. using Microsoft.Extensions.Options;
  28. using SqlSugar;
  29. using XF.Domain.Authentications;
  30. using XF.Domain.Cache;
  31. using XF.Domain.Filters;
  32. using XF.Domain.Repository;
  33. namespace Hotline.Api.Controllers
  34. {
  35. public class WebPortalController : BaseController
  36. {
  37. private readonly IMapper _mapper;
  38. private readonly IMediator _mediator;
  39. private readonly IRepository<Bulletin> _bulletinRepository;
  40. private readonly IRepository<WebUserRegister> _webUserRegisterRepository;
  41. private readonly IRepository<WebUserAuth> _webUserAuthRepository;
  42. private readonly IRepository<WebFlowAccept> _webFlowAcceptRepository;
  43. private readonly ITypedCache<WriteLettersSendSmsDto> _writeLettersSendSms;
  44. private readonly IRepository<Hotspot> _hotspotRepository;
  45. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  46. private readonly IRepository<OrderPublish> _orderPublishRepository;
  47. private readonly IOrderRepository _orderRepository;
  48. private readonly IRepository<OrderVisit> _orderVisitRepository;
  49. private readonly IOrderApplication _orderApplication;
  50. private readonly ISessionContext _sessionContext;
  51. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  52. private readonly IBulletinApplication _bulletinApplication;
  53. private readonly IRepository<OldPublicData> _oldPublicDataRepository;
  54. private readonly IRepository<KnowledgeRelationType> _knowledgeRelationTypeRepository;
  55. private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
  56. private readonly IRepository<Knowledge> _knowledgeRepository;
  57. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  58. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  59. private readonly ITypedCache<string> _getVailData;
  60. public WebPortalController(IMapper mapper,
  61. IMediator mediator,
  62. IRepository<Bulletin> bulletinRepository,
  63. IRepository<WebUserRegister> webUserRegisterRepository,
  64. IRepository<WebUserAuth> webUserAuthRepository,
  65. IRepository<WebFlowAccept> webFlowAcceptRepository,
  66. ITypedCache<WriteLettersSendSmsDto> writeLettersSendSms,
  67. IRepository<Hotspot> hotspotRepository,
  68. ISystemSettingCacheManager systemSettingCacheManager,
  69. IRepository<OrderPublish> orderPublishRepository,
  70. IOrderRepository orderRepository,
  71. IRepository<OrderVisit> orderVisitRepository,
  72. IOrderApplication orderApplication,
  73. ISessionContext sessionContext,
  74. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  75. IBulletinApplication bulletinApplication,
  76. IRepository<OldPublicData> oldPublicDataRepository,
  77. IRepository<KnowledgeRelationType> knowledgeRelationTypeRepository,
  78. IRepository<KnowledgeType> knowledgeTypeRepository,
  79. IRepository<Knowledge> knowledgeRepository,
  80. ISystemDicDataCacheManager systemDicDataCacheManager,
  81. IOptionsSnapshot<AppConfiguration> appOptions,
  82. ITypedCache<string> getVailData
  83. )
  84. {
  85. _mapper = mapper;
  86. _mediator = mediator;
  87. _bulletinRepository = bulletinRepository;
  88. _webUserRegisterRepository = webUserRegisterRepository;
  89. _webUserAuthRepository = webUserAuthRepository;
  90. _webFlowAcceptRepository = webFlowAcceptRepository;
  91. _writeLettersSendSms = writeLettersSendSms;
  92. _hotspotRepository = hotspotRepository;
  93. _systemSettingCacheManager = systemSettingCacheManager;
  94. _orderPublishRepository = orderPublishRepository;
  95. _orderRepository = orderRepository;
  96. _orderVisitRepository = orderVisitRepository;
  97. _orderApplication = orderApplication;
  98. _sessionContext = sessionContext;
  99. _orderVisitDetailRepository = orderVisitDetailRepository;
  100. _bulletinApplication = bulletinApplication;
  101. _oldPublicDataRepository = oldPublicDataRepository;
  102. _knowledgeRelationTypeRepository = knowledgeRelationTypeRepository;
  103. _knowledgeTypeRepository = knowledgeTypeRepository;
  104. _knowledgeRepository = knowledgeRepository;
  105. _systemDicDataCacheManager = systemDicDataCacheManager;
  106. _appOptions = appOptions;
  107. _getVailData = getVailData;
  108. }
  109. #region 通知
  110. /// <summary>
  111. /// 获取列表
  112. /// </summary>
  113. /// <returns></returns>
  114. [AllowAnonymous]
  115. [HttpPost("getarticlelist")]
  116. public async Task<OpenResponse> GetArticleList([FromBody] QueryArticleListDto dto)
  117. {
  118. if (string.IsNullOrEmpty(dto.PushRanges))
  119. dto.PushRanges = "2";
  120. RefAsync<int> total = 0;
  121. var items = await _bulletinRepository.Queryable()
  122. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  123. .Where(p => p.IsArrive == true)
  124. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  125. .Where(p => p.BulletinTypeId == dto.NoticeType)
  126. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  127. .OrderByDescending(p => p.CreationTime)
  128. .Select(it => new
  129. {
  130. Page = SqlFunc.RowNumber($"{it.CreationTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "),
  131. NoticeID = it.Id,
  132. NoticeContent = it.Content,
  133. NoticeTypeName = it.BulletinTypeName,
  134. NoticeTitle = it.Title,
  135. NoticeBMName = it.SourceOrgName,
  136. NoticeCreateDate = it.CreationTime,
  137. VideoUrl = "",
  138. WNLT_FullCode = ""
  139. })
  140. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  141. //计算总页数
  142. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  143. ArticleListDataDto dataDto = new()
  144. {
  145. PageCount = nPageCount,
  146. Total = total,
  147. data = _mapper.Map<IReadOnlyList<ArticleListDto>>(items)
  148. };
  149. return OpenResponse.Ok(WebPortalDeResponse<ArticleListDataDto>.Success(dataDto));
  150. }
  151. /// <summary>
  152. /// 获取通知公告前几条数据
  153. /// </summary>
  154. /// <param name="dto"></param>
  155. /// <returns></returns>
  156. [AllowAnonymous]
  157. [HttpPost("getarticlelistbynum")]
  158. public async Task<OpenResponse> GetArticleListByNum([FromBody] ArticleIdByNumDto dto)
  159. {
  160. if (string.IsNullOrEmpty(dto.PushRanges))
  161. dto.PushRanges = "2";
  162. var items = await _bulletinRepository.Queryable()
  163. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  164. .Where(p => p.IsArrive == true)
  165. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  166. // .Where(p => p.BulletinTypeId == dto.BulletinTypeId)
  167. .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), p => p.BulletinTypeId == dto.BulletinTypeId)
  168. .WhereIF(!string.IsNullOrEmpty(dto.CheckChar), p => p.Content.Contains(dto.CheckChar))
  169. .WhereIF(!string.IsNullOrEmpty(dto.BulletinDisplayLocation), p => SqlFunc.JsonListObjectAny(p.DisplayLocation, "Key", dto.BulletinDisplayLocation))
  170. .OrderByDescending(p => p.CreationTime)
  171. .Select(it => new
  172. {
  173. DataID = it.Id,
  174. it.Title,
  175. CreateDate = it.CreationTime,
  176. it.Content,
  177. it.BulletinTypeName
  178. })
  179. .Take(dto.Num)
  180. .ToListAsync();
  181. var data = _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  182. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<DataListTopDto>>.Success(data, "成功"));
  183. }
  184. /// <summary>
  185. /// 获取详情,修改阅读次数
  186. /// </summary>
  187. /// <param name="dto"></param>
  188. /// <returns></returns>
  189. [AllowAnonymous]
  190. [HttpPost("getarticledetails")]
  191. public async Task<OpenResponse> GetArticleDetails([FromBody] ArticleIdDto dto)
  192. {
  193. var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  194. ArticleDetailsDto detailsDto = null;
  195. if (data != null)
  196. {
  197. data.ReadedNum = data.ReadedNum++;
  198. await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted);
  199. detailsDto = new()
  200. {
  201. NoticeID = data.Id,
  202. NoticeTypeName = data.BulletinTypeName,
  203. NoticeTitle = data.Title,
  204. NoticeBMName = data.SourceOrgName,
  205. NoticeCreateDate = data.CreationTime,
  206. NoticeRCount = data.ReadedNum,
  207. WNED_VideoUrl = "",
  208. NoticeContent = data.Content
  209. };
  210. if (data != null && !string.IsNullOrEmpty(data.Content))
  211. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  212. }
  213. else
  214. detailsDto = new();
  215. List<ArticleDetailsDto> dataDto = new() { detailsDto };
  216. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<ArticleDetailsDto>>.Success(dataDto));
  217. }
  218. /// <summary>
  219. /// 根据分类获取详情
  220. /// </summary>
  221. /// <param name="dto"></param>
  222. /// <returns></returns>
  223. [AllowAnonymous]
  224. [HttpPost("getarticledetailsbytype")]
  225. public async Task<OpenResponse> GetArticleDetailsByType([FromBody] ArticleIdByNumDto dto)
  226. {
  227. var items = await _bulletinRepository.Queryable()
  228. .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), p => p.BulletinTypeId == dto.BulletinTypeId)
  229. .OrderByDescending(p => p.CreationTime)
  230. .Take(dto.Num)
  231. .ToListAsync();
  232. List<ArticleDetailsDto> dataDto = [];
  233. if (items != null && items.Any())
  234. {
  235. foreach (var item in items)
  236. {
  237. if (!string.IsNullOrEmpty(item.Content))
  238. item.Content = _bulletinApplication.GetSiteUrls(item.Content);
  239. dataDto.Add(new()
  240. {
  241. NoticeID = item.Id,
  242. NoticeTypeName = item.BulletinTypeName,
  243. NoticeTitle = item.Title,
  244. NoticeBMName = item.SourceOrgName,
  245. NoticeCreateDate = item.CreationTime,
  246. NoticeRCount = item.ReadedNum,
  247. WNED_VideoUrl = "",
  248. NoticeContent = item.Content
  249. });
  250. }
  251. }
  252. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<ArticleDetailsDto>>.Success(dataDto));
  253. }
  254. /// <summary>
  255. /// 上一条和下一条
  256. /// </summary>
  257. /// <param name="dto"></param>
  258. /// <returns></returns>
  259. [AllowAnonymous]
  260. [HttpPost("getpreviousandnext")]
  261. public async Task<OpenResponse> GetPreviousAndNext([FromBody] ArticlePreviousAndNextDto dto)
  262. {
  263. if (string.IsNullOrEmpty(dto.PushRanges))
  264. dto.PushRanges = "2";
  265. var sugar = _bulletinRepository.Queryable()
  266. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  267. .Where(p => p.IsArrive == true)
  268. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  269. ;
  270. if (dto.FullSearch == "1")//全文搜索
  271. {
  272. if (_appOptions.Value.IsYiBin)
  273. {
  274. sugar.Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
  275. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition));
  276. }
  277. if (_appOptions.Value.IsZiGong)
  278. {
  279. sugar.Where(p => p.BulletinTypeId == "5013" || p.BulletinTypeId == "5016" || p.BulletinTypeId == "5011" || p.BulletinTypeId == "5015" || p.BulletinTypeId == "5017")
  280. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition));
  281. }
  282. }
  283. else//指定分类
  284. {
  285. sugar.WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  286. .Where(p => p.BulletinTypeId == dto.NoticeTypeId);
  287. }
  288. var list = await sugar.OrderByDescending(p => p.CreationTime)
  289. .Select(it => new
  290. {
  291. Page = SqlFunc.RowNumber($"{it.CreationTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "),
  292. NoticeID = it.Id,
  293. NoticeTitle = it.Title,
  294. NoticeCreateDate = it.CreationTime
  295. })
  296. .ToListAsync();
  297. //数据为空返回空数据
  298. if (list == null || list.Count == 0)
  299. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(null));
  300. else
  301. {
  302. var temp = list.Find(p => p.NoticeID == dto.ID);
  303. if (temp != null)
  304. {
  305. List<ArticlePreviousAndNextDataDto> returnDto = new();
  306. //上一条
  307. var pTemp = list.Find(p => p.Page == temp.Page - 1);
  308. if (pTemp != null)
  309. returnDto.Add(new()
  310. {
  311. NoticeID = pTemp.NoticeID,
  312. NoticeTitle = pTemp.NoticeTitle,
  313. pntype = "p"
  314. });
  315. //下一条
  316. var nTemp = list.Find(p => p.Page == temp.Page + 1);
  317. if (nTemp != null)
  318. returnDto.Add(new()
  319. {
  320. NoticeID = nTemp.NoticeID,
  321. NoticeTitle = nTemp.NoticeTitle,
  322. pntype = "n"
  323. });
  324. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(returnDto));
  325. }
  326. else
  327. return OpenResponse.Ok(WebPortalDeResponse<List<ArticlePreviousAndNextDataDto>>.Success(null));
  328. }
  329. }
  330. /// <summary>
  331. /// 全文检索
  332. /// </summary>
  333. /// <param name="dto"></param>
  334. /// <returns></returns>
  335. [AllowAnonymous]
  336. [HttpPost("getfulltextsearchlist")]
  337. public async Task<OpenResponse> GetFullTextSearchList([FromBody] QueryArticleListDto dto)
  338. {
  339. if (string.IsNullOrEmpty(dto.PushRanges))
  340. dto.PushRanges = "2";
  341. if (string.IsNullOrEmpty(dto.Condition))
  342. return OpenResponse.Ok(WebPortalDeResponse<FullTextSearchListDataDto>.Success(null));
  343. RefAsync<int> total = 0;
  344. var items = await _bulletinRepository.Queryable()
  345. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  346. .Where(p => p.IsArrive == true)
  347. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  348. .WhereIF(_appOptions.Value.IsYiBin, p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
  349. .WhereIF(_appOptions.Value.IsZiGong, p => p.BulletinTypeId == "5013" || p.BulletinTypeId == "5016" || p.BulletinTypeId == "5011" || p.BulletinTypeId == "5015" || p.BulletinTypeId == "5017")
  350. .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
  351. .OrderByDescending(p => p.CreationTime)
  352. .Select(it => new
  353. {
  354. Page = SqlFunc.RowNumber($"{it.CreationTime} desc "),
  355. NoticeID = it.Id,
  356. Content = it.Content,
  357. NoticeTypeID = it.BulletinTypeId,
  358. NoticeTypeName = it.BulletinTypeName,
  359. NoticeTitle = it.Title,
  360. NoticeBMName = it.SourceOrgName,
  361. NoticeCreateDate = it.CreationTime,
  362. TypeCode = "",
  363. })
  364. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  365. //计算总页数
  366. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  367. FullTextSearchListDataDto dataDto = new()
  368. {
  369. PageCount = nPageCount,
  370. data = _mapper.Map<IReadOnlyList<FullTextSearchListDto>>(items)
  371. };
  372. return OpenResponse.Ok(WebPortalDeResponse<FullTextSearchListDataDto>.Success(dataDto));
  373. }
  374. #endregion
  375. #region 用户
  376. /// <summary>
  377. /// 添加统一认证用户数据
  378. /// </summary>
  379. /// <param name="dto"></param>
  380. /// <returns></returns>
  381. [AllowAnonymous]
  382. [HttpPost("adduserauth")]
  383. public async Task<OpenResponse> AddUserAuth([FromBody] UserModelDto dto)
  384. {
  385. bool bResult = false;
  386. // 唯一记录ID
  387. string id = dto.id;
  388. // 注册用户ID
  389. string webUserID = "";
  390. // 统一认证用户注册ID
  391. string wUAID = "";
  392. //查询是否有注册用户
  393. var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == id, HttpContext.RequestAborted);
  394. if (dataUser != null)
  395. {
  396. webUserID = dataUser.WebUserID;
  397. wUAID = dataUser.Id;
  398. }
  399. //没有注册用户添加数据
  400. if (string.IsNullOrEmpty(webUserID))
  401. {
  402. var userRegister = _mapper.Map<WebUserRegister>(dto);
  403. userRegister.RegDate = DateTime.Now;
  404. userRegister.LastDate = DateTime.Now;
  405. webUserID = await _webUserRegisterRepository.AddAsync(userRegister, HttpContext.RequestAborted);
  406. }
  407. //统一认证数据
  408. var userAuth = _mapper.Map<WebUserAuth>(dto);
  409. if (!string.IsNullOrEmpty(wUAID))
  410. {
  411. //修改数据
  412. userAuth.Id = wUAID;
  413. await _webUserAuthRepository.UpdateAsync(userAuth, HttpContext.RequestAborted);
  414. bResult = true;
  415. }
  416. else
  417. {
  418. //新增数据
  419. userAuth.WebGUID = Guid.NewGuid().ToString();
  420. userAuth.WebUserID = webUserID;
  421. var addId = await _webUserAuthRepository.AddAsync(userAuth, HttpContext.RequestAborted);
  422. if (!string.IsNullOrEmpty(addId))
  423. bResult = true;
  424. }
  425. //判断是否成功
  426. if (bResult)
  427. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(webUserID));
  428. else
  429. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed());
  430. }
  431. /// <summary>
  432. /// 用户中心用户写信数据
  433. /// </summary>
  434. /// <param name="dto"></param>
  435. /// <returns></returns>
  436. [HttpPost("getorderbyuserlist")]
  437. [AllowAnonymous]
  438. public async Task<OpenResponse> GetOrderByUserList([FromBody] QueryOrderListByUserDto dto)
  439. {
  440. var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == dto.UserId, HttpContext.RequestAborted);
  441. if (dataUser != null)
  442. {
  443. RefAsync<int> total = 0;
  444. var items = await _webFlowAcceptRepository.Queryable()
  445. .LeftJoin<Hotline.Orders.Order>((o, or) => o.OrderId == or.Id)
  446. .Where(o => o.WebUserID == dataUser.WebUserID)
  447. //重新构建数据
  448. .Select((o, or) => new
  449. {
  450. FlowID = o.OrderId,
  451. FlowCode = o.Code,
  452. FlowPwd = o.Pwd,
  453. FlowTitle = o.Title,
  454. FlowFromName = or.SourceChannel,
  455. FlowPurTypeName = o.PurTypeName,
  456. ConTypeName = or.HotspotName,
  457. FlowAddDate = o.CreationTime,
  458. RSFlagName = or.Status < EOrderStatus.Filed ? "办理中" : "办理完成",
  459. WebUserID = o.WebUserID
  460. })
  461. //将结果合并成一个表
  462. .MergeTable()
  463. .Where(p => p.WebUserID == dataUser.WebUserID)
  464. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  465. //计算总页数
  466. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  467. OrderListReturnDto returnDto = new()
  468. {
  469. PageNum = dto.PageIndex,
  470. PageCount = nPageCount,
  471. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  472. };
  473. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  474. }
  475. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(new OrderListReturnDto(), "成功"));
  476. }
  477. /// <summary>
  478. /// 用户中心用户写信数据
  479. /// </summary>
  480. /// <param name="dto"></param>
  481. /// <returns></returns>
  482. [HttpPost("getorderbyuserphonelist")]
  483. [AllowAnonymous]
  484. public async Task<OpenResponse> GetOrderByUserPhoneList([FromBody] QueryOrderListByUserDto dto)
  485. {
  486. RefAsync<int> total = 0;
  487. var items = await _webFlowAcceptRepository.Queryable()
  488. .LeftJoin<Hotline.Orders.Order>((o, or) => o.OrderId == or.Id)
  489. .Where(o => o.Mobile == dto.PhoneNum)
  490. //重新构建数据
  491. .Select((o, or) => new
  492. {
  493. FlowID = o.OrderId,
  494. FlowCode = o.Code,
  495. FlowPwd = o.Pwd,
  496. FlowTitle = o.Title,
  497. FlowFromName = or.SourceChannel,
  498. FlowPurTypeName = o.PurTypeName,
  499. ConTypeName = or.HotspotName,
  500. FlowAddDate = o.CreationTime,
  501. RSFlagName = or.Status < EOrderStatus.Filed ? "办理中" : "办理完成",
  502. Mobile = o.Mobile
  503. })
  504. //将结果合并成一个表
  505. .MergeTable()
  506. .Where(p => p.Mobile == dto.PhoneNum)
  507. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  508. //计算总页数
  509. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  510. OrderListReturnDto returnDto = new()
  511. {
  512. PageNum = dto.PageIndex,
  513. PageCount = nPageCount,
  514. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  515. };
  516. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  517. }
  518. #endregion
  519. #region 短信、基础设置
  520. /// <summary>
  521. /// 短信验证码发送
  522. /// </summary>
  523. /// <param name="dto"></param>
  524. /// <returns></returns>
  525. [AllowAnonymous]
  526. [HttpPost("writeletterssendsms")]
  527. public async Task<OpenResponse> WriteLettersSendSms([FromBody] WebPortalSendSmsModelDto dto)
  528. {
  529. string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd");
  530. var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted);
  531. if (data != null)//已经发过短信
  532. {
  533. //是否可以继续发送短信(10次)
  534. if (data.SendCount > 10)
  535. //短信发送超过10条
  536. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-2"));
  537. // 验证是否在两分钟之内
  538. TimeSpan duration = DateTime.Now - data.AddTime; // 计算时间差
  539. if ((int)duration.TotalSeconds < 120)
  540. // 距离上次发送时间不足两分钟
  541. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-4"));
  542. //修改缓存信息
  543. data.SendCount++;
  544. data.SmsCode = dto.SmsCode;
  545. data.AddTime = DateTime.Now;
  546. }
  547. else
  548. {
  549. //没有发过短信,直接写入数据
  550. data = new WriteLettersSendSmsDto
  551. {
  552. AddTime = DateTime.Now,
  553. SmsCode = dto.SmsCode,
  554. MobileNum = dto.TelNum,
  555. SendCount = 1
  556. };
  557. }
  558. //这里发送短信 宜宾12345市民服务热线网站验证码{0},用于写信时验证联系电话。验证码有效期10分钟。
  559. var messageDto = new Share.Dtos.Push.MessageDto
  560. {
  561. PushBusiness = EPushBusiness.MsgCode,
  562. ExternalId = "",
  563. OrderId = "",
  564. PushPlatform = EPushPlatform.Web,
  565. Remark = "",
  566. Name = dto.TelNum,
  567. TemplateCode = "1008",
  568. Params = new List<string>() { dto.SmsCode },
  569. TelNumber = dto.TelNum,
  570. };
  571. await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
  572. //修改缓存
  573. await _writeLettersSendSms.SetAsync(keyToken, data, TimeSpan.FromDays(1), HttpContext.RequestAborted);
  574. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("1"));
  575. }
  576. /// <summary>
  577. /// 验证短信验证码是否正确 正确返回1,错误返回-1
  578. /// </summary>
  579. /// <param name="dto"></param>
  580. /// <returns></returns>
  581. [AllowAnonymous]
  582. [HttpPost("checksmscode")]
  583. public async Task<OpenResponse> CheckSmsCode([FromBody] WebPortalSendSmsModelDto dto)
  584. {
  585. string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd");
  586. var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted);
  587. //检测是否存在
  588. if (data != null)
  589. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(data.SmsCode));
  590. //不存在
  591. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-1"));
  592. }
  593. /// <summary>
  594. /// 获取热点分类的树形
  595. /// </summary>
  596. /// <returns></returns>
  597. [AllowAnonymous]
  598. [HttpPost("gethotspottreelist")]
  599. public async Task<OpenResponse> GetHotspotTreeList()
  600. {
  601. var data = await _hotspotRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null);
  602. return OpenResponse.Ok(WebPortalDeResponse<List<Hotspot>>.Success(data));
  603. }
  604. /// <summary>
  605. /// 系统主题颜色
  606. /// </summary>
  607. /// <returns></returns>
  608. [AllowAnonymous]
  609. [HttpPost("getsystemsettingstheme")]
  610. public async Task<OpenResponse> GetSystemSettingsTheme()
  611. {
  612. var WebSystemSettingsTheme = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.WebSystemSettingsTheme).SettingValue[0]);
  613. if (WebSystemSettingsTheme == false)
  614. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(""));
  615. else
  616. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("class=gray2"));
  617. }
  618. #endregion
  619. #region 办件
  620. /// <summary>
  621. /// 获取信件前6条数据
  622. /// </summary>
  623. /// <param name="dto"></param>
  624. /// <returns></returns>
  625. [HttpPost("getorderlistbynum")]
  626. [AllowAnonymous]
  627. public async Task<OpenResponse> GetOrderListByNum([FromBody] QueryOrderListByNumDto dto)
  628. {
  629. var queryNew = _orderRepository.Queryable()
  630. .LeftJoin<OrderPublish>((p, op) => p.Id == op.OrderId)
  631. .Where(p => p.IsPublicity == true)
  632. .OrderByDescending((p, op) => p.CreationTime)
  633. .Select((p, op) => new DataListTopDto
  634. {
  635. DataID = p.Id,
  636. Title = p.Title,
  637. CreateDate = op.CreationTime
  638. });
  639. var queryold = _oldPublicDataRepository.Queryable()
  640. .OrderByDescending(p => p.PubDate)
  641. .Select(p => new DataListTopDto
  642. {
  643. DataID = p.OrderId,
  644. Title = p.Title,
  645. CreateDate = p.CreationTime
  646. });
  647. var items = await _orderRepository.UnionAll(queryNew, queryold)
  648. .OrderByDescending(p => p.CreateDate)
  649. .Take(dto.Num)
  650. .ToListAsync();
  651. var data = _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  652. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<DataListTopDto>>.Success(data, "成功"));
  653. }
  654. /// <summary>
  655. /// 办件摘编列表数据
  656. /// </summary>
  657. /// <param name="dto"></param>
  658. /// <returns></returns>
  659. [HttpPost("getorderlist")]
  660. [AllowAnonymous]
  661. public async Task<OpenResponse> GetOrderList([FromBody] QueryOrderListDto dto)
  662. {
  663. RefAsync<int> total = 0;
  664. var queryNew = _orderPublishRepository.Queryable()
  665. .Includes(d => d.Order)
  666. .Where(d => d.PublishState == true && d.Order.Id != null)
  667. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), d => d.Order.No == dto.FlowCode)
  668. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), d => d.Order.Title.Contains(dto.FlowName))
  669. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), d => d.Order.AcceptTypeCode == dto.FlowSType)
  670. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), d => d.Order.HotspotId == dto.FlowRType)
  671. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), d => d.Order.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  672. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), d => d.Order.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  673. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), d => d.Order.FromName.Contains(dto.FlowFrom))
  674. .OrderByDescending(p => p.CreationTime)
  675. .Select(p => new OrderListDto
  676. {
  677. FlowID = p.OrderId,
  678. FlowCode = p.No,
  679. FlowPwd = p.Order.Password,
  680. FlowTitle = p.Order.Title,
  681. FlowFromName = p.Order.SourceChannel,
  682. FlowPurTypeName = p.Order.AcceptType,
  683. ConTypeName = p.Order.HotspotName,
  684. FlowAddDate = p.Order.CreationTime,
  685. RSFlagName = p.Order.Status >= EOrderStatus.Filed ? "办理完成" : "办理中",
  686. PubDate = p.CreationTime
  687. });
  688. var queryold = _oldPublicDataRepository.Queryable()
  689. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), d => d.OrderNo == dto.FlowCode)
  690. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), d => d.Title.Contains(dto.FlowName))
  691. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), d => d.AcceptTypeCode == dto.FlowSType)
  692. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), d => d.PubDate >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  693. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), d => d.PubDate <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  694. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), d => d.FromName.Contains(dto.FlowFrom))
  695. .OrderByDescending(p => p.PubDate)
  696. .Select(p => new OrderListDto
  697. {
  698. FlowID = p.OrderId,
  699. FlowCode = p.OrderNo,
  700. FlowPwd = p.OrderPwd,
  701. FlowTitle = p.Title,
  702. FlowFromName = p.SourceChannel,
  703. FlowPurTypeName = p.AcceptType,
  704. ConTypeName = p.HotspotName,
  705. FlowAddDate = p.AcceptTime,
  706. RSFlagName = p.State == "1" ? "办理完成" : "办理中",
  707. PubDate = p.PubDate
  708. });
  709. var items = await _orderRepository.UnionAll(queryNew, queryold)
  710. .OrderByDescending(p => p.PubDate)
  711. .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
  712. //计算总页数
  713. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  714. OrderListReturnDto returnDto = new()
  715. {
  716. PageNum = dto.PageIndex,
  717. PageCount = nPageCount,
  718. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  719. };
  720. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  721. }
  722. /// <summary>
  723. /// <summary>
  724. /// 查询工单发布后公开的数据
  725. /// </summary>
  726. /// <param name="dto"></param>
  727. /// <returns></returns>
  728. [HttpPost("get_order_list_publish_all")]
  729. [AllowAnonymous]
  730. public async Task<OpenResponse> GetOrderByListAllOpen([FromBody] QueryOrderListDto dto)
  731. {
  732. var queryNew = _orderRepository.Queryable()
  733. .LeftJoin<OrderPublish>((p, op) => p.Id == op.OrderId)
  734. .Where(p => p.IsPublicity == true)
  735. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), (p, op) => p.No == dto.FlowCode)
  736. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), (p, op) => p.Title.Contains(dto.FlowName))
  737. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), (p, op) => p.AcceptTypeCode == dto.FlowSType)
  738. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), (p, op) => p.HotspotId == dto.FlowRType)
  739. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), (p, op) => p.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  740. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), (p, op) => p.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  741. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), (p, op) => p.FromName.Contains(dto.FlowFrom))
  742. .WhereIF(dto.IdentityType.HasValue, (p, op) => p.IdentityType == dto.IdentityType)
  743. .OrderByDescending((p, op) => p.CreationTime)
  744. .Select((p, op) => new OrderListDto
  745. {
  746. FlowID = p.Id,
  747. FlowCode = p.No,
  748. FlowPwd = p.Password,
  749. FlowTitle = p.Title,
  750. FlowFromName = p.SourceChannel,
  751. FlowPurTypeName = p.AcceptType,
  752. ConTypeName = p.HotspotName,
  753. FlowAddDate = p.CreationTime,
  754. PubDate = op.CreationTime,
  755. RSFlagName = p.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
  756. });
  757. var queryold = _oldPublicDataRepository.Queryable()
  758. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), p => p.OrderNo == dto.FlowCode)
  759. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), p => p.Title.Contains(dto.FlowName))
  760. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), p => p.AcceptTypeCode == dto.FlowSType)
  761. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), p => p.HotspotId == dto.FlowRType)
  762. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), p => p.AcceptTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  763. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), p => p.AcceptTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  764. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), p => p.FromName.Contains(dto.FlowFrom))
  765. .WhereIF(dto.IdentityType.HasValue, p => p.IdentityType == dto.IdentityType)
  766. .OrderByDescending(p => p.PubDate)
  767. .Select(p => new OrderListDto
  768. {
  769. FlowID = p.OrderId,
  770. FlowCode = p.OrderNo,
  771. FlowPwd = p.OrderPwd,
  772. FlowTitle = p.Title,
  773. FlowFromName = p.SourceChannelCode,
  774. FlowPurTypeName = p.AcceptTypeCode,
  775. ConTypeName = p.HotspotName,
  776. FlowAddDate = p.CreationTime,
  777. PubDate = p.CreationTime,
  778. RSFlagName = p.State == "1" ? "办理完成" : "办理中"
  779. });
  780. var (total, items) = await _orderRepository.UnionAll(queryNew, queryold)
  781. .OrderByDescending(p => p.PubDate)
  782. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  783. //计算总页数
  784. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  785. OrderListReturnDto returnDto = new()
  786. {
  787. Total = total,
  788. PageNum = dto.PageIndex,
  789. PageCount = nPageCount,
  790. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  791. };
  792. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
  793. }
  794. /// <summary>
  795. /// 查询工单发布后公开的数据
  796. /// </summary>
  797. /// <param name="dto"></param>
  798. /// <returns></returns>
  799. [HttpPost("get_order_list_all_bynoortitle")]
  800. [AllowAnonymous]
  801. public async Task<OpenResponse> GetOrderByListAllByNoOrTitle([FromBody] QueryOrderListDto dto)
  802. {
  803. var (total, items) = await _orderRepository.Queryable(includeDeleted: true)
  804. .LeftJoin<OrderPublish>((p, op) => p.Id == op.OrderId)
  805. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), (p, op) => p.No == dto.FlowCode)
  806. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), (p, op) => p.Title.Contains(dto.FlowName))
  807. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), (p, op) => p.AcceptTypeCode == dto.FlowSType)
  808. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), (p, op) => p.HotspotId == dto.FlowRType)
  809. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), (p, op) => p.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  810. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), (p, op) => p.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  811. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), (p, op) => p.FromName.Contains(dto.FlowFrom))
  812. .WhereIF(dto.IdentityType.HasValue, (p, op) => p.IdentityType == dto.IdentityType)
  813. .OrderByDescending((p, op) => p.CreationTime)
  814. .Select((p, op) => new OrderListDto
  815. {
  816. FlowID = p.Id,
  817. FlowCode = p.No,
  818. FlowPwd = p.Password,
  819. FlowTitle = p.Title,
  820. FlowFromName = p.SourceChannel,
  821. FlowPurTypeName = p.AcceptType,
  822. ConTypeName = p.HotspotName,
  823. FlowAddDate = p.CreationTime,
  824. PubDate = op.CreationTime,
  825. RSFlagName = p.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
  826. })
  827. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  828. OrderListReturnAllDto returnDto = new()
  829. {
  830. Total = total,
  831. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  832. };
  833. return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnAllDto>.Success(returnDto, "成功"));
  834. }
  835. /// <summary>
  836. /// 办件摘编详情
  837. /// </summary>
  838. /// <param name="dto"></param>
  839. /// <returns></returns>
  840. [AllowAnonymous]
  841. [HttpPost("getorderdetailbyid")]
  842. public async Task<OpenResponse> GetOrderDetailById([FromBody] ArticleIdDto dto)
  843. {
  844. var data = await _orderRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  845. var orderDetail = _mapper.Map<OrderDetail>(data);
  846. if (data != null)
  847. {
  848. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  849. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  850. orderDetail.IsProvinceOrder = "1";
  851. else
  852. orderDetail.IsProvinceOrder = "0";
  853. //获取发布的数据
  854. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  855. if (orderPublish != null)
  856. {
  857. orderDetail.PubFlag = "1";
  858. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  859. orderDetail.FlowContent = orderPublish.ArrangeContent;
  860. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  861. if (orderPublish.PublishState)
  862. orderDetail.FlowPubFlagName = "公开";
  863. }
  864. //能否进行评价
  865. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  866. if (orderVisit == null)
  867. orderDetail.VisitType = "0";
  868. else
  869. {
  870. orderDetail.VisitType = orderVisit.VisitState switch
  871. {
  872. EVisitState.WaitForVisit => "1",
  873. EVisitState.Visited => "2",
  874. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  875. _ => "0",
  876. };
  877. }
  878. }
  879. List<OrderDetail> dataDto = new() { orderDetail };
  880. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderDetail>>.Success(dataDto));
  881. }
  882. /// <summary>
  883. /// 根据编号和密码查询信件ID
  884. /// </summary>
  885. /// <param name="dto"></param>
  886. /// <returns></returns>
  887. [AllowAnonymous]
  888. [HttpPost("getorderid")]
  889. public async Task<OpenResponse> GetOrderId([FromBody] GetOrderCodePwd dto)
  890. {
  891. var data = await _orderRepository.GetAsync(p => p.No == dto.OrderNo && p.Password == dto.Pwd, HttpContext.RequestAborted);//&& p.Status > EOrderStatus.Published
  892. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(data?.Id));
  893. }
  894. /// <summary>
  895. /// 办件摘编详情
  896. /// </summary>
  897. /// <param name="dto"></param>
  898. /// <returns></returns>
  899. [AllowAnonymous]
  900. [HttpPost("getorderdetailbyno")]
  901. public async Task<OpenResponse> GetOrderDetailByNo([FromBody] GetOrderCodePwd dto)
  902. {
  903. var data = await _orderRepository.GetAsync(p => p.No == dto.OrderNo && p.Password == dto.Pwd, HttpContext.RequestAborted);
  904. if (data != null)
  905. {
  906. var orderDetail = _mapper.Map<OrderDetail>(data);
  907. if (data != null)
  908. {
  909. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  910. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  911. orderDetail.IsProvinceOrder = "1";
  912. else
  913. orderDetail.IsProvinceOrder = "0";
  914. //获取发布的数据
  915. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  916. if (orderPublish != null)
  917. {
  918. orderDetail.PubFlag = "1";
  919. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  920. orderDetail.FlowContent = orderPublish.ArrangeContent;
  921. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  922. if (orderPublish.PublishState)
  923. orderDetail.FlowPubFlagName = "公开";
  924. }
  925. //能否进行评价
  926. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  927. if (orderVisit == null)
  928. orderDetail.VisitType = "0";
  929. else
  930. {
  931. orderDetail.VisitType = orderVisit.VisitState switch
  932. {
  933. EVisitState.WaitForVisit => "1",
  934. EVisitState.Visited => "2",
  935. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  936. _ => "0",
  937. };
  938. }
  939. }
  940. List<OrderDetail> dataDto = new() { orderDetail };
  941. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderDetail>>.Success(dataDto));
  942. }
  943. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<string>>.Failed(code: "0", description: "查询失败"));
  944. }
  945. /// <summary>
  946. /// 写信接口
  947. /// </summary>
  948. /// <param name="dto"></param>
  949. /// <returns></returns>
  950. [AllowAnonymous]
  951. [HttpPost("orderacceptance")]
  952. public async Task<OpenResponse> OrderAcceptance([FromBody] WebFlowAcceptDto dto)
  953. {
  954. //电话号码去空格
  955. if (!string.IsNullOrEmpty(dto.Mobile))
  956. dto.Mobile = dto.Mobile.Trim();
  957. var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
  958. data.Source = ESource.WebPortal;
  959. if (string.IsNullOrEmpty(data.SourceChannelCode))
  960. {
  961. data.SourceChannel = "因特网";
  962. data.SourceChannelCode = "YTW";
  963. }
  964. if (dto.FromID == "2")
  965. {
  966. data.SourceChannel = "APP";
  967. data.SourceChannelCode = "AP";
  968. data.Source = ESource.APP;
  969. }
  970. if (dto.FromID == "3")
  971. {
  972. data.SourceChannel = "微信";
  973. data.SourceChannelCode = "WX";
  974. data.Source = ESource.WeChat;
  975. }
  976. if (!string.IsNullOrEmpty(data.LicenceNo))
  977. {
  978. data.LicenceTypeCode = "10";
  979. data.LicenceType = "中华人民共和国居民身份证";
  980. }
  981. data.ExternalId = Guid.NewGuid().ToString();
  982. data.IdentityType = dto.IdentityType;
  983. data.Transpond = false;
  984. data.IsEnforcementOrder = false;
  985. var result = await _orderApplication.ReceiveOrderFromExternalAsync(data, HttpContext.RequestAborted);
  986. OrderAcceptanceReturnDto returnDto = new();
  987. if (result != null)
  988. {
  989. returnDto.PWD = result.Password;
  990. returnDto.Code = result.No;
  991. returnDto.State = "1";
  992. dto.Pwd = result.Password;
  993. dto.Code = result.No;
  994. dto.OrderId = result.Id;
  995. var dtoData = _mapper.Map<WebFlowAccept>(dto);
  996. await _webFlowAcceptRepository.AddAsync(dtoData, HttpContext.RequestAborted);
  997. }
  998. else
  999. returnDto.State = "0";
  1000. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Success(returnDto));
  1001. }
  1002. /// <summary>
  1003. /// 受理类型和热点统计
  1004. /// </summary>
  1005. /// <returns></returns>
  1006. [AllowAnonymous]
  1007. [HttpPost("getchartdata")]
  1008. public async Task<OpenResponse> GetChartData()
  1009. {
  1010. var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1011. var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1012. //数据查询
  1013. var listType = await _orderRepository.Queryable()
  1014. .Where(p => p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept)
  1015. .Select(it => new
  1016. {
  1017. it.AcceptType,
  1018. it.AcceptTypeCode
  1019. })
  1020. .MergeTable()//将查询出来的结果合并成一个新表
  1021. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  1022. .Select(it => new
  1023. {
  1024. name = it.AcceptType,
  1025. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1026. })
  1027. .ToListAsync();
  1028. var listHot = await _orderRepository.Queryable()
  1029. .Where(it => it.CreationTime >= startDate && it.CreationTime <= endDate && it.Status > EOrderStatus.WaitForAccept)
  1030. .Select(it => new
  1031. {
  1032. HotspotId = it.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  1033. })
  1034. .MergeTable()
  1035. .Where(it => it.HotspotId != "18")
  1036. .GroupBy(it => it.HotspotId)//对新表进行分组
  1037. .Select(it => new
  1038. {
  1039. HotspotId = it.HotspotId,
  1040. num = SqlFunc.AggregateCount(it.HotspotId)
  1041. })
  1042. .OrderByDescending(it => it.num)
  1043. .Take(5)
  1044. .MergeTable()
  1045. .LeftJoin<Hotspot>((it, h) => it.HotspotId == h.Id)
  1046. .Select((it, h) => new
  1047. {
  1048. typeName = h.HotSpotName,
  1049. num = it.num
  1050. }).ToListAsync();
  1051. ////数据查询-查询总数前5的数据
  1052. //var listHot = await _orderRepository.Queryable()
  1053. // .Where(p => p.StartTime >= startDate && p.StartTime <= endDate && p.Status > EOrderStatus.WaitForAccept)
  1054. // .Select(it => new
  1055. // {
  1056. // it.HotspotId,
  1057. // it.HotspotName
  1058. // })
  1059. // .MergeTable()//将查询出来的结果合并成一个新表
  1060. // .GroupBy(it => new { it.HotspotId, it.HotspotName })//对新表进行分组
  1061. // .Select(it => new
  1062. // {
  1063. // typeName = it.HotspotName,
  1064. // num = SqlFunc.AggregateCount(it.HotspotId)
  1065. // })
  1066. // .OrderByDescending(it => it.num)
  1067. // .Take(5)
  1068. // .ToListAsync();
  1069. GetChartDataDto dataDto = new()
  1070. {
  1071. formCount = _mapper.Map<IReadOnlyList<OrderFormCount>>(listType),
  1072. hotCount = _mapper.Map<IReadOnlyList<OrderHotCount>>(listHot)
  1073. };
  1074. return OpenResponse.Ok(WebPortalDeResponse<GetChartDataDto>.Success(dataDto));
  1075. }
  1076. /// <summary>
  1077. /// 获取统计数据
  1078. /// </summary>
  1079. /// <returns></returns>
  1080. [AllowAnonymous]
  1081. [HttpPost("getstatist")]
  1082. public async Task<OpenResponse> GetStatist()
  1083. {
  1084. var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1085. var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1086. //GetStatistDto getStatistDto = new()
  1087. //{
  1088. // AllCount = await _orderRepository.Queryable().Where(p => p.Status > EOrderStatus.WaitForAccept).CountAsync(),
  1089. // AllTrandCount = await _orderRepository.Queryable().Where(p => p.Status >= EOrderStatus.Filed).CountAsync(),
  1090. // DayCount = await _orderRepository.Queryable().Where(p => p.StartTime >= startDate && p.StartTime <= endDate && p.Status > EOrderStatus.WaitForAccept).CountAsync(),
  1091. // DayTrandCount = await _orderRepository.Queryable().Where(p => p.ActualHandleTime >= startDate && p.ActualHandleTime <= endDate && p.Status >= EOrderStatus.Filed).CountAsync()
  1092. //};
  1093. var getStatistDto = await _orderRepository.Queryable()
  1094. .Select(p => new GetStatistDto
  1095. {
  1096. AllCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Status > EOrderStatus.WaitForAccept, 1, 0)) + 7079457,
  1097. AllTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Status >= EOrderStatus.Filed, 1, 0)) + 7079214,
  1098. DayCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept, 1, 0)),
  1099. DayTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.FiledTime >= startDate && p.FiledTime <= endDate && p.Status >= EOrderStatus.Filed, 1, 0)),
  1100. })
  1101. .FirstAsync();
  1102. return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));
  1103. }
  1104. /// <summary>
  1105. /// 获取统计数据 今日数据
  1106. /// </summary>
  1107. /// <returns></returns>
  1108. [AllowAnonymous]
  1109. [HttpPost("todaygetstatist")]
  1110. public async Task<OpenResponse> GetTodayStatist()
  1111. {
  1112. var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1113. var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1114. var getStatistDto = await _orderRepository.Queryable()
  1115. .Select(p => new GetStatistDto
  1116. {
  1117. DayCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept, 1, 0)),
  1118. DayTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.FiledTime >= startDate && p.FiledTime <= endDate && p.Status >= EOrderStatus.Filed, 1, 0)),
  1119. })
  1120. .FirstAsync();
  1121. return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));
  1122. }
  1123. #endregion
  1124. #region 评价
  1125. /// <summary>
  1126. /// 获取待评价部门信息
  1127. /// </summary>
  1128. /// <param name="dto"></param>
  1129. /// <returns></returns>
  1130. [AllowAnonymous]
  1131. [HttpPost("getwaitvisitdata")]
  1132. public async Task<OpenResponse> GetWaitVisitData([FromBody] ArticleIdDto dto)
  1133. {
  1134. var dataOrder = await _orderVisitRepository.GetAsync(p => p.OrderId == dto.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  1135. if (dataOrder == null)
  1136. return OpenResponse.Ok(WebPortalDeResponse<List<WaitVisitListDataDto>>.Failed("工单不能评价!"));
  1137. if (dataOrder.VisitState != EVisitState.WaitForVisit)
  1138. return OpenResponse.Ok(WebPortalDeResponse<List<WaitVisitListDataDto>>.Failed("工单已经评价!"));
  1139. var data = await _orderVisitDetailRepository.Queryable()
  1140. .Where(p => p.VisitId == dataOrder.Id && p.VisitTarget == EVisitTarget.Org)
  1141. .ToListAsync();
  1142. var listDat = _mapper.Map<List<WaitVisitListDataDto>>(data);
  1143. return OpenResponse.Ok(WebPortalDeResponse<List<WaitVisitListDataDto>>.Success(listDat));
  1144. }
  1145. /// <summary>
  1146. /// 评价内容
  1147. /// </summary>
  1148. /// <param name="dto"></param>
  1149. /// <returns></returns>
  1150. [AllowAnonymous]
  1151. [HttpPost("receivevisitdata")]
  1152. public async Task<OpenResponse> ReceiveVisitData([FromBody] OrderVisitListDataDto dto)
  1153. {
  1154. if (dto == null || dto.VistListDtos == null || dto.VistListDtos.Count == 0)
  1155. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed("评价数据不能为空!"));
  1156. var dataOrder = await _orderVisitRepository.GetAsync(p => p.OrderId == dto.OrderId && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  1157. if (dataOrder == null)
  1158. return OpenResponse.Ok(WebPortalDeResponse<string>.Failed("工单已经评价!"));
  1159. //组装数据
  1160. OrderVisitWebDto visitWebDto = new()
  1161. {
  1162. VisitType = Hotline.Share.Enums.Order.EVisitType.WebVisit,
  1163. VisitTime = DateTime.Now
  1164. };
  1165. List<OrderVisitDetailWebDto> orderVisitDetails = new();
  1166. #region 部门评价
  1167. //部门评价
  1168. //遍历数据
  1169. foreach (var item in dto.VistListDtos)
  1170. {
  1171. Hotline.Share.Dtos.Kv kv = item.SatisfactionCode switch
  1172. {
  1173. "5" => new Hotline.Share.Dtos.Kv { Key = "5", Value = "非常满意" },
  1174. "4" => new Hotline.Share.Dtos.Kv { Key = "4", Value = "满意" },
  1175. "2" => new Hotline.Share.Dtos.Kv { Key = "2", Value = "不满意" },
  1176. _ => new Hotline.Share.Dtos.Kv { Key = "7", Value = "不做评价" },
  1177. };
  1178. //组装回访数据
  1179. visitWebDto.Id = item.VisitId;
  1180. OrderVisitDetailWebDto detailDto = new()
  1181. {
  1182. Id = item.Id,
  1183. VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Org,
  1184. OrgProcessingResults = kv,
  1185. OrgNoSatisfiedReason = new List<Hotline.Share.Dtos.Kv>(),
  1186. OrgHandledAttitude = kv,
  1187. VisitContent = item.VisitContent
  1188. };
  1189. orderVisitDetails.Add(detailDto);
  1190. }
  1191. #endregion
  1192. visitWebDto.OrderVisitDetailDto = orderVisitDetails;
  1193. //推送数据
  1194. await _orderApplication.OrderVisitWeb(visitWebDto, HttpContext.RequestAborted);
  1195. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("1"));
  1196. }
  1197. #endregion
  1198. /// <summary>
  1199. /// 获取知识库分类
  1200. /// </summary>
  1201. /// <returns></returns>
  1202. [HttpPost("getknowledgetype")]
  1203. [AllowAnonymous]
  1204. public async Task<OpenResponse> GetKnowledgeType()
  1205. {
  1206. //查询知识分类
  1207. var item = await _knowledgeTypeRepository.Queryable()
  1208. .Where(p => p.ParentId == null || p.ParentId == "")
  1209. .Select(p => new
  1210. {
  1211. SDICT_ID = p.Id,
  1212. SDICT_Name = p.Name
  1213. })
  1214. .ToListAsync();
  1215. //查询知识标签
  1216. var list = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.KnowledgeBaseTags).Select(p => new
  1217. {
  1218. SDICT_Name = p.DicDataName,
  1219. SDICT_ID = p.DicDataName
  1220. }).ToList();
  1221. var rsp = new
  1222. {
  1223. KnowledgeType = item,
  1224. KnowledgeBaseTags = list,
  1225. };
  1226. return OpenResponse.Ok(WebPortalDeResponse<object>.Success(rsp));
  1227. }
  1228. /// <summary>
  1229. /// 知识库查询
  1230. /// </summary>
  1231. /// <param name="dto"></param>
  1232. /// <returns></returns>
  1233. [HttpPost("getknowledgelist")]
  1234. [AllowAnonymous]
  1235. public async Task<OpenResponse> GetKnowledgeList([FromBody] QueryKnowledgeList dto)
  1236. {
  1237. var typeSpliceName = string.Empty;
  1238. if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
  1239. {
  1240. var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeTypeId);
  1241. typeSpliceName = type?.SpliceName;
  1242. }
  1243. var typeSpliceNameTags = string.Empty;
  1244. if (!string.IsNullOrEmpty(dto.KnowledgeBaseTags))
  1245. {
  1246. var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeBaseTags);
  1247. typeSpliceNameTags = type?.SpliceName;
  1248. }
  1249. var (total, items) = await _knowledgeRepository.Queryable()
  1250. .Where(p => p.IsPublic == true && p.Status == EKnowledgeStatus.OnShelf)
  1251. .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
  1252. .WhereIF(!string.IsNullOrEmpty(typeSpliceNameTags), p => p.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceNameTags)))
  1253. .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
  1254. .OrderByDescending(p => p.CreationTime)
  1255. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1256. var data = new PagedDto<KnowledgeInfoDto>(total, _mapper.Map<IReadOnlyList<KnowledgeInfoDto>>(items));
  1257. return OpenResponse.Ok(WebPortalDeResponse<PagedDto<KnowledgeInfoDto>>.Success(data));
  1258. }
  1259. /// <summary>
  1260. /// 获取知识库详情
  1261. /// </summary>
  1262. /// <param name="dto"></param>
  1263. /// <returns></returns>
  1264. [HttpPost("getknowledgeinfo")]
  1265. [AllowAnonymous]
  1266. public async Task<OpenResponse> GetKnowledgeInfo([FromBody] QueryKnowledgeInfo dto)
  1267. {
  1268. var data = await _knowledgeRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  1269. KnowledgeInfoDto detailsDto = null;
  1270. if (data != null)
  1271. {
  1272. detailsDto = _mapper.Map<KnowledgeInfoDto>(data);
  1273. if (detailsDto != null && !string.IsNullOrEmpty(detailsDto.Content))
  1274. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  1275. }
  1276. else
  1277. {
  1278. detailsDto = new();
  1279. }
  1280. List<KnowledgeInfoDto> dataDto = [detailsDto];
  1281. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<KnowledgeInfoDto>>.Success(dataDto));
  1282. }
  1283. /// <summary>
  1284. /// 查询受理类型----受理量
  1285. /// </summary>
  1286. /// <param name="dto"></param>
  1287. /// <returns></returns>
  1288. [HttpPost("getacceptancetypestatisticsbymonth")]
  1289. [AllowAnonymous]
  1290. public async Task<OpenResponse> GetAcceptanceTypeStatisticsByMonth([FromBody] OrderFormByMonthDto dto)
  1291. {
  1292. if (string.IsNullOrEmpty(dto.StartTime))
  1293. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  1294. if (string.IsNullOrEmpty(dto.EndTime))
  1295. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  1296. //查询待
  1297. var listType = await _orderRepository.Queryable()
  1298. .Where(p => p.CreationTime >= Convert.ToDateTime(dto.StartTime) && p.CreationTime <= Convert.ToDateTime(dto.EndTime) && p.Status > EOrderStatus.WaitForAccept)
  1299. .Select(it => new
  1300. {
  1301. it.AcceptType,
  1302. it.AcceptTypeCode
  1303. })
  1304. .MergeTable()//将查询出来的结果合并成一个新表
  1305. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  1306. .Select(it => new
  1307. {
  1308. name = it.AcceptType,
  1309. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1310. })
  1311. .ToListAsync();
  1312. var formAcceptanceCount = _mapper.Map<List<OrderFormCount>>(listType);
  1313. if (_appOptions.Value.IsZiGong)
  1314. {
  1315. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  1316. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  1317. foreach (var form in fromName)
  1318. {
  1319. var data = formAcceptanceCount.FirstOrDefault(p => p.name == form);
  1320. orderForms.Add(new OrderFormCount()
  1321. {
  1322. name = form,
  1323. value = data == null ? 0 : data.value
  1324. });
  1325. }
  1326. return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(orderForms));
  1327. }
  1328. return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(formAcceptanceCount));
  1329. }
  1330. /// <summary>
  1331. /// 查询受理类型---办结量
  1332. /// </summary>
  1333. /// <param name="dto"></param>
  1334. /// <returns></returns>
  1335. [HttpPost("getacceptancetypestatisticsbymonthend")]
  1336. [AllowAnonymous]
  1337. public async Task<OpenResponse> GetAcceptanceTypeStatisticsByMonthEnd([FromBody] OrderFormByMonthDto dto)
  1338. {
  1339. if (string.IsNullOrEmpty(dto.StartTime))
  1340. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  1341. if (string.IsNullOrEmpty(dto.EndTime))
  1342. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  1343. //数据查询
  1344. var listFileType = await _orderRepository.Queryable()
  1345. .Where(p => p.FiledTime >= Convert.ToDateTime(dto.StartTime) && p.FiledTime <= Convert.ToDateTime(dto.EndTime) && p.Status >= EOrderStatus.Visited)
  1346. .Select(it => new
  1347. {
  1348. it.AcceptType,
  1349. it.AcceptTypeCode
  1350. })
  1351. .MergeTable()//将查询出来的结果合并成一个新表
  1352. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  1353. .Select(it => new
  1354. {
  1355. name = it.AcceptType,
  1356. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1357. })
  1358. .ToListAsync();
  1359. var formFileCount = _mapper.Map<IReadOnlyList<OrderFormCount>>(listFileType);
  1360. if (_appOptions.Value.IsZiGong)
  1361. {
  1362. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  1363. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  1364. foreach (var form in fromName)
  1365. {
  1366. var data = formFileCount.FirstOrDefault(p => p.name == form);
  1367. orderForms.Add(new OrderFormCount()
  1368. {
  1369. name = form,
  1370. value = data == null ? 0 : data.value
  1371. });
  1372. }
  1373. return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(orderForms));
  1374. }
  1375. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderFormCount>>.Success(formFileCount));
  1376. }
  1377. /// <summary>
  1378. /// 缓存值
  1379. /// </summary>
  1380. /// <param name="dto"></param>
  1381. /// <returns></returns>
  1382. [HttpPost("setgetvaildata")]
  1383. [AllowAnonymous]
  1384. public async Task<OpenResponse> SetGetVailData([FromBody] GetVailDataDto dto)
  1385. {
  1386. if (string.IsNullOrEmpty(dto.Key) || string.IsNullOrEmpty(dto.Value))
  1387. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-1"));
  1388. string strGuid = Guid.NewGuid().ToString();
  1389. string keyToken = dto.Key + strGuid;
  1390. await _getVailData.SetAsync(keyToken, dto.Value, TimeSpan.FromHours(1), cancellationToken: HttpContext.RequestAborted);
  1391. return OpenResponse.Ok(WebPortalDeResponse<string>.Success(strGuid));
  1392. }
  1393. /// <summary>
  1394. /// 缓存值
  1395. /// </summary>
  1396. /// <param name="dto"></param>
  1397. /// <returns></returns>
  1398. [HttpPost("getgetvaildata")]
  1399. [AllowAnonymous]
  1400. public async Task<OpenResponse> GetGetVailData([FromBody] GetVailDataDto dto)
  1401. {
  1402. if (string.IsNullOrEmpty(dto.Key))
  1403. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-1"));
  1404. var data = await _getVailData.GetAsync(dto.Key, cancellationToken: HttpContext.RequestAborted);
  1405. if (!string.IsNullOrEmpty(data) && data == dto.Value)
  1406. {
  1407. await _getVailData.RemoveAsync(dto.Key, cancellationToken: HttpContext.RequestAborted);
  1408. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("1"));
  1409. }
  1410. return OpenResponse.Ok(WebPortalDeResponse<string>.Success("-1"));
  1411. }
  1412. }
  1413. }