RedPackApplication.cs 28 KB

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