SnapshotApplicationBase.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. using Hotline.Orders;
  2. using Hotline.Share.Dtos;
  3. using Hotline.Share.Dtos.Article;
  4. using Hotline.Share.Dtos.Snapshot;
  5. using Hotline.Share.Tools;
  6. using Hotline.Snapshot;
  7. using Hotline.Users;
  8. using SqlSugar;
  9. using XF.Domain.Authentications;
  10. using XF.Domain.Dependency;
  11. using XF.Domain.Repository;
  12. using Hotline.Repository.SqlSugar.Extensions;
  13. using Hotline.Share.Enums;
  14. using Hotline.Share.Enums.Order;
  15. using Hotline.Share.Requests;
  16. using Hotline.Share.Enums.Snapshot;
  17. using Mapster;
  18. using Hotline.Caching.Interfaces;
  19. using NPOI.Util.ArrayExtensions;
  20. using XF.Domain.Exceptions;
  21. using Hotline.Settings;
  22. using Hotline.Share.Dtos.Settings;
  23. using Hotline.File;
  24. using Hotline.Share.Enums.Article;
  25. using Hotline.Tools;
  26. using Hotline.Snapshot.Interfaces;
  27. using DotNetCore.CAP;
  28. using Microsoft.AspNetCore.Http;
  29. using Hotline.Share.Dtos.FlowEngine;
  30. using Hotline.FlowEngine.Workflows;
  31. using Hotline.Share.Enums.FlowEngine;
  32. namespace Hotline.Application.Snapshot;
  33. /// <summary>
  34. /// 随手拍应用层
  35. /// </summary>
  36. public abstract class SnapshotApplicationBase
  37. {
  38. private readonly IThirdAccountRepository _thirdAccountRepository;
  39. private readonly IRepository<Order> _orderRepository;
  40. private readonly ISnapshotBulletinRepository _bulletinRepository;
  41. /// <summary>
  42. /// 行业
  43. /// </summary>
  44. private readonly IRepository<Industry> _industryRepository;
  45. private readonly IThirdIdentiyService _thirdLoginService;
  46. private readonly ISessionContext _sessionContext;
  47. private readonly IRepository<RedPackRecord> _redPackRecordRepository;
  48. private readonly IRepository<OrderSnapshot> _orderSnapshotRepository;
  49. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  50. private readonly ISystemAreaDomainService _systemAreaDomainService;
  51. private readonly IRepository<SystemArea> _systemAreaRepository;
  52. private readonly IFileRepository _fileRepository;
  53. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  54. private readonly ISnapshotOrderPublishRepository _snapshotOrderPublishRepository;
  55. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  56. private readonly IPractitionerRepository _practitionerRepository;
  57. public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IRepository<OrderSnapshot> orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository)
  58. {
  59. _thirdLoginService = thirdLoginService;
  60. _industryRepository = industryRepository;
  61. _bulletinRepository = bulletinRepository;
  62. _sessionContext = sessionContext;
  63. _redPackRecordRepository = redPackRecordRepository;
  64. _orderRepository = orderRepository;
  65. _thirdAccountRepository = thirdAccountRepository;
  66. _orderSnapshotRepository = orderSnapshotRepository;
  67. _systemSettingCacheManager = systemSettingCacheManager;
  68. _systemAreaDomainService = systemAreaDomainService;
  69. _fileRepository = fileRepository;
  70. _systemDicDataCacheManager = systemDicDataCacheManager;
  71. _snapshotOrderPublishRepository = snapshotOrderPublishRepository;
  72. _workflowTraceRepository = workflowTraceRepository;
  73. _practitionerRepository = practitionerRepository;
  74. _systemAreaRepository = systemAreaRepository;
  75. }
  76. /// <summary>
  77. /// 获取随手拍小程序首页数据
  78. /// </summary>
  79. /// <returns></returns>
  80. public async Task<HomePageOutDto> GetHomePageAsync()
  81. {
  82. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  83. var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
  84. var items = await _industryRepository.Queryable()
  85. .Where(m => m.IsEnable)
  86. .OrderBy(m => m.DisplayOrder)
  87. .ToListAsync(m => new HomeIndustryOutDto());
  88. items.ForEach(m =>
  89. {
  90. if (m.BackgroundImgUrl.NotNullOrEmpty())
  91. m.BackgroundImgUrl = fileDownloadApi + m.BackgroundImgUrl;
  92. if (m.BannerImgUrl.NotNullOrEmpty())
  93. m.BannerImgUrl = fileDownloadApi + m.BannerImgUrl;
  94. if (m.CareCellImgUrl.NotNullOrEmpty())
  95. m.CareCellImgUrl = fileDownloadApi + m.CareCellImgUrl;
  96. if (m.CellImgUrl.NotNullOrEmpty())
  97. m.CellImgUrl = fileDownloadApi + m.CellImgUrl;
  98. });
  99. return new HomePageOutDto
  100. {
  101. Banners = _systemSettingCacheManager.AppBanner.Split('|').Select(m => fileDownloadApi + m).ToList(),
  102. Industrys = items
  103. };
  104. }
  105. /// <summary>
  106. /// 获取行业集合
  107. /// </summary>
  108. /// <returns></returns>
  109. public async Task<IList<IndustryOutDto>> GetIndustresAsync()
  110. {
  111. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  112. var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
  113. var items = await _industryRepository.Queryable()
  114. .Where(m => m.IsEnable)
  115. .OrderBy(m => m.DisplayOrder)
  116. .ToListAsync(m => new IndustryOutDto());
  117. return items;
  118. }
  119. /// <summary>
  120. /// 行业页面基础数据
  121. /// </summary>
  122. /// <param name="id"></param>
  123. /// <param name="requestAborted"></param>
  124. /// <returns></returns>
  125. public async Task<IndustryBaseOutDto> GetIndustryBaseAsync(string id, CancellationToken requestAborted)
  126. {
  127. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  128. var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
  129. var indurstry = await _industryRepository.GetAsync(id, requestAborted)
  130. ?? throw UserFriendlyException.SameMessage("行业不存在:" + id);
  131. var bulletinId = await _bulletinRepository.Queryable()
  132. .Where(m => m.SnapshotBulletinTypeId == indurstry.BulletinTypeGuideId && m.BulletinState == EBulletinState.ReviewPass && m.IsArrive == true)
  133. .OrderByDescending(m => m.CreationTime)
  134. .Select(m => m.Id)
  135. .FirstAsync(requestAborted);
  136. var outDto = new IndustryBaseOutDto
  137. {
  138. Industry = indurstry.Adapt<IndustryOutDto>()
  139. };
  140. outDto.BulletinId = bulletinId;
  141. if (indurstry.IndustryType == EIndustryType.Declare)
  142. {
  143. outDto.AreaTree = (await _systemAreaDomainService.GetAreaTree(parentId: "510300")).Adapt<List<SystemAreaOutDto>>();
  144. outDto.Files = (await _fileRepository.GetByKeyAsync(indurstry.Id, requestAborted)).Adapt<List<IndustryFileDto>>();
  145. outDto.Files.ToList().ForEach(m => m.Url = fileDownloadApi + m.AdditionId);
  146. outDto.WorkplaceName = _systemDicDataCacheManager.WorkplaceName;
  147. outDto.Workplace = _systemDicDataCacheManager.Workplace;
  148. outDto.JobType = _systemDicDataCacheManager.JobType;
  149. outDto.BusinessUnitType = _systemDicDataCacheManager.BusinessUnitType;
  150. }
  151. return outDto;
  152. }
  153. public async Task AddOrderPublishAsync(AddSnapshotOrderPublishInDto dto, CancellationToken cancellation)
  154. {
  155. dto.ValidateObject();
  156. var snapshotOrder = await _orderSnapshotRepository.GetAsync(dto.OrderId)
  157. ?? throw UserFriendlyException.SameMessage("工单不存在");
  158. var order = await _orderRepository.Queryable()
  159. .Where(m => m.Id == dto.OrderId)
  160. .Select(m => new { m.Id, m.No })
  161. .FirstAsync(cancellation)
  162. ?? throw UserFriendlyException.SameMessage("工单不存在");
  163. var entity = dto.Adapt<SnapshotOrderPublish>();
  164. entity.Id = order.Id;
  165. entity.IndustryId = snapshotOrder.IndustryId;
  166. entity.IndustryName = snapshotOrder.IndustryName;
  167. entity.No = order.No;
  168. await _snapshotOrderPublishRepository.AddAsync(entity);
  169. }
  170. /// <summary>
  171. /// 获取公开工单集合
  172. /// </summary>
  173. /// <param name="dto"></param>
  174. /// <param name="requestAborted"></param>
  175. /// <returns></returns>
  176. public async Task<IList<OrderPublishOutDto>> GetOrderPublishAsync(OrderPublishInDto dto, CancellationToken requestAborted)
  177. {
  178. dto.ValidateObject();
  179. var items = await _snapshotOrderPublishRepository.Queryable()
  180. .Where(m => m.IndustryId == dto.IndustryId)
  181. .WhereIF(dto.Keyword.NotNullOrEmpty(), m => m.No.Contains(dto.Keyword) || m.ArrangeTitle.Contains(dto.Keyword))
  182. .Select<OrderPublishOutDto>()
  183. .ToFixedListAsync(dto, requestAborted);
  184. return items;
  185. }
  186. /// <summary>
  187. /// 获取公开的工单详情
  188. /// </summary>
  189. /// <param name="id"></param>
  190. /// <param name="requestAborted"></param>
  191. /// <returns></returns>
  192. public async Task<OrderPublishDetailOutDto> GetOrderPublishDetailAsync(string id, CancellationToken requestAborted)
  193. {
  194. var publish = await _snapshotOrderPublishRepository.GetAsync(id) ??
  195. throw UserFriendlyException.SameMessage("工单不存在");
  196. var outDto = publish.Adapt<OrderPublishDetailOutDto>();
  197. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  198. if (outDto.FileJson != null)
  199. {
  200. foreach (var item in outDto.FileJson)
  201. {
  202. item.Path = fileServiceUrl + item.Path;
  203. }
  204. }
  205. var traces = await _workflowTraceRepository.Queryable()
  206. .Where(m => m.ExternalId == publish.OrderId && m.Status == EWorkflowStepStatus.Handled)
  207. .OrderBy(m => m.AcceptTime)
  208. .ToListAsync(requestAborted);
  209. var centre = traces.Where(m => m.StepType == EStepType.End || m.StepType == EStepType.Start || m.BusinessType == EBusinessType.Send || m.BusinessType == EBusinessType.Seat || m.BusinessType == EBusinessType.File)
  210. .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
  211. .ToList();
  212. outDto.Workflow = traces.Where(m => !centre.Select(s => s.Id).ToList().Contains(m.Id))
  213. .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
  214. .ToList();
  215. outDto.Workflow.AddRange(centre);
  216. outDto.Workflow = outDto.Workflow.OrderBy(m => m.HandleTime).ToList();
  217. return outDto;
  218. }
  219. /// <summary>
  220. /// 获取随手拍小程序公告
  221. /// </summary>
  222. /// <returns></returns>
  223. public async Task<IReadOnlyList<BulletinOutDto>> GetBulletinsAsync(BulletinInDto dto, CancellationToken cancellationToken)
  224. {
  225. var items = await _bulletinRepository.Queryable()
  226. .Where(m => m.BulletinState == EBulletinState.ReviewPass)
  227. .LeftJoin<Industry>((bulletin, industry) => bulletin.SnapshotBulletinTypeId == industry.BulletinTypePublicityId)
  228. .Where((bulletin, industry) => industry.Id == dto.IndustryId)
  229. .ToFixedListAsync(dto, cancellationToken);
  230. return items.Adapt<IReadOnlyList<BulletinOutDto>>();
  231. }
  232. /// <summary>
  233. /// 获取个人中心数据
  234. /// </summary>
  235. /// <returns></returns>
  236. public async Task<SnapshotUserInfoOutDto> GetSnapshotUserInfoAsync()
  237. {
  238. var openId = _sessionContext.OpenId;
  239. var thirdAccount = await _thirdAccountRepository.QueryByOpenIdAsync(openId);
  240. var dayTime = DateTime.Now;
  241. var readPack = await _redPackRecordRepository.Queryable()
  242. .Where(m => m.WXOpenId == openId && m.PickupStatus == ERedPackPickupStatus.Received)
  243. .Where(m => m.CreationTime.Date == dayTime.Date)
  244. .Select(m => SqlFunc.AggregateSum(m.Amount))
  245. .FirstAsync();
  246. var outDto = await _orderRepository.Queryable()
  247. .Where(m => m.Contact == thirdAccount.PhoneNumber)
  248. .Select(m => new SnapshotUserInfoOutDto
  249. {
  250. NoReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status < EOrderStatus.Filed, 1, 0)),
  251. ReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status >= EOrderStatus.Filed, 1, 0)),
  252. AppraiseCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status == EOrderStatus.Visited, 1, 0)),
  253. }).FirstAsync();
  254. outDto.DayAmount = readPack;
  255. outDto.TotalAmount = thirdAccount.TotalAmount;
  256. outDto.PhoneNumber = thirdAccount.PhoneNumber;
  257. return outDto;
  258. }
  259. /// <summary>
  260. /// 获取工单列表
  261. /// </summary>
  262. public async Task<IList<OrderOutDto>> GetSnapshotOrdersAsync(OrderInDto dto, CancellationToken cancellationToken)
  263. {
  264. var items = await _orderSnapshotRepository.Queryable()
  265. .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
  266. .Where((snapshot, order) => order.Contact == _sessionContext.Phone)
  267. .WhereIF(dto.Status == EOrderQueryStatus.Appraise, (snapshot, order) => order.Status == EOrderStatus.Visited)
  268. .WhereIF(dto.Status == EOrderQueryStatus.NoReply, (snapshot, order) => order.Status < EOrderStatus.Filed)
  269. .WhereIF(dto.Status == EOrderQueryStatus.Reply, (snapshot, order) => order.Status >= EOrderStatus.Filed)
  270. .WhereIF(dto.KeyWords.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.KeyWords))
  271. .Select((snapshot, order) => new OrderOutDto
  272. {
  273. Id = snapshot.Id,
  274. OrderNo = order.No,
  275. Title = order.Title,
  276. Status = order.Status,
  277. IndustryName = snapshot.IndustryName,
  278. CreationTime = order.CreationTime,
  279. Area = order.City
  280. })
  281. .ToFixedListAsync(dto, cancellationToken);
  282. return items;
  283. }
  284. /// <summary>
  285. /// 获取工单详情
  286. /// </summary>
  287. /// <param name="id"></param>
  288. /// <returns></returns>
  289. public async Task<OrderPublishDetailOutDto> GetSnapshotOrderDetailAsync(string id, CancellationToken cancellationToken)
  290. {
  291. var order = await _orderRepository.GetAsync(id) ??
  292. throw UserFriendlyException.SameMessage("工单不存在");
  293. var outDto = order.Adapt<OrderPublishDetailOutDto>();
  294. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  295. if (outDto.FileJson != null)
  296. {
  297. foreach (var item in outDto.FileJson)
  298. {
  299. item.Path = fileServiceUrl + item.Path;
  300. }
  301. }
  302. var traces = await _workflowTraceRepository.Queryable()
  303. .Where(m => m.ExternalId == order.Id && m.Status == EWorkflowStepStatus.Handled)
  304. .OrderBy(m => m.AcceptTime)
  305. .ToListAsync(cancellationToken);
  306. var centre = traces.Where(m => m.StepType == EStepType.End || m.StepType == EStepType.Start || m.BusinessType == EBusinessType.Send || m.BusinessType == EBusinessType.Seat || m.BusinessType == EBusinessType.File)
  307. .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
  308. .ToList();
  309. outDto.Workflow = traces.Where(m => !centre.Select(s => s.Id).ToList().Contains(m.Id))
  310. .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
  311. .ToList();
  312. outDto.Workflow.AddRange(centre);
  313. outDto.Workflow = outDto.Workflow.OrderBy(m => m.HandleTime).ToList();
  314. return outDto;
  315. }
  316. /// <summary>
  317. /// 获取当月详细红包列表
  318. /// </summary>
  319. /// <param name="dto"></param>
  320. /// <returns></returns>
  321. public async Task<IList<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto, CancellationToken cancellationToken)
  322. {
  323. var items = await _redPackRecordRepository.Queryable(includeDeleted: true)
  324. .Where(m => m.IsDeleted == false)
  325. .Where(m => m.WXOpenId == _sessionContext.OpenId)
  326. .Where(m => m.PickupStatus == dto.Status)
  327. .Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
  328. .LeftJoin<Order>((red, order) => red.OrderId == order.Id)
  329. .Select((red, order) => new RedPackOutDto
  330. {
  331. Amount = red.Amount,
  332. Title = order.Title,
  333. CreationTime = red.CreationTime
  334. })
  335. .ToFixedListAsync(dto, cancellationToken);
  336. return items;
  337. }
  338. /// <summary>
  339. /// 获取用户领取过的红包总金额
  340. /// </summary>
  341. /// <returns></returns>
  342. public async Task<string> GetRedPackReceivedTotalAsync(CancellationToken cancellationToken)
  343. {
  344. var member = await _thirdAccountRepository.GetAsync(m => m.OpenId == _sessionContext.OpenId, cancellationToken)
  345. ?? throw UserFriendlyException.SameMessage("用户不存在");
  346. return member.TotalAmount.ToYuanFinance();
  347. }
  348. /// <summary>
  349. /// 按月统计红包金额
  350. /// </summary>
  351. /// <param name="count"></param>
  352. /// <returns></returns>
  353. public async Task<IReadOnlyList<RedPackDateOutDto>> GetRedPackDateAsync(RedPackDateInDto dto, CancellationToken cancellationToken)
  354. {
  355. var openId = _sessionContext.OpenId;
  356. var item = await _redPackRecordRepository.Queryable()
  357. .Where(m => m.WXOpenId == openId)
  358. .Where(m => m.PickupStatus == dto.Status)
  359. .GroupBy(m => m.CreationTime.ToString("yyyy-MM"))
  360. .OrderByDescending(m => m.CreationTime)
  361. .Select(m => new RedPackDateOutDto
  362. {
  363. CreationTime = SqlFunc.AggregateMax(m.CreationTime.Date),
  364. Amount = SqlFunc.AggregateSum(m.Amount)
  365. })
  366. .ToFixedListAsync(dto, cancellationToken);
  367. return item;
  368. }
  369. /// <summary>
  370. /// 获取随手拍公告详情
  371. /// </summary>
  372. /// <param name="id"></param>
  373. /// <returns></returns>
  374. public async Task<BulletinOutDto> GetBulletinsDetailAsync(string id)
  375. {
  376. var detail = await _bulletinRepository.Queryable()
  377. .Where(m => m.Id == id)
  378. .Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
  379. .Select(m => new BulletinOutDto
  380. {
  381. Id = m.Id,
  382. Title = m.Title,
  383. Content = m.Content,
  384. CreationTime = m.CreationTime
  385. })
  386. .FirstAsync();
  387. return detail;
  388. }
  389. /// <summary>
  390. /// 添加随手拍公告
  391. /// </summary>
  392. /// <returns></returns>
  393. public async Task<string> AddBulletinAsync(AddSnapshotBulletinInDto dto)
  394. {
  395. dto.ValidateObject();
  396. var entity = dto.Adapt<SnapshotBulletin>();
  397. entity.BulletinState = EBulletinState.InReview;
  398. entity.Id = await _bulletinRepository.AddAsync(entity);
  399. return entity.Id;
  400. }
  401. /// <summary>
  402. /// 审核公告
  403. /// </summary>
  404. /// <param name="examineBulletinDto"></param>
  405. /// <returns></returns>
  406. public async Task AuditBulletinAsync(ExamineBulletinDto dto)
  407. {
  408. var bulletin = await _bulletinRepository.GetAsync(dto.Id)
  409. ?? throw UserFriendlyException.SameMessage("无效数据");
  410. if (bulletin.BulletinState != EBulletinState.InReview)
  411. throw UserFriendlyException.SameMessage("当前状态不能审核");
  412. bulletin.ExaminOpinion = dto.Reason;
  413. bulletin.ExaminTime = DateTime.Now;
  414. bulletin.ExaminManId = _sessionContext.RequiredUserId;
  415. if (dto.IsPass)
  416. {
  417. bulletin.BulletinState = EBulletinState.ReviewPass;
  418. }
  419. else
  420. {
  421. bulletin.BulletinState = EBulletinState.ReviewNoPass;
  422. }
  423. await _bulletinRepository.UpdateAsync(bulletin);
  424. }
  425. #region 从业人员
  426. /// <summary>
  427. /// 添加从业人员
  428. /// </summary>
  429. /// <param name="dtos"></param>
  430. /// <returns></returns>
  431. public async Task AddPractitionerAsync(IList<AddPractitionerInDto> dtos)
  432. {
  433. foreach (var item in dtos)
  434. {
  435. try
  436. {
  437. var entity = item.Adapt<Practitioner>();
  438. switch (item.Gender.Trim())
  439. {
  440. case "男":
  441. entity.Gender = EGender.Male;
  442. break;
  443. case "女":
  444. entity.Gender = EGender.Female;
  445. break;
  446. default:
  447. entity.Gender = EGender.Unknown;
  448. break;
  449. }
  450. var area = await _systemAreaRepository.Queryable()
  451. .Where(m => m.AreaName == item.SystemAreaName)
  452. .FirstAsync();
  453. entity.SystemAreaId = area.Id;
  454. entity.SystemAreaName = area.AreaName;
  455. await _practitionerRepository.AddAsync(entity);
  456. }
  457. catch (Exception e)
  458. {
  459. var msg = e.Message;
  460. }
  461. }
  462. }
  463. /// <summary>
  464. /// 获取从业人员
  465. /// </summary>
  466. /// <param name="dto"></param>
  467. /// <param name="cancellationToken"></param>
  468. /// <returns></returns>
  469. public async Task<IList<PractitionerItemOutDto>> GetPractitionerItemsAsync(PractitionerItemInDto dto, CancellationToken cancellationToken)
  470. {
  471. var items = await _practitionerRepository.Queryable()
  472. .Where(m => m.SystemAreaId == dto.AreaId)
  473. .OrderBy("RANDOM()")
  474. .Select<PractitionerItemOutDto>()
  475. .Take(dto.Count)
  476. .ToListAsync(cancellationToken);
  477. return items;
  478. }
  479. /// <summary>
  480. /// 获取从业人员详情
  481. /// </summary>
  482. /// <param name="id"></param>
  483. /// <param name="cancellationToken"></param>
  484. /// <returns></returns>
  485. public async Task<PractitionerDetailOutDto> GetPractitionerDetailAsync(string id, CancellationToken cancellationToken)
  486. {
  487. var item = await _practitionerRepository.GetAsync(id, cancellationToken)
  488. ?? throw UserFriendlyException.SameMessage("从业人员不存在");
  489. return item.Adapt<PractitionerDetailOutDto>();
  490. }
  491. #endregion
  492. }