FwThirdController.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. using DocumentFormat.OpenXml.Office.CoverPageProps;
  2. using Hotline.Application.Bulletin;
  3. using Hotline.Application.Identity;
  4. using Hotline.Application.Orders;
  5. using Hotline.Article;
  6. using Hotline.Caching.Interfaces;
  7. using Hotline.Configurations;
  8. using Hotline.KnowledgeBase;
  9. using Hotline.Orders;
  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.Identity;
  15. using Hotline.Share.Dtos.Schedulings;
  16. using Hotline.Share.Dtos.WebPortal;
  17. using Hotline.Share.Enums.KnowledgeBase;
  18. using Hotline.Share.Enums.Order;
  19. using Hotline.Tools;
  20. using Hotline.Users;
  21. using Hotline.WebPortal;
  22. using MapsterMapper;
  23. using MediatR;
  24. using Microsoft.AspNetCore.Authorization;
  25. using Microsoft.AspNetCore.Mvc;
  26. using Microsoft.Extensions.Options;
  27. using NPOI.XWPF.UserModel;
  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 FwThirdController : BaseController
  36. {
  37. #region 注入
  38. private readonly IMapper _mapper;
  39. private readonly IMediator _mediator;
  40. private readonly IRepository<Bulletin> _bulletinRepository;
  41. private readonly IRepository<WebUserRegister> _webUserRegisterRepository;
  42. private readonly IRepository<WebUserAuth> _webUserAuthRepository;
  43. private readonly IRepository<WebFlowAccept> _webFlowAcceptRepository;
  44. private readonly ITypedCache<WriteLettersSendSmsDto> _writeLettersSendSms;
  45. private readonly IRepository<Hotspot> _hotspotRepository;
  46. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  47. private readonly IRepository<OrderPublish> _orderPublishRepository;
  48. private readonly IOrderRepository _orderRepository;
  49. private readonly IRepository<OrderVisit> _orderVisitRepository;
  50. private readonly IRepository<Order> _orderListRepository;
  51. private readonly IRepository<User> _userRepository;
  52. private readonly IOrderApplication _orderApplication;
  53. private readonly ISessionContext _sessionContext;
  54. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  55. private readonly IBulletinApplication _bulletinApplication;
  56. private readonly IRepository<OldPublicData> _oldPublicDataRepository;
  57. private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
  58. private readonly IRepository<Knowledge> _knowledgeRepository;
  59. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  60. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  61. private readonly ITypedCache<string> _getVailData;
  62. private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
  63. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  64. private readonly IIdentityAppService _identityAppService;
  65. private readonly IHttpClientFactory _httpClientFactory;
  66. public FwThirdController(IMapper mapper,
  67. IMediator mediator,
  68. IRepository<Bulletin> bulletinRepository,
  69. IRepository<WebUserRegister> webUserRegisterRepository,
  70. IRepository<WebUserAuth> webUserAuthRepository,
  71. IRepository<WebFlowAccept> webFlowAcceptRepository,
  72. ITypedCache<WriteLettersSendSmsDto> writeLettersSendSms,
  73. IRepository<Hotspot> hotspotRepository,
  74. ISystemSettingCacheManager systemSettingCacheManager,
  75. IRepository<OrderPublish> orderPublishRepository,
  76. IOrderRepository orderRepository,
  77. IRepository<OrderVisit> orderVisitRepository,
  78. IRepository<Order> orderListRepository,
  79. IRepository<User> userRepository,
  80. IOrderApplication orderApplication,
  81. ISessionContext sessionContext,
  82. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  83. IBulletinApplication bulletinApplication,
  84. IRepository<OldPublicData> oldPublicDataRepository,
  85. IRepository<KnowledgeType> knowledgeTypeRepository,
  86. IRepository<Knowledge> knowledgeRepository,
  87. ISystemDicDataCacheManager systemDicDataCacheManager,
  88. IOptionsSnapshot<AppConfiguration> appOptions,
  89. ITypedCache<string> getVailData,
  90. IRepository<KnowledgeWord> knowledgeWordRepository,
  91. ISystemDicDataCacheManager sysDicDataCacheManager,
  92. IIdentityAppService identityAppService,
  93. IHttpClientFactory httpClientFactory
  94. )
  95. {
  96. _mapper = mapper;
  97. _mediator = mediator;
  98. _bulletinRepository = bulletinRepository;
  99. _webUserRegisterRepository = webUserRegisterRepository;
  100. _webUserAuthRepository = webUserAuthRepository;
  101. _webFlowAcceptRepository = webFlowAcceptRepository;
  102. _writeLettersSendSms = writeLettersSendSms;
  103. _hotspotRepository = hotspotRepository;
  104. _systemSettingCacheManager = systemSettingCacheManager;
  105. _orderPublishRepository = orderPublishRepository;
  106. _orderRepository = orderRepository;
  107. _orderVisitRepository = orderVisitRepository;
  108. _userRepository = userRepository;
  109. _orderListRepository = orderListRepository;
  110. _orderApplication = orderApplication;
  111. _sessionContext = sessionContext;
  112. _orderVisitDetailRepository = orderVisitDetailRepository;
  113. _bulletinApplication = bulletinApplication;
  114. _oldPublicDataRepository = oldPublicDataRepository;
  115. _knowledgeTypeRepository = knowledgeTypeRepository;
  116. _knowledgeRepository = knowledgeRepository;
  117. _systemDicDataCacheManager = systemDicDataCacheManager;
  118. _appOptions = appOptions;
  119. _getVailData = getVailData;
  120. _knowledgeWordRepository = knowledgeWordRepository;
  121. _sysDicDataCacheManager = sysDicDataCacheManager;
  122. _identityAppService = identityAppService;
  123. _httpClientFactory = httpClientFactory;
  124. }
  125. #endregion
  126. #region 获取Token
  127. [AllowAnonymous]
  128. [HttpPost("gettoken")]
  129. public async Task<string> LoginWithoutCrypt([FromBody] LoginDto dto)
  130. {
  131. return await _identityAppService.LoginAsync(dto, HttpContext.RequestAborted);
  132. }
  133. #endregion
  134. #region 自贡门户查询接口
  135. #region 受理统计
  136. /// <summary>getacceptancetypestatisticsbymonth
  137. /// 受理统计
  138. /// </summary>
  139. /// <param name="dto"></param>
  140. /// <returns></returns>
  141. [HttpPost("getacceptancetypestatisticsbymonth")]
  142. public async Task<List<OrderFormCount>> GetAcceptanceTypeStatisticsByMonth([FromBody] OrderFormByMonthDto dto)
  143. {
  144. if (string.IsNullOrEmpty(dto.StartTime))
  145. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  146. if (string.IsNullOrEmpty(dto.EndTime))
  147. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  148. //查询待
  149. var listType = await _orderRepository.Queryable()
  150. .Where(p => p.CreationTime >= Convert.ToDateTime(dto.StartTime) && p.CreationTime <= Convert.ToDateTime(dto.EndTime) && p.Status > EOrderStatus.WaitForAccept)
  151. .Select(it => new
  152. {
  153. it.AcceptType,
  154. it.AcceptTypeCode
  155. })
  156. .MergeTable()//将查询出来的结果合并成一个新表
  157. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  158. .Select(it => new
  159. {
  160. name = it.AcceptType,
  161. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  162. })
  163. .ToListAsync();
  164. var formAcceptanceCount = _mapper.Map<List<OrderFormCount>>(listType);
  165. if (_appOptions.Value.IsZiGong)
  166. {
  167. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  168. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  169. foreach (var form in fromName)
  170. {
  171. var data = formAcceptanceCount.FirstOrDefault(p => p.name == form);
  172. orderForms.Add(new OrderFormCount()
  173. {
  174. name = form,
  175. value = data == null ? 0 : data.value
  176. });
  177. }
  178. return orderForms;
  179. }
  180. return formAcceptanceCount;
  181. }
  182. #endregion
  183. #region 办理统计
  184. /// <summary>
  185. /// 办理统计
  186. /// </summary>
  187. /// <param name="dto"></param>
  188. /// <returns></returns>
  189. [HttpPost("getacceptancetypestatisticsbymonthend")]
  190. public async Task<List<OrderFormCount>> GetAcceptanceTypeStatisticsByMonthEnd([FromBody] OrderFormByMonthDto dto)
  191. {
  192. if (string.IsNullOrEmpty(dto.StartTime))
  193. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  194. if (string.IsNullOrEmpty(dto.EndTime))
  195. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  196. //数据查询
  197. var listFileType = await _orderRepository.Queryable()
  198. .Where(p => p.FiledTime >= Convert.ToDateTime(dto.StartTime) && p.FiledTime <= Convert.ToDateTime(dto.EndTime) && p.Status >= EOrderStatus.Visited)
  199. .Select(it => new
  200. {
  201. it.AcceptType,
  202. it.AcceptTypeCode
  203. })
  204. .MergeTable()//将查询出来的结果合并成一个新表
  205. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  206. .Select(it => new
  207. {
  208. name = it.AcceptType,
  209. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  210. })
  211. .ToListAsync();
  212. var formFileCount = _mapper.Map<List<OrderFormCount>>(listFileType);
  213. if (_appOptions.Value.IsZiGong)
  214. {
  215. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  216. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  217. foreach (var form in fromName)
  218. {
  219. var data = formFileCount.FirstOrDefault(p => p.name == form);
  220. orderForms.Add(new OrderFormCount()
  221. {
  222. name = form,
  223. value = data == null ? 0 : data.value
  224. });
  225. }
  226. return orderForms;
  227. }
  228. return formFileCount;
  229. }
  230. #endregion
  231. #region 公告通知、工作简报
  232. /// <summary>
  233. /// 公告通知、工作简报
  234. /// </summary>
  235. /// <param name="dto"></param>
  236. /// <returns></returns>
  237. [HttpPost("getarticlelistbynum")]
  238. public async Task<IReadOnlyList<DataListTopDto>> GetArticleListByNum([FromBody] ArticleIdByNumDto dto)
  239. {
  240. if (string.IsNullOrEmpty(dto.PushRanges))
  241. dto.PushRanges = "2";
  242. var items = await _bulletinRepository.Queryable()
  243. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  244. .Where(p => p.IsArrive == true)
  245. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  246. // .Where(p => p.BulletinTypeId == dto.BulletinTypeId)
  247. .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), p => p.BulletinTypeId == dto.BulletinTypeId)
  248. .WhereIF(!string.IsNullOrEmpty(dto.CheckChar), p => p.Content.Contains(dto.CheckChar))
  249. .WhereIF(!string.IsNullOrEmpty(dto.BulletinDisplayLocation), p => SqlFunc.JsonListObjectAny(p.DisplayLocation, "Key", dto.BulletinDisplayLocation))
  250. .OrderByDescending(p => p.CreationTime)
  251. .Select(it => new
  252. {
  253. DataID = it.Id,
  254. it.Title,
  255. CreateDate = it.CreationTime,
  256. it.Content,
  257. it.BulletinTypeName
  258. })
  259. .Take(dto.Num)
  260. .ToListAsync();
  261. return _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  262. }
  263. /// <summary>
  264. /// 公告通知、工作简报详情
  265. /// </summary>
  266. /// <param name="dto"></param>
  267. /// <returns></returns>
  268. [HttpPost("getarticledetails")]
  269. public async Task<List<ArticleDetailsDto>> GetArticleDetails([FromBody] ArticleIdDto dto)
  270. {
  271. var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  272. ArticleDetailsDto detailsDto = null;
  273. if (data != null)
  274. {
  275. data.ReadedNum = data.ReadedNum++;
  276. await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted);
  277. detailsDto = new()
  278. {
  279. NoticeID = data.Id,
  280. NoticeTypeName = data.BulletinTypeName,
  281. NoticeTitle = data.Title,
  282. NoticeBMName = data.SourceOrgName,
  283. NoticeCreateDate = data.CreationTime,
  284. NoticeRCount = data.ReadedNum,
  285. WNED_VideoUrl = "",
  286. NoticeContent = data.Content
  287. };
  288. if (data != null && !string.IsNullOrEmpty(data.Content))
  289. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  290. }
  291. else
  292. detailsDto = new();
  293. List<ArticleDetailsDto> dataDto = new() { detailsDto };
  294. return dataDto;
  295. }
  296. #endregion
  297. #region 信件选登
  298. /// <summary>
  299. /// 查询工单发布后公开的数据
  300. /// </summary>
  301. /// <param name="dto"></param>
  302. /// <returns></returns>
  303. [HttpPost("get_order_list_publish_all")]
  304. public async Task<OrderListReturnDto> GetOrderByListAllOpen([FromBody] QueryOrderListDto dto)
  305. {
  306. var queryNew = _orderPublishRepository.Queryable()
  307. .LeftJoin<Order>((op, p) => p.Id == op.OrderId)
  308. .Where((op, p) => op.PublishState == true)
  309. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), (op, p) => p.No == dto.FlowCode)
  310. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), (op, p) => op.ArrangeTitle.Contains(dto.FlowName))
  311. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), (op, p) => p.AcceptTypeCode == dto.FlowSType)
  312. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), (op, p) => p.HotspotId == dto.FlowRType)
  313. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), (op, p) => p.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  314. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), (op, p) => p.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  315. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), (op, p) => p.FromName.Contains(dto.FlowFrom))
  316. .WhereIF(dto.IdentityType.HasValue, (op, p) => p.IdentityType == dto.IdentityType)
  317. .OrderByDescending((op, p) => p.CreationTime)
  318. .Select((op, p) => new OrderListDto
  319. {
  320. FlowID = p.Id,
  321. FlowCode = p.No,
  322. FlowPwd = p.Password,
  323. FlowTitle = op.ArrangeTitle,
  324. FlowFromName = p.SourceChannel,
  325. FlowPurTypeName = p.AcceptType,
  326. ConTypeName = p.HotspotName,
  327. FlowAddDate = p.CreationTime,
  328. PubDate = op.CreationTime,
  329. RSFlagName = p.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
  330. });
  331. var queryold = _oldPublicDataRepository.Queryable()
  332. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), p => p.OrderNo == dto.FlowCode)
  333. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), p => p.Title.Contains(dto.FlowName))
  334. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), p => p.AcceptTypeCode == dto.FlowSType)
  335. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), p => p.HotspotId == dto.FlowRType)
  336. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), p => p.AcceptTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  337. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), p => p.AcceptTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  338. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), p => p.FromName.Contains(dto.FlowFrom))
  339. .WhereIF(dto.IdentityType.HasValue, p => p.IdentityType == dto.IdentityType)
  340. .OrderByDescending(p => p.PubDate)
  341. .Select(p => new OrderListDto
  342. {
  343. FlowID = p.OrderId,
  344. FlowCode = p.OrderNo,
  345. FlowPwd = p.OrderPwd,
  346. FlowTitle = p.Title,
  347. FlowFromName = p.SourceChannelCode,
  348. FlowPurTypeName = p.AcceptTypeCode,
  349. ConTypeName = p.HotspotName,
  350. FlowAddDate = p.CreationTime,
  351. PubDate = p.CreationTime,
  352. RSFlagName = p.State == "1" ? "办理完成" : "办理中"
  353. });
  354. var (total, items) = await _orderRepository.UnionAll(queryNew, queryold)
  355. .OrderByDescending(p => p.PubDate)
  356. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  357. //计算总页数
  358. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  359. OrderListReturnDto returnDto = new()
  360. {
  361. Total = total,
  362. PageNum = dto.PageIndex,
  363. PageCount = nPageCount,
  364. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  365. };
  366. return returnDto;
  367. }
  368. /// <summary>
  369. /// 办件摘编详情
  370. /// </summary>
  371. /// <param name="dto"></param>
  372. /// <returns></returns>
  373. [HttpPost("getorderdetailbyid")]
  374. public async Task<OrderDetail> GetOrderDetailById([FromBody] ArticleIdDto dto)
  375. {
  376. var data = await _orderRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  377. var orderDetail = _mapper.Map<OrderDetail>(data);
  378. if (data != null)
  379. {
  380. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  381. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  382. orderDetail.IsProvinceOrder = "1";
  383. else
  384. orderDetail.IsProvinceOrder = "0";
  385. //获取发布的数据
  386. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  387. if (orderPublish != null)
  388. {
  389. orderDetail.PubFlag = "1";
  390. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  391. orderDetail.FlowContent = orderPublish.ArrangeContent;
  392. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  393. if (orderPublish.PublishState)
  394. orderDetail.FlowPubFlagName = "公开";
  395. }
  396. //能否进行评价
  397. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  398. if (orderVisit == null)
  399. orderDetail.VisitType = "0";
  400. else
  401. {
  402. orderDetail.VisitType = orderVisit.VisitState switch
  403. {
  404. EVisitState.WaitForVisit => "1",
  405. EVisitState.Visited => "2",
  406. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  407. _ => "0",
  408. };
  409. }
  410. }
  411. //List<OrderDetail> dataDto = new() { orderDetail };
  412. return orderDetail;
  413. }
  414. #endregion
  415. #region 知识库
  416. #region 知识库分类
  417. /// <summary>
  418. /// 知识库分类
  419. /// </summary>
  420. /// <returns></returns>
  421. [HttpPost("getknowledgetype")]
  422. public async Task<object> GetKnowledgeType()
  423. {
  424. //查询知识分类
  425. var item = await _knowledgeTypeRepository.Queryable()
  426. .Where(p => p.ParentId == null || p.ParentId == "")
  427. .Select(p => new
  428. {
  429. SDICT_ID = p.Id,
  430. SDICT_Name = p.Name
  431. })
  432. .ToListAsync();
  433. //查询知识标签
  434. var list = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.KnowledgeBaseTags).Select(p => new
  435. {
  436. SDICT_Name = p.DicDataName,
  437. SDICT_ID = p.DicDataName
  438. }).ToList();
  439. var rsp = new
  440. {
  441. KnowledgeType = item,
  442. KnowledgeBaseTags = list,
  443. };
  444. return rsp;
  445. }
  446. #endregion
  447. #region 知识库查询
  448. /// <summary>
  449. /// 知识库查询
  450. /// </summary>
  451. /// <param name="dto"></param>
  452. /// <returns></returns>
  453. [HttpPost("getknowledgelist")]
  454. public async Task<PagedDto<KnowledgeInfoThirdDto>> GetKnowledgeList([FromBody] QueryKnowledgeList dto)
  455. {
  456. var typeSpliceName = string.Empty;
  457. if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
  458. {
  459. var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeTypeId);
  460. typeSpliceName = type?.SpliceName;
  461. }
  462. var typeSpliceNameTags = string.Empty;
  463. if (!string.IsNullOrEmpty(dto.KnowledgeBaseTags))
  464. {
  465. var type = await _knowledgeWordRepository.GetAsync(x => x.Tag == dto.KnowledgeBaseTags && x.IsEnable == 1);
  466. typeSpliceNameTags = type?.Id;
  467. }
  468. var (total, items) = await _knowledgeRepository.Queryable()
  469. .Where(p => p.IsPublic == true && p.Status == EKnowledgeStatus.OnShelf)
  470. .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
  471. .WhereIF(!string.IsNullOrEmpty(typeSpliceNameTags), p => SqlFunc.JsonArrayAny(p.Keywords, typeSpliceNameTags) == true)
  472. .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
  473. .OrderByDescending(p => p.CreationTime)
  474. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  475. var data = new PagedDto<KnowledgeInfoThirdDto>(total, _mapper.Map<IReadOnlyList<KnowledgeInfoThirdDto>>(items));
  476. return data;
  477. }
  478. #endregion
  479. #region 知识库详情
  480. /// <summary>
  481. /// 知识库详情
  482. /// </summary>
  483. /// <param name="dto"></param>
  484. /// <returns></returns>
  485. [HttpPost("getknowledgeinfo")]
  486. public async Task<KnowledgeInfoThirdDto> GetKnowledgeInfo([FromBody] QueryKnowledgeInfo dto)
  487. {
  488. var data = await _knowledgeRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  489. KnowledgeInfoThirdDto detailsDto = null;
  490. if (data != null)
  491. {
  492. detailsDto = _mapper.Map<KnowledgeInfoThirdDto>(data);
  493. if (detailsDto != null && !string.IsNullOrEmpty(detailsDto.Content))
  494. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  495. }
  496. else
  497. {
  498. detailsDto = new();
  499. }
  500. return detailsDto;
  501. }
  502. #endregion
  503. #endregion
  504. #region 工单写信
  505. /// <summary>
  506. /// 工单写信
  507. /// </summary>
  508. /// <param name="dto"></param>
  509. /// <returns></returns>
  510. [HttpPost("orderacceptance")]
  511. public async Task<OpenResponse> OrderAcceptance([FromBody] WebFlowAcceptDto dto)
  512. {
  513. //电话号码去空格
  514. if (!string.IsNullOrEmpty(dto.Mobile))
  515. dto.Mobile = dto.Mobile.Trim();
  516. string strResult = dto.ValidateObject();
  517. if (!string.IsNullOrEmpty(strResult))
  518. {
  519. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Failed("数据验证不通过!"));
  520. }
  521. var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
  522. data.Source = ESource.WebPortal;
  523. data.SourceChannel = "因特网";
  524. data.SourceChannelCode = "YTW";
  525. //switch (dto.FromID)
  526. //{
  527. // case "2":
  528. // data.SourceChannel = "APP";
  529. // data.SourceChannelCode = "AP";
  530. // data.Source = ESource.APP;
  531. // break;
  532. // case "3":
  533. // data.SourceChannel = "微信小程序";
  534. // data.SourceChannelCode = "XCX";
  535. // data.Source = ESource.WeChat;
  536. // break;
  537. // case "9"://宜宾人社专用
  538. // data.SourceChannel = "人社APP";
  539. // data.SourceChannelCode = "RSAPP";
  540. // data.Source = ESource.YBHumanSocietyAPP;
  541. // break;
  542. // default:
  543. // break;
  544. //}
  545. if (!string.IsNullOrEmpty(data.LicenceNo))
  546. {
  547. data.LicenceTypeCode = "10";
  548. data.LicenceType = "中华人民共和国居民身份证";
  549. }
  550. data.ExternalId = Guid.NewGuid().ToString();
  551. data.IdentityType = dto.IdentityType;
  552. data.Transpond = false;
  553. data.IsEnforcementOrder = false;
  554. var result = await _orderApplication.ReceiveOrderFromExternalAsync(data, HttpContext.RequestAborted);
  555. OrderAcceptanceReturnDto returnDto = new();
  556. if (result != null)
  557. {
  558. returnDto.PWD = result.Password;
  559. returnDto.Code = result.No;
  560. returnDto.State = "1";
  561. dto.Pwd = result.Password;
  562. dto.Code = result.No;
  563. dto.OrderId = result.Id;
  564. var dtoData = _mapper.Map<WebFlowAccept>(dto);
  565. await _webFlowAcceptRepository.AddAsync(dtoData, HttpContext.RequestAborted);
  566. }
  567. else
  568. returnDto.State = "0";
  569. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Success(returnDto));
  570. }
  571. #endregion
  572. #region 附件上传
  573. /// <summary>
  574. /// 附件上传
  575. /// </summary>
  576. /// <param name="dto"></param>
  577. /// <returns></returns>
  578. [HttpPost("uploadfiles")]
  579. public async Task<GetResultDto> uploadfiles(IFormFile fileData)
  580. {
  581. if (fileData == null || fileData.Length == 0)
  582. {
  583. return new GetResultDto();
  584. }
  585. Stream stream = fileData.OpenReadStream();
  586. byte[] fileContentBytes = StreamToBytes(stream);
  587. var client = _httpClientFactory.CreateClient("fileData");
  588. using (var content = new MultipartFormDataContent())
  589. {
  590. var fileContent = new ByteArrayContent(fileContentBytes);
  591. fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data")
  592. {
  593. Name = fileData.Name,
  594. FileName = fileData.FileName
  595. };
  596. content.Add(fileContent, "fileData", fileData.FileName);
  597. var response = await client.PostAsync($"{_appOptions.Value.FileUpload.Url.TrimEnd('/')}/file/upload?source=HotlineWeb", content);
  598. if (response.IsSuccessStatusCode)
  599. {
  600. var result = await response.Content.ReadFromJsonAsync<GetFileDto>();
  601. return new GetResultDto()
  602. {
  603. id = result.result.id,
  604. fileName = result.result.fileName,
  605. path = result.result.path,
  606. };
  607. }
  608. else
  609. {
  610. return new GetResultDto();
  611. }
  612. }
  613. }
  614. #endregion
  615. #region 工单查询
  616. /// <summary>
  617. /// 根据编号和密码查询信件ID
  618. /// </summary>
  619. /// <param name="dto"></param>
  620. /// <returns></returns>
  621. [HttpPost("getorderdetailbyno")]
  622. public async Task<OrderDetail> GetOrderDetailByNo([FromBody] GetOrderCodePwd dto)
  623. {
  624. var data = await _orderRepository.GetAsync(p => p.No == dto.OrderNo && p.Password == dto.Pwd, HttpContext.RequestAborted);
  625. if (data != null)
  626. {
  627. var orderDetail = _mapper.Map<OrderDetail>(data);
  628. if (data != null)
  629. {
  630. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  631. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  632. orderDetail.IsProvinceOrder = "1";
  633. else
  634. orderDetail.IsProvinceOrder = "0";
  635. //获取发布的数据
  636. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  637. if (orderPublish != null)
  638. {
  639. orderDetail.PubFlag = "1";
  640. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  641. orderDetail.FlowContent = orderPublish.ArrangeContent;
  642. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  643. if (orderPublish.PublishState)
  644. orderDetail.FlowPubFlagName = "公开";
  645. }
  646. //能否进行评价
  647. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  648. if (orderVisit == null)
  649. orderDetail.VisitType = "0";
  650. else
  651. {
  652. orderDetail.VisitType = orderVisit.VisitState switch
  653. {
  654. EVisitState.WaitForVisit => "1",
  655. EVisitState.Visited => "2",
  656. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  657. _ => "0",
  658. };
  659. }
  660. }
  661. List<OrderDetail> dataDto = new() { orderDetail };
  662. return orderDetail;
  663. }
  664. return new OrderDetail();
  665. }
  666. #endregion
  667. #region 私有方法
  668. /// <summary>
  669. /// 将文件转化为文件流
  670. /// </summary>
  671. /// <param name="stream"></param>
  672. /// <returns></returns>
  673. private byte[] StreamToBytes(Stream stream)
  674. {
  675. byte[] bytes = new byte[stream.Length];
  676. stream.Read(bytes, 0, bytes.Length);
  677. // 设置当前流的位置为流的开始
  678. stream.Seek(0, SeekOrigin.Begin);
  679. return bytes;
  680. }
  681. #endregion
  682. #endregion
  683. #region 泸州电信查询接口
  684. #region 工单信息
  685. /// <summary>
  686. /// 工单信息
  687. /// </summary>
  688. /// <param name="dto"></param>
  689. /// <returns></returns>
  690. [HttpGet("getOrderResultList")]
  691. public async Task<OpenResponse> GetOrderResultList([FromBody] DateDto dto)
  692. {
  693. TimeSpan timeSpan = dto.EndTime - dto.StartTime;
  694. if (timeSpan.TotalHours > 24)
  695. {
  696. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>.Failed("0", "开始结束时间不能大于24小时!"));
  697. }
  698. var items = await _orderListRepository.Queryable()
  699. .Where(x => x.CreationTime >= dto.StartTime)
  700. .Where(x => x.CreationTime <= dto.EndTime)
  701. .OrderByDescending(x => x.CreationTime)
  702. .Select(it => new
  703. {
  704. Id = it.Id,
  705. No = it.No,
  706. Title = it.Title,
  707. Content = it.Content,
  708. ActualHandleOrgName = it.ActualHandleOrgName,
  709. CreationTime = it.CreationTime,
  710. FromName = it.FromName,
  711. FromPhone = string.IsNullOrEmpty(it.FromPhone) ? it.FromPhone : it.Contact
  712. })
  713. .ToListAsync();
  714. var OrderDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>(items);
  715. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>.Success(OrderDto, "成功"));
  716. }
  717. #endregion
  718. #region 评价信息
  719. /// <summary>
  720. /// 评价信息
  721. /// </summary>
  722. /// <param name="dto"></param>
  723. /// <returns></returns>
  724. [HttpGet("getVisitResultList")]
  725. public async Task<OpenResponse> GetVisitResultList([FromBody] DateDto dto)
  726. {
  727. TimeSpan timeSpan = dto.EndTime - dto.StartTime;
  728. if (timeSpan.TotalHours > 24)
  729. {
  730. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>.Failed("0", "开始结束时间不能大于24小时!"));
  731. }
  732. var items = await _orderVisitRepository.Queryable()
  733. .Includes(x => x.OrderVisitDetails)
  734. .LeftJoin<OrderPublish>((x, op) => x.OrderId == op.OrderId)
  735. .Where(x => x.CreationTime >= dto.StartTime)
  736. .Where(x => x.CreationTime <= dto.EndTime)
  737. .OrderByDescending(x => x.CreationTime)
  738. .Select((x, op) => new
  739. {
  740. OrderID = x.OrderId,
  741. NowEvaluate = x.NowEvaluate,
  742. VisitContent = x.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org || n.VisitTarget == EVisitTarget.Seat).Select(s => s.VisitContent).First(),
  743. VisitTime = x.VisitTime,
  744. VisitName = x.Employee.Name,
  745. PublishState = op.PublishState
  746. })
  747. .ToListAsync();
  748. var VisitDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>(items);
  749. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>.Success(VisitDto, "成功"));
  750. }
  751. #endregion
  752. #region 账号信息
  753. /// <summary>
  754. /// 账号信息
  755. /// </summary>
  756. /// <param name="dto"></param>
  757. /// <returns></returns>
  758. [HttpGet("getUserResultList")]
  759. public async Task<OpenResponse> GetUserResultList()
  760. {
  761. var items = await _userRepository.Queryable()
  762. .OrderByDescending(x => x.CreationTime)
  763. .Select(it => new
  764. {
  765. UUID = it.Id,
  766. Name = it.Name
  767. })
  768. .ToListAsync();
  769. var UserDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>>(items);
  770. return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>>.Success(UserDto, "成功"));
  771. }
  772. #endregion
  773. #endregion
  774. }
  775. }