RedPackApplication.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using Hotline.Orders;
  2. using Hotline.Share.Dtos.Snapshot;
  3. using Hotline.Share.Enums.Order;
  4. using Hotline.Share.Enums.Snapshot;
  5. using Hotline.Share.Tools;
  6. using Hotline.Snapshot;
  7. using Hotline.Snapshot.Interfaces;
  8. using Mapster;
  9. using SqlSugar;
  10. using SqlSugar.Extensions;
  11. using XF.Domain.Authentications;
  12. using XF.Domain.Dependency;
  13. using XF.Domain.Exceptions;
  14. using XF.Domain.Repository;
  15. using XF.Utility.EnumExtensions;
  16. namespace Hotline.Application.Snapshot;
  17. public class RedPackApplication : IRedPackApplication, IScopeDependency
  18. {
  19. private readonly IOrderSnapshotRepository _orderSnapshotRepository;
  20. private readonly IOrderRepository _orderRepository;
  21. private readonly ISnapshotSMSTemplateRepository _snapshotSMSTemplateRepository;
  22. private readonly IIndustryRepository _industryRepository;
  23. private readonly IRedPackAuditRepository _redPackAuditRepository;
  24. private readonly IRedPackRecordRepository _redPackRecordRepository;
  25. private readonly IRepository<OrderSpecial> _orderSpecialRepository;
  26. private readonly ISessionContext _sessionContext;
  27. private readonly IRedPackGuiderAuditRepository _redPackGuiderAuditRepository;
  28. private readonly IThirdAccountRepository _thirdAccountRepository;
  29. public RedPackApplication(IOrderSnapshotRepository orderSnapshotRepository, ISnapshotSMSTemplateRepository snapshotSMSTemplateRepository, IOrderRepository orderRepository, IIndustryRepository industryRepository, IRedPackAuditRepository redPackAuditRepository, IRedPackRecordRepository redPackRecordRepository, IRepository<OrderSpecial> orderSpecialRepository, ISessionContext sessionContext, IRedPackGuiderAuditRepository redPackGuiderAuditRepository, IThirdAccountRepository thirdAccountRepository)
  30. {
  31. _orderSnapshotRepository = orderSnapshotRepository;
  32. _snapshotSMSTemplateRepository = snapshotSMSTemplateRepository;
  33. _orderRepository = orderRepository;
  34. _industryRepository = industryRepository;
  35. _redPackAuditRepository = redPackAuditRepository;
  36. _redPackRecordRepository = redPackRecordRepository;
  37. _orderSpecialRepository = orderSpecialRepository;
  38. _sessionContext = sessionContext;
  39. _redPackGuiderAuditRepository = redPackGuiderAuditRepository;
  40. _thirdAccountRepository = thirdAccountRepository;
  41. }
  42. /// <summary>
  43. /// 审核红包发放
  44. /// </summary>
  45. /// <param name="dto"></param>
  46. /// <returns></returns>
  47. public async Task AuditRedPackAuditAsync(UpdateRedPackAuditInDto dto)
  48. {
  49. var redPackAudit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  50. if (redPackAudit.Status != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  51. redPackAudit.SMSTemplateId = dto.SMSTemplateId;
  52. redPackAudit.Status = dto.Status;
  53. redPackAudit.Remark = dto.Opinion;
  54. redPackAudit.IsSendSMS = dto.IsSendSms;
  55. var order = await _orderRepository.Queryable()
  56. .Where(m => m.Id == redPackAudit.OrderId)
  57. .Select(m => new { m.Id, m.No, m.FromName, m.FromPhone })
  58. .FirstAsync() ?? throw UserFriendlyException.SameMessage("工单不存在");
  59. if (dto.Status == ERedPackAuditStatus.Agree)
  60. {
  61. var third = await _thirdAccountRepository.GetByPhoneNumberAsync(order.FromPhone);
  62. var entity = new RedPackRecord
  63. {
  64. OrderId = redPackAudit.OrderId,
  65. RedPackAuditId = redPackAudit.Id,
  66. PeopleType = EReadPackUserType.Citizen,
  67. Name = order.FromName,
  68. PhoneNumber = order.FromPhone,
  69. WXOpenId = third?.OpenId,
  70. No = order.No,
  71. PickupStatus = ERedPackPickupStatus.Unreceived,
  72. DistributionState = EReadPackSendStatus.Unsend,
  73. };
  74. if (redPackAudit.ApprovedAmount.HasValue)
  75. entity.Amount = redPackAudit.ApprovedAmount.Value;
  76. await _redPackRecordRepository.AddAsync(entity);
  77. }
  78. await _redPackAuditRepository.UpdateAsync(redPackAudit);
  79. }
  80. /// <summary>
  81. /// 网格员审核红包发放
  82. /// </summary>
  83. /// <param name="dto"></param>
  84. /// <returns></returns>
  85. public async Task AuditRedPackGuiderAuditAsync(UpdateRedPackGuiderAuditInDto dto)
  86. {
  87. var redPackAudit = await _redPackGuiderAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  88. var orgName = _sessionContext.OrgName ?? string.Empty;
  89. RedPackRecord? entity = null;
  90. if (orgName.Contains("应急管理局"))
  91. {
  92. if (redPackAudit.LevelTwoStatus != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  93. redPackAudit.LevelTwoStatus = dto.Status;
  94. if (dto.Status == ERedPackAuditStatus.Agree)
  95. {
  96. var order = await _orderRepository.Queryable()
  97. .Where(m => m.Id == redPackAudit.OrderId)
  98. .Select(m => new { m.Id, m.No, m.FromName, m.FromPhone })
  99. .FirstAsync();
  100. entity = new RedPackRecord
  101. {
  102. OrderId = redPackAudit.OrderId,
  103. RedPackAuditId = redPackAudit.Id,
  104. PeopleType = EReadPackUserType.Guider,
  105. Name = order.FromName,
  106. PhoneNumber = order.FromPhone,
  107. No = order.No,
  108. PickupStatus = ERedPackPickupStatus.Unreceived,
  109. DistributionState = EReadPackSendStatus.Unsend,
  110. };
  111. if (redPackAudit.ApprovedAmount.HasValue)
  112. entity.Amount = redPackAudit.ApprovedAmount.Value;
  113. }
  114. }
  115. else
  116. {
  117. if (redPackAudit.LevelOneStatus != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  118. redPackAudit.LevelOneStatus = dto.Status;
  119. }
  120. redPackAudit.Remark = dto.Opinion;
  121. await _redPackGuiderAuditRepository.UpdateAsync(redPackAudit);
  122. if (entity != null)
  123. await _redPackRecordRepository.AddAsync(entity);
  124. }
  125. /// <summary>
  126. /// 获取网格员审核详情
  127. /// </summary>
  128. /// <param name="id">工单Id</param>
  129. /// <returns></returns>
  130. public async Task<SnapshotOrderAuditDetailOutDto> GetRedPackGuiderAuditDetailAsync(string id)
  131. {
  132. var order = await _orderRepository.GetAsync(id) ?? throw UserFriendlyException.SameMessage("工单不存在");
  133. var outDto = new SnapshotOrderAuditDetailOutDto { Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>() };
  134. var industry = await _industryRepository.Queryable(includeDeleted: true)
  135. .LeftJoin<OrderSnapshot>((i, o) => i.Id == o.IndustryId)
  136. .Select((i, o) => new { i.Id, i.GuiderReadPackAmount })
  137. .FirstAsync();
  138. outDto.Amount = industry.GuiderReadPackAmount;
  139. outDto.RedPackTxt = $"{order.FromPhone}【】元; ";
  140. var dayStart = DateTime.Now.ToString("yyyy-MM-dd 00:00:00").ObjToDate();
  141. var dayEnd = DateTime.Now.ToString("yyyy-MM-dd 23:59:59").ObjToDate();
  142. var query = _redPackGuiderAuditRepository.Queryable()
  143. .Where(m => m.PhoneNumber == order.FromPhone && m.LevelTwoAuditTime >= dayStart && m.LevelTwoAuditTime <= dayEnd && m.LevelTwoStatus == ERedPackAuditStatus.Agree);
  144. var totalAmount = await query.SumAsync(m => m.ApprovedAmount);
  145. if (totalAmount != 0)
  146. outDto.RedPackTxt = $"{order.FromPhone}【{totalAmount}】元; ";
  147. var count = await query.CountAsync();
  148. if (count != 0)
  149. outDto.RedPackTxt += $"今天审批【{count}】个";
  150. outDto.AuditComBox = EnumExts.GetDescriptions<ERedPackAuditStatus>()
  151. .Where(m => m.Key.ToString() != "0").ToList();
  152. return outDto;
  153. }
  154. /// <summary>
  155. /// 获取审核详情
  156. /// </summary>
  157. /// <param name="id">工单Id</param>
  158. /// <returns></returns>
  159. public async Task<SnapshotOrderAuditDetailOutDto> GetRedPackAuditDetailAsync(string id)
  160. {
  161. var order = await _orderRepository.GetAsync(id) ?? throw UserFriendlyException.SameMessage("工单不存在");
  162. var outDto = new SnapshotOrderAuditDetailOutDto { Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>() };
  163. var industry = await _industryRepository.Queryable(includeDeleted: true)
  164. .LeftJoin<OrderSnapshot>((i, o) => i.Id == o.IndustryId)
  165. .Select((i, o) => new { i.Id, i.CitizenReadPackAmount })
  166. .FirstAsync();
  167. outDto.Amount = industry.CitizenReadPackAmount;
  168. outDto.RedPackTxt = $"{order.FromPhone}【】元; ";
  169. var dayStart = DateTime.Now.ToString("yyyy-MM-dd 00:00:00").ObjToDate();
  170. var dayEnd = DateTime.Now.ToString("yyyy-MM-dd 23:59:59").ObjToDate();
  171. var query = _redPackAuditRepository.Queryable()
  172. .Where(m => m.PhoneNumber == order.FromPhone && m.AuditTime >= dayStart && m.AuditTime <= dayEnd && m.Status == ERedPackAuditStatus.Agree);
  173. var totalAmount = await query.SumAsync(m => m.ApprovedAmount);
  174. if (totalAmount != 0)
  175. outDto.RedPackTxt = $"{order.FromPhone}【{totalAmount}】元; ";
  176. var count = await query.CountAsync();
  177. if (count != 0)
  178. outDto.RedPackTxt += $"今天审批【{count}】个";
  179. outDto.AuditComBox = EnumExts.GetDescriptions<ERedPackAuditStatus>()
  180. .Where(m => m.Key.ToString() != "0").ToList();
  181. return outDto;
  182. }
  183. /// <summary>
  184. /// 红包审核集合
  185. /// </summary>
  186. /// <param name="dto"></param>
  187. /// <returns></returns>
  188. public ISugarQueryable<SnapshotOrderAuditItemsOutDto> GetRedPackAuditItemsAsync(SnapshotOrderAuditItemsInDto dto)
  189. {
  190. ERedPackAuditStatus? status = null;
  191. if (dto.Status != -1 && Enum.TryParse<ERedPackAuditStatus>(dto.Status.ToString(), out var statusParse))
  192. {
  193. status = statusParse;
  194. }
  195. var query = _redPackAuditRepository.Queryable(includeDeleted: true)
  196. .LeftJoin<Order>((redPackAudit, order) => redPackAudit.OrderId == order.Id)
  197. .LeftJoin<OrderSnapshot>((redPackAudit, order, snapshot) => redPackAudit.OrderId == snapshot.Id)
  198. .LeftJoin<RedPackRecord>((redPackAudit, order, snapshot, record) => redPackAudit.Id == record.OrderId)
  199. .LeftJoin<Industry>((redPackAudit, order, snapshot, record, industry) => snapshot.IndustryId == industry.Id)
  200. .Where((redPackAudit, order, snapshot, record, industry) => order.Status == EOrderStatus.Filed)
  201. .WhereIF(dto.No.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.No.Contains(dto.No))
  202. .WhereIF(dto.Title.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.Title.Contains(dto.Title))
  203. .WhereIF(dto.FromPhone.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.FromPhone.Contains(dto.FromPhone))
  204. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, (redPackAudit, order, snapshot, record, industry) => order.CreationTime <= dto.EndCreationTime && order.CreationTime >= dto.BeginCreationTime)
  205. .WhereIF(dto.BeginFiledTime.HasValue && dto.EndFiledTime.HasValue, (redPackAudit, order, snapshot, record, industry) => order.FiledTime <= dto.EndFiledTime && order.FiledTime >= dto.BeginFiledTime)
  206. .WhereIF(dto.IsDeal.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsDeal == dto.IsDeal)
  207. .WhereIF(dto.IsTruth.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsTruth == dto.IsTruth)
  208. .WhereIF(dto.IsTruthDepartment.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsTruthDepartment == dto.IsTruthDepartment)
  209. .WhereIF(dto.BeginAuditTime.HasValue && dto.EndAuditTime.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.AuditTime <= dto.EndAuditTime && redPackAudit.AuditTime >= dto.BeginAuditTime)
  210. .WhereIF(dto.IsIssued.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.IsIssued == dto.IsIssued)
  211. .WhereIF(dto.IndustryId.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => snapshot.IndustryId == dto.IndustryId)
  212. .WhereIF(dto.ConfigAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => industry.CitizenReadPackAmount == dto.ConfigAmount)
  213. .WhereIF(dto.AcutalAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.AcutalAmount == dto.AcutalAmount)
  214. .WhereIF(dto.ApprovedAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.ApprovedAmount == dto.ApprovedAmount)
  215. .WhereIF(dto.IsDanger.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsDanger == dto.IsDanger)
  216. .WhereIF(status.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.Status == status)
  217. .Select((redPackAudit, order, snapshot, record, industry) => new SnapshotOrderAuditItemsOutDto
  218. {
  219. Id = redPackAudit.Id,
  220. RedPackAuditId = redPackAudit.Id,
  221. OrderId = order.Id,
  222. No = order.No,
  223. Title = order.Title,
  224. IndustryName = industry.Name,
  225. IndustryId = industry.Id,
  226. SourceChannel = order.SourceChannel,
  227. SourceChannelCode = order.SourceChannelCode,
  228. Status = order.Status,
  229. IsDanger = snapshot.IsDanger,
  230. FromPhone = order.FromPhone,
  231. FromName = order.FromName,
  232. AuditTime = redPackAudit.AuditTime,
  233. ApprovedAmount = redPackAudit.ApprovedAmount,
  234. AcutalAmount = redPackAudit.AcutalAmount,
  235. IsIssued = redPackAudit.IsIssued,
  236. RecordRemark = record.Remark,
  237. County = order.County,
  238. // IsRectify = s.IsRepetition
  239. IsDeal = snapshot.IsDeal,
  240. NetworkENumber = snapshot.NetworkENumber,
  241. IsTruth = snapshot.IsTruth,
  242. IsTruthDepartment = snapshot.IsTruthDepartment,
  243. IsRepetition = snapshot.IsRepetition,
  244. CreationTime = order.CreationTime,
  245. OrgLevelOneCode = order.OrgLevelOneCode,
  246. OrgLevelOneName = order.OrgLevelOneName,
  247. AuditId = redPackAudit.AuditId,
  248. AuditName = redPackAudit.AuditName,
  249. AuditOrgId = redPackAudit.AuditOrgId,
  250. AuditOrgName = redPackAudit.AuditOrgName,
  251. AuditRemark = redPackAudit.AuditRemark,
  252. BankCardNo = record.BankCardNo,
  253. OpenBank = record.OpenBank,
  254. AuditStatus = redPackAudit.Status,
  255. });
  256. return query;
  257. }
  258. /// <summary>
  259. /// 网格员审核集合
  260. /// </summary>
  261. /// <param name="dto"></param>
  262. /// <returns></returns>
  263. public ISugarQueryable<SnapshotOrderGuiderAuditItemsOutDto> GetRedPackGuiderAuditItemsAsync(SnapshotOrderGuiderAuditItemsInDto dto)
  264. {
  265. var areaCode = _sessionContext.OrgAreaCode;
  266. if (_sessionContext.OrgIsCenter)
  267. {
  268. areaCode = null;
  269. }
  270. ERedPackAuditStatus? status = null;
  271. if (dto.Status != -1 && Enum.TryParse<ERedPackAuditStatus>(dto.Status.ToString(), out var statusParse))
  272. {
  273. status = statusParse;
  274. }
  275. var query = _redPackGuiderAuditRepository.Queryable(includeDeleted: true)
  276. .LeftJoin<Order>((redPackAudit, order) => redPackAudit.OrderId == order.Id)
  277. .LeftJoin<OrderSnapshot>((redPackAudit, order, snapshot) => redPackAudit.OrderId == snapshot.Id)
  278. .LeftJoin<RedPackRecord>((redPackAudit, order, snapshot, record) => redPackAudit.Id == record.OrderId)
  279. .LeftJoin<Industry>((redPackAudit, order, snapshot, record, industry) => snapshot.IndustryId == industry.Id)
  280. .Where((redPackAudit, order, snapshot, record, industry) => order.Status == EOrderStatus.Filed)
  281. .WhereIF(dto.No.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.No.Contains(dto.No))
  282. .WhereIF(dto.Title.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.Title.Contains(dto.Title))
  283. .WhereIF(status.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.LevelOneStatus == status)
  284. .WhereIF(areaCode.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.AreaCode == areaCode);
  285. var orgName = _sessionContext.OrgName ?? string.Empty;
  286. if (orgName.Contains("应急管理局") && status != null)
  287. query.Where((redPackAudit, order, snapshot, record, industry) => redPackAudit.LevelTwoStatus == status);
  288. else if (status != null)
  289. query.Where((redPackAudit, order, snapshot, record, industry) => redPackAudit.LevelOneStatus == status);
  290. return query.Select((redPackAudit, order, snapshot, record, industry) => new SnapshotOrderGuiderAuditItemsOutDto
  291. {
  292. Id = redPackAudit.Id,
  293. RedPackAuditId = redPackAudit.Id,
  294. OrderId = order.Id,
  295. No = order.No,
  296. Title = order.Title,
  297. SourceChannel = order.SourceChannel,
  298. SourceChannelCode = order.SourceChannelCode,
  299. Status = order.Status,
  300. FromPhone = order.FromPhone,
  301. FromName = order.FromName,
  302. ApprovedAmount = redPackAudit.ApprovedAmount,
  303. IsIssued = redPackAudit.IsIssued,
  304. County = order.County,
  305. IsDeal = snapshot.IsDeal,
  306. NetworkENumber = snapshot.NetworkENumber,
  307. IsTruth = snapshot.IsTruth,
  308. IsTruthDepartment = snapshot.IsTruthDepartment,
  309. IsRepetition = snapshot.IsRepetition,
  310. IsRectify = snapshot.IsRectifyDepartment,
  311. CreationTime = order.CreationTime,
  312. LevelOneAuditName = redPackAudit.LevelOneAuditName,
  313. LevelOneAuditOrgName = redPackAudit.LevelOneAuditOrgName,
  314. LevelOneAuditRemark = redPackAudit.LevelOneAuditRemark,
  315. LevelOneAuditTime = redPackAudit.LevelOneAuditTime,
  316. NetworkRemark = snapshot.NetworkRemark,
  317. LevelOneStatus = redPackAudit.LevelOneStatus,
  318. LevelTwoStatus = redPackAudit.LevelTwoStatus,
  319. LevelTwoAuditTime = redPackAudit.LevelTwoAuditTime,
  320. LevelTwoAuditRemark = redPackAudit.LevelTwoAuditRemark,
  321. }, true);
  322. }
  323. /// <summary>
  324. /// 获取审核短信模板
  325. /// </summary>
  326. /// <param name="dto"></param>
  327. /// <returns></returns>
  328. public async Task<IList<GetRedPackAuditSMSTemplateOutDto>> GetRedPackAuditSMSTemplateAsync(GetRedPackAuditSMSTemplateInDto dto)
  329. {
  330. var items = await _snapshotSMSTemplateRepository.Queryable(includeDeleted: true)
  331. .LeftJoin<Industry>((sms, industry) => sms.IndustryId == industry.Id)
  332. .LeftJoin<OrderSnapshot>((sms, industry, snapshot) => snapshot.IndustryId == industry.Id)
  333. .Where((sms, industry, snapshot) => (sms.IsPublic == true || sms.IndustryId == snapshot.IndustryId)
  334. && sms.Status == dto.Status && sms.IsEnable == true)
  335. .Select<GetRedPackAuditSMSTemplateOutDto>()
  336. .Distinct()
  337. .ToListAsync();
  338. return items;
  339. }
  340. /// <summary>
  341. /// 审核添加备注
  342. /// </summary>
  343. /// <param name="dto"></param>
  344. /// <returns></returns>
  345. public async Task UpdateRedPackAuditRemarkAsync(UpdateRedPackAuditRemarkInDto dto)
  346. {
  347. var audit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  348. audit.AcutalAmount = dto.AcutalAmount;
  349. if (dto.IsSend == false)
  350. {
  351. await _redPackRecordRepository.Queryable()
  352. .Where(m => m.RedPackAuditId == audit.Id)
  353. .FirstAsync()
  354. .Then(async (record) =>
  355. {
  356. record.FailCase = dto.FailCase;
  357. await _redPackRecordRepository.UpdateAsync(record);
  358. });
  359. }
  360. audit.SendRemarks = dto.SendRemarks;
  361. await _redPackAuditRepository.UpdateAsync(audit);
  362. }
  363. public async Task UpdateRedPackRecordAsync(UpdateRedPackRecordInDto dto)
  364. {
  365. var record = await _redPackRecordRepository.Queryable()
  366. .Where(m => m.RedPackAuditId == dto.RedPackAuditId)
  367. .FirstAsync() ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  368. var audit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  369. dto.Adapt(record);
  370. await _redPackRecordRepository.UpdateAsync(record);
  371. dto.Adapt(audit);
  372. await _redPackAuditRepository.UpdateAsync(audit);
  373. if (dto.IsSendSMS)
  374. {
  375. // TODO: 发送短信
  376. }
  377. }
  378. #region 红包发放记录
  379. /// <summary>
  380. /// 市民红包发放记录
  381. /// </summary>
  382. /// <param name="dto"></param>
  383. /// <returns></returns>
  384. public ISugarQueryable<SnapshotRedPackRecordItemsOutDto> GetRedPackRecordItemsAsync(SnapshotRedPackRecordItemsInDto dto)
  385. {
  386. var query = _redPackRecordRepository.Queryable()
  387. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
  388. .WhereIF(dto.No.NotNullOrEmpty(), m => m.No.Contains(dto.No))
  389. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
  390. .Select<SnapshotRedPackRecordItemsOutDto>();
  391. if (dto.Status == 3)
  392. query = query.Where(m => m.PickupStatus == ERedPackPickupStatus.Excuse);
  393. else
  394. {
  395. if (Enum.TryParse(dto.Status.ToString(), out EReadPackSendStatus status))
  396. query = query.Where(m => m.DistributionState == status);
  397. }
  398. return query;
  399. }
  400. /// <summary>
  401. /// 获取特提参数
  402. /// </summary>
  403. /// <param name="id"></param>
  404. /// <returns></returns>
  405. public async Task<GetAuditBackBaseDataOutDto> GetAuditBackBaseDataAsync(string id)
  406. {
  407. var order = await _orderRepository.Queryable()
  408. .Where(m => m.Id == id)
  409. .Select<GetAuditBackBaseDataOutDto>()
  410. .FirstAsync()
  411. ?? throw UserFriendlyException.SameMessage("工单不存在");
  412. order.SpecialNum = await _orderSpecialRepository.CountAsync(x => x.OrderId == id);
  413. return order;
  414. }
  415. #endregion
  416. }