FwThirdController.cs 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. using DocumentFormat.OpenXml.Office.CoverPageProps;
  2. using Hotline.Application.Bulletin;
  3. using Hotline.Application.Identity;
  4. using Hotline.Application.OrderApp;
  5. using Hotline.Article;
  6. using Hotline.Caching.Interfaces;
  7. using Hotline.Configurations;
  8. using Hotline.KnowledgeBase;
  9. using Hotline.Orders;
  10. using Hotline.Push.Notifies;
  11. using Hotline.Repository.SqlSugar.Extensions;
  12. using Hotline.Settings;
  13. using Hotline.Settings.Hotspots;
  14. using Hotline.Share.Dtos;
  15. using Hotline.Share.Dtos.Identity;
  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.Share.Tools;
  22. using Hotline.Tools;
  23. using Hotline.Users;
  24. using Hotline.WebPortal;
  25. using MapsterMapper;
  26. using MediatR;
  27. using Microsoft.AspNetCore.Authorization;
  28. using Microsoft.AspNetCore.Mvc;
  29. using Microsoft.Extensions.Options;
  30. using NPOI.XWPF.UserModel;
  31. using SqlSugar;
  32. using System;
  33. using System.Drawing;
  34. using System.Drawing.Imaging;
  35. using System.Text;
  36. using XF.Domain.Authentications;
  37. using XF.Domain.Cache;
  38. using XF.Domain.Exceptions;
  39. using XF.Domain.Filters;
  40. using XF.Domain.Repository;
  41. namespace Hotline.Api.Controllers
  42. {
  43. public class FwThirdController : BaseController
  44. {
  45. #region 注入
  46. private readonly IMapper _mapper;
  47. private readonly IMediator _mediator;
  48. private readonly IRepository<Bulletin> _bulletinRepository;
  49. private readonly IRepository<WebUserRegister> _webUserRegisterRepository;
  50. private readonly IRepository<WebUserAuth> _webUserAuthRepository;
  51. private readonly IRepository<WebFlowAccept> _webFlowAcceptRepository;
  52. private readonly ITypedCache<VerificationPic> _verificationPic;
  53. private readonly ITypedCache<WriteLettersSendSmsDto> _writeLettersSendSms;
  54. private readonly IRepository<Hotspot> _hotspotRepository;
  55. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  56. private readonly IRepository<OrderPublish> _orderPublishRepository;
  57. private readonly IOrderRepository _orderRepository;
  58. private readonly IRepository<OrderVisit> _orderVisitRepository;
  59. private readonly IRepository<Order> _orderListRepository;
  60. private readonly IRepository<User> _userRepository;
  61. private readonly IOrderApplication _orderApplication;
  62. private readonly ISessionContext _sessionContext;
  63. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  64. private readonly IBulletinApplication _bulletinApplication;
  65. private readonly IRepository<OldPublicData> _oldPublicDataRepository;
  66. private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
  67. private readonly IRepository<Knowledge> _knowledgeRepository;
  68. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  69. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  70. private readonly ITypedCache<string> _getVailData;
  71. private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
  72. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  73. private readonly IIdentityAppService _identityAppService;
  74. private readonly IHttpClientFactory _httpClientFactory;
  75. public FwThirdController(IMapper mapper,
  76. IMediator mediator,
  77. IRepository<Bulletin> bulletinRepository,
  78. IRepository<WebUserRegister> webUserRegisterRepository,
  79. IRepository<WebUserAuth> webUserAuthRepository,
  80. IRepository<WebFlowAccept> webFlowAcceptRepository,
  81. ITypedCache<VerificationPic> verificationPic,
  82. ITypedCache<WriteLettersSendSmsDto> writeLettersSendSms,
  83. IRepository<Hotspot> hotspotRepository,
  84. ISystemSettingCacheManager systemSettingCacheManager,
  85. IRepository<OrderPublish> orderPublishRepository,
  86. IOrderRepository orderRepository,
  87. IRepository<OrderVisit> orderVisitRepository,
  88. IRepository<Order> orderListRepository,
  89. IRepository<User> userRepository,
  90. IOrderApplication orderApplication,
  91. ISessionContext sessionContext,
  92. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  93. IBulletinApplication bulletinApplication,
  94. IRepository<OldPublicData> oldPublicDataRepository,
  95. IRepository<KnowledgeType> knowledgeTypeRepository,
  96. IRepository<Knowledge> knowledgeRepository,
  97. ISystemDicDataCacheManager systemDicDataCacheManager,
  98. IOptionsSnapshot<AppConfiguration> appOptions,
  99. ITypedCache<string> getVailData,
  100. IRepository<KnowledgeWord> knowledgeWordRepository,
  101. ISystemDicDataCacheManager sysDicDataCacheManager,
  102. IIdentityAppService identityAppService,
  103. IHttpClientFactory httpClientFactory
  104. )
  105. {
  106. _mapper = mapper;
  107. _mediator = mediator;
  108. _bulletinRepository = bulletinRepository;
  109. _webUserRegisterRepository = webUserRegisterRepository;
  110. _webUserAuthRepository = webUserAuthRepository;
  111. _webFlowAcceptRepository = webFlowAcceptRepository;
  112. _verificationPic = verificationPic;
  113. _writeLettersSendSms = writeLettersSendSms;
  114. _hotspotRepository = hotspotRepository;
  115. _systemSettingCacheManager = systemSettingCacheManager;
  116. _orderPublishRepository = orderPublishRepository;
  117. _orderRepository = orderRepository;
  118. _orderVisitRepository = orderVisitRepository;
  119. _userRepository = userRepository;
  120. _orderListRepository = orderListRepository;
  121. _orderApplication = orderApplication;
  122. _sessionContext = sessionContext;
  123. _orderVisitDetailRepository = orderVisitDetailRepository;
  124. _bulletinApplication = bulletinApplication;
  125. _oldPublicDataRepository = oldPublicDataRepository;
  126. _knowledgeTypeRepository = knowledgeTypeRepository;
  127. _knowledgeRepository = knowledgeRepository;
  128. _systemDicDataCacheManager = systemDicDataCacheManager;
  129. _appOptions = appOptions;
  130. _getVailData = getVailData;
  131. _knowledgeWordRepository = knowledgeWordRepository;
  132. _sysDicDataCacheManager = sysDicDataCacheManager;
  133. _identityAppService = identityAppService;
  134. _httpClientFactory = httpClientFactory;
  135. }
  136. #endregion
  137. #region 获取Token
  138. [AllowAnonymous]
  139. [HttpPost("gettoken")]
  140. public async Task<string> LoginWithoutCrypt([FromBody] LoginDto dto)
  141. {
  142. return await _identityAppService.LoginAsync(dto, HttpContext.RequestAborted);
  143. }
  144. #endregion
  145. #region 自贡门户查询接口
  146. #region 4.2 受理统计
  147. /// <summary>
  148. /// 受理统计
  149. /// </summary>
  150. /// <param name="dto"></param>
  151. /// <returns></returns>
  152. [HttpPost("getacceptancetypestatisticsbymonth")]
  153. public async Task<List<OrderFormCount>> GetAcceptanceTypeStatisticsByMonth([FromBody] OrderFormByMonthDto dto)
  154. {
  155. if (string.IsNullOrEmpty(dto.StartTime))
  156. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  157. if (string.IsNullOrEmpty(dto.EndTime))
  158. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  159. //查询待
  160. var listType = await _orderRepository.Queryable()
  161. .Where(p => p.CreationTime >= Convert.ToDateTime(dto.StartTime) && p.CreationTime <= Convert.ToDateTime(dto.EndTime) && p.Status > EOrderStatus.WaitForAccept)
  162. .Select(it => new
  163. {
  164. it.AcceptType,
  165. it.AcceptTypeCode
  166. })
  167. .MergeTable()//将查询出来的结果合并成一个新表
  168. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  169. .Select(it => new
  170. {
  171. name = it.AcceptType,
  172. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  173. })
  174. .ToListAsync();
  175. var formAcceptanceCount = _mapper.Map<List<OrderFormCount>>(listType);
  176. if (_appOptions.Value.IsZiGong)
  177. {
  178. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  179. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  180. foreach (var form in fromName)
  181. {
  182. var data = formAcceptanceCount.FirstOrDefault(p => p.name == form);
  183. orderForms.Add(new OrderFormCount()
  184. {
  185. name = form,
  186. value = data == null ? 0 : data.value
  187. });
  188. }
  189. return orderForms;
  190. }
  191. return formAcceptanceCount;
  192. }
  193. #endregion
  194. #region 4.3 办理统计
  195. /// <summary>
  196. /// 办理统计
  197. /// </summary>
  198. /// <param name="dto"></param>
  199. /// <returns></returns>
  200. [HttpPost("getacceptancetypestatisticsbymonthend")]
  201. public async Task<List<OrderFormCount>> GetAcceptanceTypeStatisticsByMonthEnd([FromBody] OrderFormByMonthDto dto)
  202. {
  203. if (string.IsNullOrEmpty(dto.StartTime))
  204. dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
  205. if (string.IsNullOrEmpty(dto.EndTime))
  206. dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
  207. //数据查询
  208. var listFileType = await _orderRepository.Queryable()
  209. .Where(p => p.FiledTime >= Convert.ToDateTime(dto.StartTime) && p.FiledTime <= Convert.ToDateTime(dto.EndTime) && p.Status >= EOrderStatus.Visited)
  210. .Select(it => new
  211. {
  212. it.AcceptType,
  213. it.AcceptTypeCode
  214. })
  215. .MergeTable()//将查询出来的结果合并成一个新表
  216. .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
  217. .Select(it => new
  218. {
  219. name = it.AcceptType,
  220. value = SqlFunc.AggregateCount(it.AcceptTypeCode)
  221. })
  222. .ToListAsync();
  223. var formFileCount = _mapper.Map<List<OrderFormCount>>(listFileType);
  224. if (_appOptions.Value.IsZiGong)
  225. {
  226. List<OrderFormCount> orderForms = new List<OrderFormCount>();
  227. List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
  228. foreach (var form in fromName)
  229. {
  230. var data = formFileCount.FirstOrDefault(p => p.name == form);
  231. orderForms.Add(new OrderFormCount()
  232. {
  233. name = form,
  234. value = data == null ? 0 : data.value
  235. });
  236. }
  237. return orderForms;
  238. }
  239. return formFileCount;
  240. }
  241. #endregion
  242. #region 4.4~5 公告通知、工作简报
  243. /// <summary>
  244. /// 公告通知、工作简报
  245. /// </summary>
  246. /// <param name="dto"></param>
  247. /// <returns></returns>
  248. [HttpPost("getarticlelistbynum")]
  249. public async Task<IReadOnlyList<DataListTopDto>> GetArticleListByNum([FromBody] ArticleIdByNumDto dto)
  250. {
  251. if (string.IsNullOrEmpty(dto.PushRanges))
  252. dto.PushRanges = "2";
  253. var items = await _bulletinRepository.Queryable()
  254. .Where(p => p.LoseEfficacyTime >= DateTime.Now)
  255. .Where(p => p.IsArrive == true)
  256. .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", dto.PushRanges))
  257. // .Where(p => p.BulletinTypeId == dto.BulletinTypeId)
  258. .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), p => p.BulletinTypeId == dto.BulletinTypeId)
  259. .WhereIF(!string.IsNullOrEmpty(dto.CheckChar), p => p.Content.Contains(dto.CheckChar))
  260. .WhereIF(!string.IsNullOrEmpty(dto.BulletinDisplayLocation), p => SqlFunc.JsonListObjectAny(p.DisplayLocation, "Key", dto.BulletinDisplayLocation))
  261. .OrderByDescending(p => p.CreationTime)
  262. .Select(it => new
  263. {
  264. DataID = it.Id,
  265. it.Title,
  266. CreateDate = it.CreationTime,
  267. it.Content,
  268. it.BulletinTypeName
  269. })
  270. .Take(dto.Num)
  271. .ToListAsync();
  272. return _mapper.Map<IReadOnlyList<DataListTopDto>>(items);
  273. }
  274. /// <summary>
  275. /// 公告通知、工作简报详情
  276. /// </summary>
  277. /// <param name="dto"></param>
  278. /// <returns></returns>
  279. [HttpPost("getarticledetails")]
  280. public async Task<List<ArticleDetailsDto>> GetArticleDetails([FromBody] ArticleIdDto dto)
  281. {
  282. var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  283. ArticleDetailsDto detailsDto = null;
  284. if (data != null)
  285. {
  286. data.ReadedNum = data.ReadedNum++;
  287. await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted);
  288. detailsDto = new()
  289. {
  290. NoticeID = data.Id,
  291. NoticeTypeName = data.BulletinTypeName,
  292. NoticeTitle = data.Title,
  293. NoticeBMName = data.SourceOrgName,
  294. NoticeCreateDate = data.CreationTime,
  295. NoticeRCount = data.ReadedNum,
  296. WNED_VideoUrl = "",
  297. NoticeContent = data.Content
  298. };
  299. if (data != null && !string.IsNullOrEmpty(data.Content))
  300. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  301. }
  302. else
  303. detailsDto = new();
  304. List<ArticleDetailsDto> dataDto = new() { detailsDto };
  305. return dataDto;
  306. }
  307. #endregion
  308. #region 4.6 信件选登
  309. /// <summary>
  310. /// 查询工单发布后公开的数据
  311. /// </summary>
  312. /// <param name="dto"></param>
  313. /// <returns></returns>
  314. [HttpPost("get_order_list_publish_all")]
  315. public async Task<OrderListReturnDto> GetOrderByListAllOpen([FromBody] QueryOrderListDto dto)
  316. {
  317. var queryNew = _orderPublishRepository.Queryable()
  318. .LeftJoin<Order>((op, p) => p.Id == op.OrderId)
  319. .Where((op, p) => op.PublishState == true)
  320. .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), (op, p) => p.No == dto.FlowCode)
  321. .WhereIF(!string.IsNullOrEmpty(dto.FlowName), (op, p) => op.ArrangeTitle.Contains(dto.FlowName))
  322. .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), (op, p) => p.AcceptTypeCode == dto.FlowSType)
  323. .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), (op, p) => p.HotspotId == dto.FlowRType)
  324. .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), (op, p) => p.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  325. .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), (op, p) => p.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  326. .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), (op, p) => p.FromName.Contains(dto.FlowFrom))
  327. .WhereIF(dto.IdentityType.HasValue, (op, p) => p.IdentityType == dto.IdentityType)
  328. .OrderByDescending((op, p) => op.CreationTime)
  329. .Select((op, p) => new OrderListDto
  330. {
  331. FlowID = p.Id,
  332. FlowCode = p.No,
  333. FlowPwd = p.Password,
  334. FlowTitle = op.ArrangeTitle,
  335. FlowFromName = p.SourceChannel,
  336. FlowPurTypeName = p.AcceptType,
  337. ConTypeName = p.HotspotName,
  338. FlowAddDate = p.CreationTime,
  339. PubDate = op.CreationTime,
  340. RSFlagName = p.Status >= EOrderStatus.Filed ? "办理完成" : "办理中"
  341. });
  342. //var queryold = _oldPublicDataRepository.Queryable()
  343. // .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), p => p.OrderNo == dto.FlowCode)
  344. // .WhereIF(!string.IsNullOrEmpty(dto.FlowName), p => p.Title.Contains(dto.FlowName))
  345. // .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), p => p.AcceptTypeCode == dto.FlowSType)
  346. // .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), p => p.HotspotId == dto.FlowRType)
  347. // .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), p => p.AcceptTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
  348. // .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), p => p.AcceptTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
  349. // .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), p => p.FromName.Contains(dto.FlowFrom))
  350. // .WhereIF(dto.IdentityType.HasValue, p => p.IdentityType == dto.IdentityType)
  351. // .OrderByDescending(p => p.PubDate)
  352. // .Select(p => new OrderListDto
  353. // {
  354. // FlowID = p.OrderId,
  355. // FlowCode = p.OrderNo,
  356. // FlowPwd = p.OrderPwd,
  357. // FlowTitle = p.Title,
  358. // FlowFromName = p.SourceChannelCode,
  359. // FlowPurTypeName = p.AcceptTypeCode,
  360. // ConTypeName = p.HotspotName,
  361. // FlowAddDate = p.CreationTime,
  362. // PubDate = p.CreationTime,
  363. // RSFlagName = p.State == "1" ? "办理完成" : "办理中"
  364. // });
  365. var (total, items) = await queryNew
  366. //.OrderByDescending(op => op.PubDate)
  367. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  368. //计算总页数
  369. int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
  370. OrderListReturnDto returnDto = new()
  371. {
  372. Total = total,
  373. PageNum = dto.PageIndex,
  374. PageCount = nPageCount,
  375. Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
  376. };
  377. return returnDto;
  378. }
  379. /// <summary>
  380. /// 办件摘编详情
  381. /// </summary>
  382. /// <param name="dto"></param>
  383. /// <returns></returns>
  384. [HttpPost("getorderdetailbyid")]
  385. public async Task<OrderDetail> GetOrderDetailById([FromBody] ArticleIdDto dto)
  386. {
  387. var data = await _orderRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  388. var orderDetail = _mapper.Map<OrderDetail>(data);
  389. if (data != null)
  390. {
  391. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  392. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  393. orderDetail.IsProvinceOrder = "1";
  394. else
  395. orderDetail.IsProvinceOrder = "0";
  396. //获取发布的数据
  397. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  398. if (orderPublish != null)
  399. {
  400. orderDetail.PubFlag = "1";
  401. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  402. orderDetail.FlowContent = orderPublish.ArrangeContent;
  403. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  404. if (orderPublish.PublishState)
  405. orderDetail.FlowPubFlagName = "公开";
  406. }
  407. //能否进行评价
  408. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  409. if (orderVisit == null)
  410. orderDetail.VisitType = "0";
  411. else
  412. {
  413. orderDetail.VisitType = orderVisit.VisitState switch
  414. {
  415. EVisitState.WaitForVisit => "1",
  416. EVisitState.Visited => "2",
  417. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  418. _ => "0",
  419. };
  420. }
  421. }
  422. //List<OrderDetail> dataDto = new() { orderDetail };
  423. return orderDetail;
  424. }
  425. #endregion
  426. #region 4.7 知识库
  427. #region 知识库分类
  428. /// <summary>
  429. /// 知识库分类
  430. /// </summary>
  431. /// <returns></returns>
  432. [HttpPost("getknowledgetype")]
  433. public async Task<object> GetKnowledgeType()
  434. {
  435. //查询知识分类
  436. var item = await _knowledgeTypeRepository.Queryable()
  437. .Where(p => p.ParentId == null || p.ParentId == "")
  438. .Select(p => new
  439. {
  440. SDICT_ID = p.Id,
  441. SDICT_Name = p.Name
  442. })
  443. .ToListAsync();
  444. //查询知识标签
  445. var list = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.KnowledgeBaseTags).Select(p => new
  446. {
  447. SDICT_Name = p.DicDataName,
  448. SDICT_ID = p.DicDataName
  449. }).ToList();
  450. var rsp = new
  451. {
  452. KnowledgeType = item,
  453. KnowledgeBaseTags = list,
  454. };
  455. return rsp;
  456. }
  457. #endregion
  458. #region 知识库查询
  459. /// <summary>
  460. /// 知识库查询
  461. /// </summary>
  462. /// <param name="dto"></param>
  463. /// <returns></returns>
  464. [HttpPost("getknowledgelist")]
  465. public async Task<PagedDto<KnowledgeInfoThirdDto>> GetKnowledgeList([FromBody] QueryKnowledgeList dto)
  466. {
  467. var typeSpliceName = string.Empty;
  468. if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
  469. {
  470. var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeTypeId);
  471. typeSpliceName = type?.SpliceName;
  472. }
  473. var typeSpliceNameTags = string.Empty;
  474. if (!string.IsNullOrEmpty(dto.KnowledgeBaseTags))
  475. {
  476. var type = await _knowledgeWordRepository.GetAsync(x => x.Tag == dto.KnowledgeBaseTags && x.IsEnable == 1);
  477. typeSpliceNameTags = type?.Id;
  478. }
  479. var (total, items) = await _knowledgeRepository.Queryable()
  480. .Where(p => p.IsPublic == true && p.Status == EKnowledgeStatus.OnShelf)
  481. .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
  482. .WhereIF(!string.IsNullOrEmpty(typeSpliceNameTags), p => SqlFunc.JsonArrayAny(p.Keywords, typeSpliceNameTags) == true)
  483. .WhereIF(dto.KnowledgeType == 1, x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith("营商环境")))
  484. .OrderByDescending(p => p.CreationTime)
  485. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  486. var data = new PagedDto<KnowledgeInfoThirdDto>(total, _mapper.Map<IReadOnlyList<KnowledgeInfoThirdDto>>(items));
  487. return data;
  488. }
  489. #endregion
  490. #region 知识库详情
  491. /// <summary>
  492. /// 知识库详情
  493. /// </summary>
  494. /// <param name="dto"></param>
  495. /// <returns></returns>
  496. [HttpPost("getknowledgeinfo")]
  497. public async Task<KnowledgeInfoThirdDto> GetKnowledgeInfo([FromBody] QueryKnowledgeInfo dto)
  498. {
  499. var data = await _knowledgeRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  500. KnowledgeInfoThirdDto detailsDto = null;
  501. if (data != null)
  502. {
  503. detailsDto = _mapper.Map<KnowledgeInfoThirdDto>(data);
  504. if (detailsDto != null && !string.IsNullOrEmpty(detailsDto.Content))
  505. data.Content = _bulletinApplication.GetSiteUrls(data.Content);
  506. }
  507. else
  508. {
  509. detailsDto = new();
  510. }
  511. return detailsDto;
  512. }
  513. #endregion
  514. #endregion
  515. #region 4.8.1 工单写信(老版)
  516. /// <summary>
  517. /// 工单写信
  518. /// </summary>
  519. /// <param name="dto"></param>
  520. /// <returns></returns>
  521. [HttpPost("orderacceptance")]
  522. public async Task<OpenResponse> OrderAcceptance([FromBody] WebFlowAcceptDto dto)
  523. {
  524. //电话号码去空格
  525. if (!string.IsNullOrEmpty(dto.Mobile))
  526. dto.Mobile = dto.Mobile.Trim();
  527. string strResult = dto.ValidateObject();
  528. if (!string.IsNullOrEmpty(strResult))
  529. {
  530. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Failed("数据验证不通过!"));
  531. }
  532. var order = _orderListRepository.Queryable()
  533. .Where(x => x.Title == dto.Title)
  534. .Where(x => x.SourceChannelCode == "YTW")
  535. .Where(x => x.Contact == dto.Mobile)
  536. .Select(x => new
  537. {
  538. No = x.No,
  539. Second = SqlFunc.DateDiff(DateType.Second, x.CreationTime, DateTime.Now)
  540. }).MergeTable()
  541. .Where(x => x.Second < 180)
  542. .Any();
  543. if (order)
  544. {
  545. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Failed("3分钟内,请勿重复提交工单!"));
  546. }
  547. var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
  548. data.Source = ESource.WebPortal;
  549. data.SourceChannel = "因特网";
  550. data.SourceChannelCode = "YTW";
  551. //switch (dto.FromID)
  552. //{
  553. // case "2":
  554. // data.SourceChannel = "APP";
  555. // data.SourceChannelCode = "AP";
  556. // data.Source = ESource.APP;
  557. // break;
  558. // case "3":
  559. // data.SourceChannel = "微信小程序";
  560. // data.SourceChannelCode = "XCX";
  561. // data.Source = ESource.WeChat;
  562. // break;
  563. // case "9"://宜宾人社专用
  564. // data.SourceChannel = "人社APP";
  565. // data.SourceChannelCode = "RSAPP";
  566. // data.Source = ESource.YBHumanSocietyAPP;
  567. // break;
  568. // default:
  569. // break;
  570. //}
  571. if (!string.IsNullOrEmpty(data.LicenceNo))
  572. {
  573. data.LicenceTypeCode = "10";
  574. data.LicenceType = "中华人民共和国居民身份证";
  575. }
  576. data.ExternalId = Guid.NewGuid().ToString();
  577. data.IdentityType = dto.IdentityType;
  578. data.Transpond = false;
  579. data.IsEnforcementOrder = false;
  580. var result = await _orderApplication.ReceiveOrderFromExternalAsync(data, HttpContext.RequestAborted);
  581. OrderAcceptanceReturnDto returnDto = new();
  582. if (result != null)
  583. {
  584. returnDto.PWD = result.Password;
  585. returnDto.Code = result.No;
  586. returnDto.State = "1";
  587. dto.Pwd = result.Password;
  588. dto.Code = result.No;
  589. dto.OrderId = result.Id;
  590. var dtoData = _mapper.Map<WebFlowAccept>(dto);
  591. await _webFlowAcceptRepository.AddAsync(dtoData, HttpContext.RequestAborted);
  592. }
  593. else
  594. returnDto.State = "0";
  595. return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Success(returnDto));
  596. }
  597. #endregion
  598. #region 4.8.2 附件上传
  599. /// <summary>
  600. /// 附件上传
  601. /// </summary>
  602. /// <param name="dto"></param>
  603. /// <returns></returns>
  604. [HttpPost("uploadfiles")]
  605. public async Task<GetResultDto> uploadfiles(IFormFile fileData)
  606. {
  607. if (fileData == null || fileData.Length == 0)
  608. {
  609. return new GetResultDto();
  610. }
  611. Stream stream = fileData.OpenReadStream();
  612. byte[] fileContentBytes = StreamToBytes(stream);
  613. var client = _httpClientFactory.CreateClient("fileData");
  614. using (var content = new MultipartFormDataContent())
  615. {
  616. var fileContent = new ByteArrayContent(fileContentBytes);
  617. fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data")
  618. {
  619. Name = fileData.Name,
  620. FileName = fileData.FileName
  621. };
  622. content.Add(fileContent, "fileData", fileData.FileName);
  623. var response = await client.PostAsync($"{_appOptions.Value.FileUpload.Url.TrimEnd('/')}/file/upload?source=HotlineWeb", content);
  624. if (response.IsSuccessStatusCode)
  625. {
  626. var result = await response.Content.ReadFromJsonAsync<GetFileDto>();
  627. return new GetResultDto()
  628. {
  629. id = result.result.id,
  630. fileName = result.result.fileName,
  631. path = result.result.path,
  632. };
  633. }
  634. else
  635. {
  636. return new GetResultDto();
  637. }
  638. }
  639. }
  640. #endregion
  641. #region 4.8.3 工单写信(带验证码)
  642. /// <summary>
  643. /// 工单写信
  644. /// </summary>
  645. /// <param name="dto"></param>
  646. /// <returns></returns>
  647. [HttpPost("orderacceptancesms")]
  648. public async Task<OrderAcceptanceReturnDto> OrderAcceptanceSms([FromBody] WebFlowAcceptSmsDto dto)
  649. {
  650. //电话号码去空格
  651. if (!string.IsNullOrEmpty(dto.Mobile))
  652. dto.Mobile = dto.Mobile.Trim();
  653. string strResult = dto.ValidateObject();
  654. if (!string.IsNullOrEmpty(strResult))
  655. {
  656. throw UserFriendlyException.SameMessage("数据验证不通过");
  657. }
  658. if (dto.Mobile.IsPhoneNumber() == false)
  659. {
  660. throw UserFriendlyException.SameMessage("请输入正确的手机号");
  661. }
  662. string keyTokenSms = "SmsUserWriteKey_" + dto.Mobile + "_" + DateTime.Now.ToString("yyyyMMdd");
  663. var dataSms = await _writeLettersSendSms.GetAsync(keyTokenSms, HttpContext.RequestAborted);
  664. if (dataSms != null)
  665. {
  666. if (dataSms.SmsCode != dto.SmsCode)
  667. throw UserFriendlyException.SameMessage("短信验证码错误!");
  668. }
  669. else
  670. {
  671. throw UserFriendlyException.SameMessage("短信验证码错误!");
  672. }
  673. var order = _orderListRepository.Queryable()
  674. .Where(x => x.Title == dto.Title)
  675. .Where(x => x.SourceChannelCode == "YTW")
  676. .Where(x => x.Contact == dto.Mobile)
  677. .Select(x => new
  678. {
  679. No = x.No,
  680. Second = SqlFunc.DateDiff(DateType.Second, x.CreationTime, DateTime.Now)
  681. }).MergeTable()
  682. .Where(x => x.Second < 180)
  683. .Any();
  684. if (order)
  685. {
  686. throw UserFriendlyException.SameMessage("3分钟内,请勿重复提交工单!");
  687. }
  688. var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
  689. data.Source = ESource.WebPortal;
  690. data.SourceChannel = "因特网";
  691. data.SourceChannelCode = "YTW";
  692. if (!string.IsNullOrEmpty(data.LicenceNo))
  693. {
  694. data.LicenceTypeCode = "10";
  695. data.LicenceType = "中华人民共和国居民身份证";
  696. }
  697. data.ExternalId = Guid.NewGuid().ToString();
  698. data.IdentityType = dto.IdentityType;
  699. data.Transpond = false;
  700. data.IsEnforcementOrder = false;
  701. var result = await _orderApplication.ReceiveOrderFromExternalAsync(data, HttpContext.RequestAborted);
  702. OrderAcceptanceReturnDto returnDto = new();
  703. if (result != null)
  704. {
  705. returnDto.PWD = result.Password;
  706. returnDto.Code = result.No;
  707. returnDto.State = "1";
  708. dto.Pwd = result.Password;
  709. dto.Code = result.No;
  710. dto.OrderId = result.Id;
  711. var dtoData = _mapper.Map<WebFlowAccept>(dto);
  712. await _webFlowAcceptRepository.AddAsync(dtoData, HttpContext.RequestAborted);
  713. }
  714. else
  715. returnDto.State = "0";
  716. return returnDto;
  717. }
  718. #endregion
  719. #region 4.9 工单查询
  720. /// <summary>
  721. /// 根据编号和密码查询信件ID
  722. /// </summary>
  723. /// <param name="dto"></param>
  724. /// <returns></returns>
  725. [HttpPost("getorderdetailbyno")]
  726. public async Task<OrderDetail> GetOrderDetailByNo([FromBody] GetOrderCodePwd dto)
  727. {
  728. var data = await _orderRepository.GetAsync(p => p.No == dto.OrderNo && p.Password == dto.Pwd, HttpContext.RequestAborted);
  729. if (data != null)
  730. {
  731. var orderDetail = _mapper.Map<OrderDetail>(data);
  732. if (data != null)
  733. {
  734. //如果是省工单或者是省政民互动的工单,市民不能进行评价
  735. if (data.IsProvince == true || data.SourceChannelCode == "ZMHD")
  736. orderDetail.IsProvinceOrder = "1";
  737. else
  738. orderDetail.IsProvinceOrder = "0";
  739. //获取发布的数据
  740. var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
  741. if (orderPublish != null)
  742. {
  743. orderDetail.PubFlag = "1";
  744. orderDetail.FlowTitle = orderPublish.ArrangeTitle;
  745. orderDetail.FlowContent = orderPublish.ArrangeContent;
  746. orderDetail.FlowResult = orderPublish.ArrangeOpinion;
  747. if (orderPublish.PublishState)
  748. orderDetail.FlowPubFlagName = "公开";
  749. }
  750. //能否进行评价
  751. var orderVisit = await _orderVisitRepository.GetAsync(p => p.OrderId == data.Id && p.VisitState != EVisitState.None, HttpContext.RequestAborted);
  752. if (orderVisit == null)
  753. orderDetail.VisitType = "0";
  754. else
  755. {
  756. orderDetail.VisitType = orderVisit.VisitState switch
  757. {
  758. EVisitState.WaitForVisit => "1",
  759. EVisitState.Visited => "2",
  760. EVisitState.Visiting or EVisitState.NoSatisfiedWaitForVisit or EVisitState.None => "0",
  761. _ => "0",
  762. };
  763. }
  764. }
  765. List<OrderDetail> dataDto = new() { orderDetail };
  766. return orderDetail;
  767. }
  768. return new OrderDetail();
  769. }
  770. #endregion
  771. #region 4.10 图片验证码
  772. /// <summary>
  773. /// 图片验证码
  774. /// </summary>
  775. /// <returns></returns>
  776. [HttpGet("getverificationcodebypic")]
  777. public async Task<VerificationPic> GetVerificationCodeByPic()
  778. {
  779. var verifyCode = GetVerifyCodeText(5, true, false); // 验证码
  780. var base64String = CreateImageAndConvertToBase64(verifyCode); // 图片Base64
  781. var guidString = Guid.NewGuid().ToString(); // Guid
  782. var data = new VerificationPic()
  783. {
  784. base64 = base64String,
  785. guid = guidString
  786. };
  787. // 保存数据到Readis
  788. string keyToken = "PicUserWriteKey_" + guidString + "_" + verifyCode + "_" + DateTime.Now.ToString("yyyyMMdd");
  789. await _verificationPic.SetAsync(keyToken, data, TimeSpan.FromHours(1), HttpContext.RequestAborted);
  790. return data;
  791. }
  792. #endregion
  793. #region 4.11 短信验证码
  794. /// <summary>
  795. /// 短信验证码
  796. /// </summary>
  797. /// <param name="dto"></param>
  798. /// <returns></returns>
  799. [HttpPost("getverificationcodebysms")]
  800. public async Task<VerificationSms> GetVerificationCodeBySms([FromBody] VerificationPicDto dto)
  801. {
  802. if (dto.TelNum.IsPhoneNumber() == false)
  803. {
  804. throw UserFriendlyException.SameMessage("请输入正确的手机号");
  805. }
  806. // 验证图片验证码是否对
  807. string keyToken = "PicUserWriteKey_" + dto.guid + "_" + dto.verCode + "_" + DateTime.Now.ToString("yyyyMMdd");
  808. var data = await _verificationPic.GetAsync(keyToken, HttpContext.RequestAborted);
  809. if (data == null)
  810. {
  811. throw UserFriendlyException.SameMessage("验证码错误");
  812. }
  813. var SmsCodeRand = RandomNum();
  814. // 发送短信验证码
  815. string keyTokenSms = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd");
  816. var dataSms = await _writeLettersSendSms.GetAsync(keyTokenSms, HttpContext.RequestAborted);
  817. if (dataSms != null)//已经发过短信
  818. {
  819. //是否可以继续发送短信(10次)
  820. if (dataSms.SendCount > 10)
  821. //短信发送超过10条
  822. throw UserFriendlyException.SameMessage("短信发送超过10条");
  823. // 验证是否在两分钟之内
  824. TimeSpan duration = DateTime.Now - dataSms.AddTime; // 计算时间差
  825. if ((int)duration.TotalSeconds < 120)
  826. // 距离上次发送时间不足两分钟
  827. throw UserFriendlyException.SameMessage("距离上次发送时间不足两分钟");
  828. //修改缓存信息
  829. dataSms.SendCount++;
  830. dataSms.SmsCode = SmsCodeRand;
  831. dataSms.AddTime = DateTime.Now;
  832. }
  833. else
  834. {
  835. //没有发过短信,直接写入数据
  836. dataSms = new WriteLettersSendSmsDto
  837. {
  838. AddTime = DateTime.Now,
  839. SmsCode = SmsCodeRand,
  840. MobileNum = dto.TelNum,
  841. SendCount = 1
  842. };
  843. }
  844. //这里发送短信
  845. var messageDto = new Share.Dtos.Push.MessageDto
  846. {
  847. PushBusiness = EPushBusiness.MsgCode,
  848. ExternalId = "",
  849. OrderId = "",
  850. PushPlatform = EPushPlatform.Web,
  851. Remark = "",
  852. Name = dto.TelNum,
  853. TemplateCode = "1008",
  854. Params = new List<string>() { SmsCodeRand },
  855. TelNumber = dto.TelNum,
  856. };
  857. await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
  858. //保存短信
  859. await _writeLettersSendSms.SetAsync(keyTokenSms, dataSms, TimeSpan.FromDays(1), HttpContext.RequestAborted);
  860. return new VerificationSms()
  861. {
  862. TelNum = dto.TelNum,
  863. SmsCode = SmsCodeRand
  864. };
  865. }
  866. #endregion
  867. #region 私有方法
  868. #region 将文件转化为文件流
  869. /// <summary>
  870. /// 将文件转化为文件流
  871. /// </summary>
  872. /// <param name="stream"></param>
  873. /// <returns></returns>
  874. private byte[] StreamToBytes(Stream stream)
  875. {
  876. byte[] bytes = new byte[stream.Length];
  877. stream.Read(bytes, 0, bytes.Length);
  878. // 设置当前流的位置为流的开始
  879. stream.Seek(0, SeekOrigin.Begin);
  880. return bytes;
  881. }
  882. #endregion
  883. #region 获取验证码字符串
  884. /// <summary>
  885. /// 获取验证码字符串
  886. /// </summary>
  887. /// <param name="codeLen">验证码长度</param>
  888. /// <param name="addUpper">是否添加大写</param>
  889. /// <param name="addLower">是否添加小写</param>
  890. /// <returns></returns>
  891. private string GetVerifyCodeText(int codeLen = 4, bool addUpper = true, bool addLower = true)
  892. {
  893. // 返回对象
  894. string codeText = "";
  895. if (codeLen < 4)
  896. {
  897. codeLen = 4;
  898. }
  899. StringBuilder objChars = new StringBuilder();
  900. StringBuilder objNums = new StringBuilder();
  901. // 加入数字1-9
  902. for (int i = 1; i <= 9; i++)
  903. {
  904. objNums.Append(i.ToString());
  905. }
  906. List<char> notExists = new List<char>();
  907. notExists.Add('O');
  908. notExists.Add('o');
  909. notExists.Add('I');
  910. notExists.Add('i');
  911. notExists.Add('L');
  912. notExists.Add('l');
  913. notExists.Add('J');
  914. notExists.Add('j');
  915. notExists.Add('P');
  916. notExists.Add('p');
  917. notExists.Add('G');
  918. notExists.Add('g');
  919. // 加入大写字母A-Z,不包括O
  920. if (addUpper == true)
  921. {
  922. char temp = ' ';
  923. for (int i = 0; i < 26; i++)
  924. {
  925. temp = Convert.ToChar(i + 65);
  926. // 如果生成的字母不是'O','o','I','i','L','l','J','j'
  927. if (notExists.Contains(temp) == false)
  928. {
  929. objChars.Append(temp);
  930. }
  931. }
  932. }
  933. // 加入小写字母a-z,不包括o
  934. if (addLower == true)
  935. {
  936. char temp = ' ';
  937. for (int i = 0; i < 26; i++)
  938. {
  939. temp = Convert.ToChar(i + 97);
  940. // 如果生成的字母不是'O','o','I','i','L','l','J','j'
  941. if (notExists.Contains(temp) == false)
  942. {
  943. objChars.Append(temp);
  944. }
  945. }
  946. }
  947. // 生成验证码字符串
  948. {
  949. int index = 0;
  950. Random objRandom = new Random();
  951. StringBuilder objCodes = new StringBuilder();
  952. for (int i = 0; i < 2; i++)
  953. {
  954. index = objRandom.Next(0, objNums.Length);
  955. objCodes.Append(objNums[index]);
  956. objNums.Remove(index, 1);
  957. }
  958. for (int i = 0; i < codeLen - 2; i++)
  959. {
  960. index = objRandom.Next(0, objChars.Length);
  961. objCodes.Append(objChars[index]);
  962. objChars.Remove(index, 1);
  963. }
  964. for (int i = 0; i < codeLen; i++)
  965. {
  966. index = objRandom.Next(0, objCodes.Length);
  967. codeText += objCodes[index];
  968. objCodes.Remove(index, 1);
  969. }
  970. }
  971. return codeText;
  972. }
  973. #endregion
  974. #region 创建图片并且转换成base64
  975. /// <summary>
  976. /// 创建图片并且转换成base64
  977. /// </summary>
  978. /// <param name="verifyCode"></param>
  979. /// <returns></returns>
  980. private string CreateImageAndConvertToBase64(string verifyCode)
  981. {
  982. var base64String = "";
  983. try
  984. {
  985. // 1. 创建一个新的位图 (100x100像素)
  986. using (var bitmap = new Bitmap((int)Math.Ceiling((verifyCode.Length * 16.5)), 25))
  987. {
  988. // 2. 使用Graphics对象绘制内容
  989. using (var graphics = Graphics.FromImage(bitmap))
  990. {
  991. Random random = new Random();
  992. graphics.Clear(Color.White);
  993. for (int i = 0; i < 25; i++)
  994. {
  995. int x1 = random.Next(bitmap.Width);
  996. int x2 = random.Next(bitmap.Width);
  997. int y1 = random.Next(bitmap.Height);
  998. int y2 = random.Next(bitmap.Height);
  999. graphics.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
  1000. }
  1001. // 添加一些文本
  1002. var font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic));
  1003. System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Color.Blue, Color.DarkRed, 1.2f, true);
  1004. graphics.DrawString(verifyCode, font, brush, 10, 0);
  1005. for (int i = 0; i < 100; i++)
  1006. {
  1007. int x = random.Next(bitmap.Width);
  1008. int y = random.Next(bitmap.Height);
  1009. bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
  1010. }
  1011. graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1);
  1012. }
  1013. // 保存图片
  1014. //bitmap.Save("C:\\Users\\PC\\Desktop\\1x1.png", ImageFormat.Png);
  1015. // 3. 将图像保存到内存流
  1016. using (var memoryStream = new MemoryStream())
  1017. {
  1018. bitmap.Save(memoryStream, ImageFormat.Png);
  1019. // 4. 将内存流转换为字节数组
  1020. byte[] imageBytes = memoryStream.ToArray();
  1021. // 5. 将字节数组转换为Base64字符串
  1022. base64String = Convert.ToBase64String(imageBytes);
  1023. }
  1024. }
  1025. }
  1026. catch (Exception)
  1027. {
  1028. }
  1029. return base64String;
  1030. }
  1031. #endregion
  1032. #region 随机生成6位数字
  1033. /// <summary>
  1034. /// 随机生成6位数字
  1035. /// </summary>
  1036. /// <returns></returns>
  1037. private string RandomNum()
  1038. {
  1039. var random = new Random();
  1040. return random.Next(100000, 999999).ToString();
  1041. }
  1042. #endregion
  1043. #endregion
  1044. #endregion
  1045. #region 泸州电信查询接口
  1046. #region 工单信息
  1047. /// <summary>
  1048. /// 工单信息
  1049. /// </summary>
  1050. /// <param name="dto"></param>
  1051. /// <returns></returns>
  1052. [HttpGet("getOrderResultList")]
  1053. public async Task<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>> GetOrderResultList([FromBody] DateDto dto)
  1054. {
  1055. TimeSpan timeSpan = dto.EndTime - dto.StartTime;
  1056. if (timeSpan.TotalHours > 24)
  1057. {
  1058. throw UserFriendlyException.SameMessage("开始结束时间不能大于24小时!");
  1059. }
  1060. var items = await _orderListRepository.Queryable()
  1061. .Where(x => x.CreationTime >= dto.StartTime)
  1062. .Where(x => x.CreationTime <= dto.EndTime)
  1063. .OrderByDescending(x => x.CreationTime)
  1064. .Select(it => new
  1065. {
  1066. Id = it.Id,
  1067. No = it.No,
  1068. Title = it.Title,
  1069. Content = it.Content,
  1070. ActualHandleOrgName = it.ActualHandleOrgName,
  1071. CreationTime = it.CreationTime,
  1072. FromName = it.FromName,
  1073. FromPhone = string.IsNullOrEmpty(it.FromPhone) ? it.FromPhone : it.Contact
  1074. })
  1075. .ToListAsync();
  1076. return _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>(items);
  1077. }
  1078. #endregion
  1079. #region 评价信息
  1080. /// <summary>
  1081. /// 评价信息
  1082. /// </summary>
  1083. /// <param name="dto"></param>
  1084. /// <returns></returns>
  1085. [HttpGet("getVisitResultList")]
  1086. public async Task<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>> GetVisitResultList([FromBody] DateDto dto)
  1087. {
  1088. TimeSpan timeSpan = dto.EndTime - dto.StartTime;
  1089. if (timeSpan.TotalHours > 24)
  1090. {
  1091. throw UserFriendlyException.SameMessage("开始结束时间不能大于24小时!");
  1092. }
  1093. var items = await _orderVisitRepository.Queryable()
  1094. .Includes(x => x.OrderVisitDetails)
  1095. .LeftJoin<OrderPublish>((x, op) => x.OrderId == op.OrderId)
  1096. .Where(x => x.CreationTime >= dto.StartTime)
  1097. .Where(x => x.CreationTime <= dto.EndTime)
  1098. .OrderByDescending(x => x.CreationTime)
  1099. .Select((x, op) => new
  1100. {
  1101. OrderID = x.OrderId,
  1102. NowEvaluate = x.NowEvaluate,
  1103. VisitContent = x.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org || n.VisitTarget == EVisitTarget.Seat).Select(s => s.VisitContent).First(),
  1104. VisitTime = x.VisitTime,
  1105. VisitName = x.Employee.Name,
  1106. PublishState = op.PublishState
  1107. })
  1108. .ToListAsync();
  1109. return _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>(items);
  1110. }
  1111. #endregion
  1112. #region 账号信息
  1113. /// <summary>
  1114. /// 账号信息
  1115. /// </summary>
  1116. /// <returns></returns>
  1117. [HttpGet("getUserResultList")]
  1118. public async Task<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>> GetUserResultList()
  1119. {
  1120. var items = await _userRepository.Queryable()
  1121. .OrderByDescending(x => x.CreationTime)
  1122. .Select(it => new
  1123. {
  1124. UUID = it.Id,
  1125. Name = it.Name
  1126. })
  1127. .ToListAsync();
  1128. return _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>>(items);
  1129. }
  1130. #endregion
  1131. #endregion
  1132. }
  1133. }