RedPackApplication.cs 28 KB

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