RedPackApplication.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. using DocumentFormat.OpenXml.Office2010.Excel;
  2. using Hotline.Application.Snapshot.Contracts;
  3. using Hotline.Caching.Interfaces;
  4. using Hotline.Orders;
  5. using Hotline.Push.FWMessage;
  6. using Hotline.Share.Attributes;
  7. using Hotline.Share.Dtos;
  8. using Hotline.Share.Dtos.Push;
  9. using Hotline.Share.Dtos.Snapshot;
  10. using Hotline.Share.Enums.Order;
  11. using Hotline.Share.Enums.Push;
  12. using Hotline.Share.Enums.Snapshot;
  13. using Hotline.Share.Tools;
  14. using Hotline.Snapshot;
  15. using Hotline.Snapshot.Contracts;
  16. using Hotline.Snapshot.IRepository;
  17. using Hotline.ThirdAccountDomainServices.Interfaces;
  18. using Mapster;
  19. using Microsoft.AspNetCore.Http;
  20. using Microsoft.EntityFrameworkCore;
  21. using Microsoft.Extensions.Logging;
  22. using Microsoft.Identity.Client;
  23. using SqlSugar;
  24. using SqlSugar.Extensions;
  25. using System.ComponentModel;
  26. using XF.Domain.Authentications;
  27. using XF.Domain.Dependency;
  28. using XF.Domain.Exceptions;
  29. using XF.Domain.Repository;
  30. using XF.Utility.EnumExtensions;
  31. using static NPOI.SS.Format.CellNumberFormatter;
  32. namespace Hotline.Application.Snapshot;
  33. public class RedPackApplication : IRedPackApplication, IScopeDependency
  34. {
  35. private readonly IOrderSnapshotRepository _orderSnapshotRepository;
  36. private readonly IOrderRepository _orderRepository;
  37. private readonly ISnapshotSMSTemplateRepository _snapshotSMSTemplateRepository;
  38. private readonly IIndustryRepository _industryRepository;
  39. private readonly ISpecialRedPackAuditRepository _specialRedPackAuditRepository;
  40. /// <summary>
  41. /// 市民红包审核仓储
  42. /// </summary>
  43. private readonly IRedPackAuditRepository _redPackAuditRepository;
  44. private readonly IRedPackRecordRepository _redPackRecordRepository;
  45. private readonly IRepository<OrderSpecial> _orderSpecialRepository;
  46. private readonly ISessionContext _sessionContext;
  47. private readonly IRedPackGuiderAuditRepository _redPackGuiderAuditRepository;
  48. private readonly IThirdAccountRepository _thirdAccountRepository;
  49. private readonly ISupplementRecordRepository _supplementRecordRepository;
  50. private readonly IPushDomainService _pushDomainService;
  51. private readonly ILogger<RedPackApplication> _logger;
  52. private readonly ISystemDicDataCacheManager _systemDic;
  53. private readonly ISnapshotPointsRecordRepository _snapshotPointsRecordRepository;
  54. private readonly ISnapshotPointsDomainService _snapshotPointsDomainService;
  55. 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, IPushDomainService pushDomainService, ILogger<RedPackApplication> logger, ISpecialRedPackAuditRepository specialRedPackAuditRepository, ISystemDicDataCacheManager systemDic, ISnapshotPointsRecordRepository snapshotPointsRecordRepository, ISnapshotPointsDomainService snapshotPointsDomainService)
  56. {
  57. _orderSnapshotRepository = orderSnapshotRepository;
  58. _snapshotSMSTemplateRepository = snapshotSMSTemplateRepository;
  59. _orderRepository = orderRepository;
  60. _industryRepository = industryRepository;
  61. _redPackAuditRepository = redPackAuditRepository;
  62. _redPackRecordRepository = redPackRecordRepository;
  63. _orderSpecialRepository = orderSpecialRepository;
  64. _sessionContext = sessionContext;
  65. _redPackGuiderAuditRepository = redPackGuiderAuditRepository;
  66. _thirdAccountRepository = thirdAccountRepository;
  67. _supplementRecordRepository = supplementRecordRepository;
  68. _pushDomainService = pushDomainService;
  69. _logger = logger;
  70. _specialRedPackAuditRepository = specialRedPackAuditRepository;
  71. _systemDic = systemDic;
  72. _snapshotPointsRecordRepository = snapshotPointsRecordRepository;
  73. _snapshotPointsDomainService = snapshotPointsDomainService;
  74. }
  75. /// <summary>
  76. /// 审核红包发放
  77. /// </summary>
  78. /// <param name="dto"></param>
  79. /// <returns></returns>
  80. public async Task AuditRedPackAuditAsync(UpdateRedPackAuditInDto dto, CancellationToken token)
  81. {
  82. var status = ERedPackAuditStatus.Refuse;
  83. if (dto.Status == ESnapshotSMSStatus.Agree)
  84. status = ERedPackAuditStatus.Agree;
  85. var redPackAudit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId, token) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  86. if (redPackAudit.Status != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  87. redPackAudit.SMSTemplateId = dto.SMSTemplateId;
  88. redPackAudit.Status = status;
  89. redPackAudit.AuditRemark = dto.Opinion;
  90. redPackAudit.IsSendSMS = dto.IsSendSms;
  91. redPackAudit.AuditId = _sessionContext.UserId;
  92. redPackAudit.AuditName = _sessionContext.UserName;
  93. redPackAudit.AuditTime = DateTime.Now;
  94. redPackAudit.AuditOrgId = _sessionContext.OrgId;
  95. redPackAudit.AuditOrgName = _sessionContext.OrgName;
  96. redPackAudit.ApprovedAmount = redPackAudit.ShouldAmount;
  97. redPackAudit.Points = dto.Points;
  98. redPackAudit.PointsStatus = dto.PointsStatus;
  99. redPackAudit.PointsOpinion = dto.PointsOpinion;
  100. redPackAudit.ExtraDeductedPoints = dto.ExtraDeductedPoints;
  101. redPackAudit.ExtraDeductionPointsTypeId = dto.ExtraDeductionPointsTypeId;
  102. redPackAudit.ExtraDeductionPointsTypeName = dto.ExtraDeductionPointsTypeName;
  103. var order = await _orderRepository.Queryable()
  104. .LeftJoin<OrderSnapshot>((order, snapshot) => order.Id == snapshot.Id)
  105. .Where((order, snapshot) => order.Id == redPackAudit.OrderId)
  106. .Select((order, snapshot) => new { order.Id, order.No, order.FromName, order.FromPhone, snapshot.CreatorId })
  107. .FirstAsync(token) ?? throw UserFriendlyException.SameMessage("工单不存在");
  108. if (status == ERedPackAuditStatus.Agree)
  109. {
  110. var third = await _thirdAccountRepository.GetByExternalIdAsync(order.CreatorId, token);
  111. var entity = new RedPackRecord
  112. {
  113. OrderId = redPackAudit.OrderId,
  114. RedPackAuditId = redPackAudit.Id,
  115. PeopleType = EReadPackUserType.Citizen,
  116. Name = order.FromName,
  117. PhoneNumber = order.FromPhone,
  118. WXOpenId = third?.OpenId,
  119. No = order.No,
  120. PickupStatus = ERedPackPickupStatus.Unreceived,
  121. DistributionState = EReadPackSendStatus.Unsend,
  122. };
  123. if (redPackAudit.ApprovedAmount.HasValue)
  124. entity.Amount = redPackAudit.ApprovedAmount.Value;
  125. await _redPackRecordRepository.AddAsync(entity);
  126. }
  127. await _redPackAuditRepository.UpdateAsync(redPackAudit, token);
  128. await _snapshotPointsDomainService.AddPointsAsync(order.Id, EPointsSource.Audit, dto.PointsStatus, dto.ExtraDeductedPoints);
  129. if (dto.IsSendSms)
  130. {
  131. var smsTemplate = await _snapshotSMSTemplateRepository.GetAsync(dto.SMSTemplateId);
  132. if (smsTemplate == null) return;
  133. var inDto = new MessageDto
  134. {
  135. TelNumber = order.FromPhone,
  136. Content = smsTemplate.Content,
  137. PushBusiness = EPushBusiness.Snapshot,
  138. Name = order.FromName,
  139. };
  140. try
  141. {
  142. await _pushDomainService.PushMsgAsync(inDto, CancellationToken.None);
  143. }
  144. catch (Exception e)
  145. {
  146. _logger.LogError("随手拍发送短信异常:" + e.Message, e);
  147. }
  148. }
  149. }
  150. /// <summary>
  151. /// 网格员审核红包发放
  152. /// </summary>
  153. /// <param name="dto"></param>
  154. /// <returns></returns>
  155. public async Task AuditRedPackGuiderAuditAsync(UpdateRedPackGuiderAuditInDto dto)
  156. {
  157. var status = ERedPackAuditStatus.Refuse;
  158. if (dto.Status == ESnapshotSMSStatus.Agree)
  159. status = ERedPackAuditStatus.Agree;
  160. var redPackAudit = await _redPackGuiderAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  161. var orgName = _sessionContext.OrgName ?? string.Empty;
  162. RedPackRecord? entity = null;
  163. if (orgName.Contains("应急管理局"))
  164. {
  165. if (redPackAudit.LevelTwoStatus != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  166. redPackAudit.LevelTwoStatus = status;
  167. if (status == ERedPackAuditStatus.Agree)
  168. {
  169. var order = await _orderRepository.Queryable()
  170. .Where(m => m.Id == redPackAudit.OrderId)
  171. .Select(m => new { m.Id, m.No, m.FromName, m.FromPhone })
  172. .FirstAsync();
  173. entity = new RedPackRecord
  174. {
  175. OrderId = redPackAudit.OrderId,
  176. RedPackAuditId = redPackAudit.Id,
  177. PeopleType = EReadPackUserType.Guider,
  178. Name = order.FromName,
  179. PhoneNumber = order.FromPhone,
  180. No = order.No,
  181. PickupStatus = ERedPackPickupStatus.Unreceived,
  182. DistributionState = EReadPackSendStatus.Unsend,
  183. };
  184. if (redPackAudit.ApprovedAmount.HasValue)
  185. entity.Amount = redPackAudit.ApprovedAmount.Value;
  186. }
  187. }
  188. else
  189. {
  190. if (redPackAudit.LevelOneStatus != ERedPackAuditStatus.Pending) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  191. redPackAudit.LevelOneStatus = status;
  192. }
  193. redPackAudit.Remark = dto.Opinion;
  194. await _redPackGuiderAuditRepository.UpdateAsync(redPackAudit);
  195. if (entity != null)
  196. await _redPackRecordRepository.AddAsync(entity);
  197. }
  198. /// <summary>
  199. /// 获取网格员审核详情
  200. /// </summary>
  201. /// <param name="id">工单Id</param>
  202. /// <returns></returns>
  203. public async Task<SnapshotOrderAuditDetailOutDto> GetRedPackGuiderAuditDetailAsync(string id)
  204. {
  205. var order = await _orderRepository.GetAsync(id) ?? throw UserFriendlyException.SameMessage("工单不存在");
  206. var outDto = new SnapshotOrderAuditDetailOutDto { Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>() };
  207. var industry = await _industryRepository.Queryable(includeDeleted: true)
  208. .LeftJoin<OrderSnapshot>((i, o) => i.Id == o.IndustryId)
  209. .Select((i, o) => new { i.Id, i.GuiderReadPackAmount })
  210. .FirstAsync();
  211. outDto.Amount = industry.GuiderReadPackAmount;
  212. outDto.RedPackTxt = $"{order.FromPhone}【】元; ";
  213. var dayStart = DateTime.Now.ToString("yyyy-MM-dd 00:00:00").ObjToDate();
  214. var dayEnd = DateTime.Now.ToString("yyyy-MM-dd 23:59:59").ObjToDate();
  215. var query = _redPackGuiderAuditRepository.Queryable()
  216. .Where(m => m.PhoneNumber == order.FromPhone && m.LevelTwoAuditTime >= dayStart && m.LevelTwoAuditTime <= dayEnd && m.LevelTwoStatus == ERedPackAuditStatus.Agree);
  217. var totalAmount = await query.SumAsync(m => m.ApprovedAmount);
  218. if (totalAmount != 0)
  219. outDto.RedPackTxt = $"{order.FromPhone}【{totalAmount}】元; ";
  220. var count = await query.CountAsync();
  221. if (count != 0)
  222. outDto.RedPackTxt += $"今天审批【{count}】个";
  223. outDto.AuditComBox = EnumExts.GetDescriptions<ESnapshotSMSStatus>();
  224. return outDto;
  225. }
  226. /// <summary>
  227. /// 获取市民审核详情
  228. /// </summary>
  229. /// <param name="id">工单Id</param>
  230. /// <returns></returns>
  231. public async Task<SnapshotOrderAuditDetailOutDto> GetRedPackAuditDetailAsync(string id)
  232. {
  233. var order = await _orderRepository.GetAsync(id) ?? throw UserFriendlyException.SameMessage("工单不存在");
  234. var outDto = new SnapshotOrderAuditDetailOutDto { Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>() };
  235. var industry = await _industryRepository.Queryable(includeDeleted: true)
  236. .LeftJoin<OrderSnapshot>((i, o) => i.Id == o.IndustryId)
  237. .Where((i, o) => o.Id == id)
  238. .Select((i, o) => new { i.Id, i.CitizenReadPackAmount, i.ArgeePoints, i.ExtraDeductedPoints, i.RefusePoints , i.IsPoints})
  239. .FirstAsync();
  240. outDto.Amount = industry.CitizenReadPackAmount;
  241. outDto.ArgeePoints = industry.ArgeePoints;
  242. outDto.ExtraDeductedPoints = industry.ExtraDeductedPoints;
  243. outDto.RefusePoints = industry.RefusePoints;
  244. outDto.IsPoints = industry.IsPoints;
  245. outDto.RedPackTxt = $"{order.FromPhone}【】元; ";
  246. var dayStart = DateTime.Now.ToString("yyyy-MM-dd 00:00:00").ObjToDate();
  247. var dayEnd = DateTime.Now.ToString("yyyy-MM-dd 23:59:59").ObjToDate();
  248. var query = _redPackAuditRepository.Queryable()
  249. .Where(m => m.PhoneNumber == order.FromPhone && m.AuditTime >= dayStart && m.AuditTime <= dayEnd && m.Status == ERedPackAuditStatus.Agree);
  250. var totalAmount = await query.SumAsync(m => m.ApprovedAmount);
  251. if (totalAmount != 0)
  252. outDto.RedPackTxt = $"{order.FromPhone}【{totalAmount}】元; ";
  253. var count = await query.CountAsync();
  254. if (count != 0)
  255. outDto.RedPackTxt += $"今天审批【{count}】个";
  256. outDto.AuditComBox = EnumExts.GetDescriptions<ESnapshotSMSStatus>();
  257. outDto.ExtraDeductionPointsType = _systemDic.ExtraDeductionPointsType;
  258. return outDto;
  259. }
  260. /// <summary>
  261. /// 特殊红包审批列表
  262. /// </summary>
  263. /// <param name="dto"></param>
  264. /// <returns></returns>
  265. [ExportExcel("特殊红包审批")]
  266. public ISugarQueryable<SnapshotOrderAuditItemsOutDto> GetRedPackSpecialAuditItems(SnapshotOrderAuditItemsInDto dto)
  267. {
  268. var beginTime = new DateTime(2024, 8, 1);
  269. var endTime = new DateTime(2024, 9, 30, 23, 59, 59);
  270. var query = _redPackAuditRepository.Queryable(includeDeleted: true)
  271. .LeftJoin<OrderSnapshot>((redPackAudit, snapshot) => redPackAudit.OrderId == snapshot.Id)
  272. .LeftJoin<Order>((redPackAudit, snapshot, order) => redPackAudit.OrderId == order.Id)
  273. .LeftJoin<SpecialRedPackAudit>((redPackAudit, snapshot, order, special) => redPackAudit.OrderId == special.OrderId)
  274. .LeftJoin<SupplementRecord>((redPackAudit, snapshot, order, special, supplement) => special.Id == supplement.RedPackAuditId)
  275. .Where((redPackAudit, snapshot, order, special) => (redPackAudit.Status == ERedPackAuditStatus.Agree && snapshot.IndustryName == "安全隐患" && order.OrderTagCode!.Contains("DHZY")) || (redPackAudit.Status == ERedPackAuditStatus.Agree && order.CreationTime >= beginTime && order.CreationTime <= endTime && redPackAudit.ApprovedAmount == 20 && order.AcceptTypeCode != "30" && snapshot.IndustryName != "电气焊作业申报" && (order.HotspotId == null || order.HotspotId.StartsWith("18") == false)))
  276. .WhereIF(dto.Status == 0, (redPackAudit, snapshot, order, special) => special.Id == null)
  277. .WhereIF(dto.Status == 1, (redPackAudit, snapshot, order, special) => special.Status == ERedPackAuditStatus.Agree)
  278. .WhereIF(dto.Status == 2, (redPackAudit, snapshot, order, special) => special.Status == ERedPackAuditStatus.Refuse)
  279. .WhereIF(dto.No.NotNullOrEmpty(), (redPackAudit, snapshot, order, special) => order.No!.Contains(dto.No!))
  280. .WhereIF(dto.Title.NotNullOrEmpty(), (redPackAudit, snapshot, order, special) => order.Title!.Contains(dto.Title!))
  281. .WhereIF(dto.FromPhone.NotNullOrEmpty(), (redPackAudit, snapshot, order, special) => order.FromPhone!.Contains(dto.FromPhone!))
  282. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, (redPackAudit, snapshot, order, special) => order.CreationTime >= dto.BeginCreationTime && order.CreationTime <= dto.EndCreationTime)
  283. .WhereIF(dto.IsDeal.HasValue, (redPackAudit, snapshot, order, special) => snapshot.IsDeal == dto.IsDeal)
  284. .WhereIF(dto.IsTruth.HasValue, (redPackAudit, snapshot, order, special) => snapshot.IsTruth == dto.IsTruth)
  285. .WhereIF(dto.IsTruthDepartment.HasValue, (redPackAudit, snapshot, order, special) => snapshot.IsTruthDepartment == dto.IsTruthDepartment)
  286. .WhereIF(dto.BeginAuditTime.HasValue && dto.EndAuditTime.HasValue, (redPackAudit, snapshot, order, special) => redPackAudit.AuditTime >= dto.BeginAuditTime && redPackAudit.AuditTime <= dto.EndAuditTime)
  287. .WhereIF(dto.BeginFiledTime.HasValue && dto.EndFiledTime.HasValue, (redPackAudit, snapshot, order, special) => order.FiledTime >= dto.BeginFiledTime && order.FiledTime <= dto.EndFiledTime)
  288. .WhereIF(dto.IsIssued.HasValue, (redPackAudit, snapshot, order, special) => redPackAudit.IsSend == dto.IsIssued)
  289. .WhereIF(dto.IndustryId.NotNullOrEmpty(), (redPackAudit, snapshot, order, special) => snapshot.IndustryId == dto.IndustryId)
  290. .WhereIF(dto.ConfigAmount.HasValue, (redPackAudit, snapshot, order, special) => special.ShouldAmount == dto.ConfigAmount)
  291. .WhereIF(dto.AcutalAmount.HasValue, (redPackAudit, snapshot, order, special) => special.AcutalAmount == dto.AcutalAmount)
  292. .WhereIF(dto.ApprovedAmount.HasValue, (redPackAudit, snapshot, order, special) => special.ApprovedAmount == dto.ApprovedAmount)
  293. .WhereIF(dto.IsDanger.HasValue, (redPackAudit, snapshot, order, special) => snapshot.IsDanger == dto.IsDanger)
  294. .OrderByDescending((redPackAudit, snapshot, order, special, supplement) => redPackAudit.CreationTime)
  295. .Select((redPackAudit, snapshot, order, special, supplement) => new SnapshotOrderAuditItemsOutDto
  296. {
  297. Id = redPackAudit.Id,
  298. RedPackAuditId = redPackAudit.Id,
  299. OrderId = order.Id,
  300. No = order.No,
  301. Title = order.Title,
  302. IndustryName = snapshot.IndustryName,
  303. IndustryId = snapshot.IndustryId,
  304. SourceChannel = order.SourceChannel,
  305. SourceChannelCode = order.SourceChannelCode,
  306. Status = order.Status,
  307. IsDanger = snapshot.IsDanger,
  308. FromPhone = order.FromPhone,
  309. FromName = order.FromName,
  310. AuditTime = redPackAudit.AuditTime,
  311. ApprovedAmount = redPackAudit.ApprovedAmount,
  312. AcutalAmount = redPackAudit.AcutalAmount,
  313. IsIssued = redPackAudit.IsSend,
  314. //RecordRemark = record.Remark,
  315. County = order.County,
  316. // IsRectify = s.IsRepetition
  317. IsDeal = snapshot.IsDeal,
  318. IsSafetyDepartment = snapshot.IsSafetyDepartment,
  319. NetworkENumber = snapshot.NetworkENumber,
  320. IsTruth = snapshot.IsTruth,
  321. IsTruthDepartment = snapshot.IsTruthDepartment,
  322. IsRepetition = snapshot.IsRepetition,
  323. CreationTime = order.CreationTime,
  324. OrgLevelOneCode = order.OrgLevelOneCode,
  325. OrgLevelOneName = order.OrgLevelOneName,
  326. AuditId = special.AuditId,
  327. AuditName = special.AuditName,
  328. AuditOrgId = special.AuditOrgId,
  329. AuditOrgName = special.AuditOrgName,
  330. AuditRemark = special.AuditRemark,
  331. ReplenishAmount = supplement.ReplenishAmount,
  332. BankCardNo = supplement.BankCardNo,
  333. OpenBank = supplement.OpenBank,
  334. AwardName = supplement.Name,
  335. AuditStatus = special.Status,
  336. AuditType = supplement.AuditType
  337. });
  338. #if DEBUG
  339. var sql = query.ToSqlString();
  340. #endif
  341. return query;
  342. }
  343. public async Task RevocationRedPackSpecialAuditAsync(IList<string> ids)
  344. {
  345. var specialRedPackAuditIds = await _specialRedPackAuditRepository.Queryable()
  346. .LeftJoin<Order>((special, order) => special.OrderId == order.Id)
  347. .LeftJoin<RedPackAudit>((special, order, audit) => order.Id == audit.OrderId)
  348. .Where((special, order, audit) => ids.Contains(audit.Id))
  349. .Select((special, order, audit) => special.Id).ToListAsync();
  350. var has = await _supplementRecordRepository.Queryable()
  351. .Where(m => specialRedPackAuditIds.Contains(m.RedPackAuditId))
  352. .AnyAsync();
  353. if (has) throw UserFriendlyException.SameMessage("该工单已发放红包,不能撤销审批");
  354. await _specialRedPackAuditRepository.Removeable()
  355. .Where(m => specialRedPackAuditIds.Contains(m.Id))
  356. .ExecuteCommandAsync();
  357. }
  358. /// <summary>
  359. /// 红包审核集合
  360. /// </summary>
  361. /// <param name="dto"></param>
  362. /// <returns></returns>
  363. [ExportExcel("市民红包审批")]
  364. public ISugarQueryable<SnapshotOrderAuditItemsOutDto> GetRedPackAuditItems(SnapshotOrderAuditItemsInDto dto)
  365. {
  366. ERedPackAuditStatus? status = null;
  367. if (dto.Status != -1 && Enum.TryParse<ERedPackAuditStatus>(dto.Status.ToString(), out var statusParse))
  368. {
  369. status = statusParse;
  370. }
  371. var query = _redPackAuditRepository.Queryable(includeDeleted: true)
  372. .LeftJoin<Order>((redPackAudit, order) => redPackAudit.OrderId == order.Id)
  373. .LeftJoin<OrderSnapshot>((redPackAudit, order, snapshot) => redPackAudit.OrderId == snapshot.Id)
  374. .LeftJoin<RedPackRecord>((redPackAudit, order, snapshot, record) => redPackAudit.Id == record.OrderId)
  375. .LeftJoin<Industry>((redPackAudit, order, snapshot, record, industry) => snapshot.IndustryId == industry.Id)
  376. .LeftJoin<IndustryCase>((redPackAudit, order, snapshot, record, industry, industryCase) => snapshot.IndustryCase == industryCase.Id)
  377. .Where((redPackAudit, order, snapshot, record, industry) => (order.HotspotId == null || order.HotspotId.StartsWith("18") == false) && order.Status >= EOrderStatus.Filed)
  378. .WhereIF(dto.No.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.No.Contains(dto.No))
  379. .WhereIF(dto.Title.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.Title.Contains(dto.Title))
  380. .WhereIF(dto.FromPhone.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => order.FromPhone.Contains(dto.FromPhone))
  381. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, (redPackAudit, order, snapshot, record, industry) => order.CreationTime <= dto.EndCreationTime && order.CreationTime >= dto.BeginCreationTime)
  382. .WhereIF(dto.BeginFiledTime.HasValue && dto.EndFiledTime.HasValue, (redPackAudit, order, snapshot, record, industry) => order.FiledTime <= dto.EndFiledTime && order.FiledTime >= dto.BeginFiledTime)
  383. .WhereIF(dto.IsDeal.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsDeal == dto.IsDeal)
  384. .WhereIF(dto.IsTruth.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsTruth == dto.IsTruth)
  385. .WhereIF(dto.IsTruthDepartment.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsTruthDepartment == dto.IsTruthDepartment)
  386. .WhereIF(dto.BeginAuditTime.HasValue && dto.EndAuditTime.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.AuditTime <= dto.EndAuditTime && redPackAudit.AuditTime >= dto.BeginAuditTime)
  387. .WhereIF(dto.IsIssued.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.IsSend == dto.IsIssued)
  388. .WhereIF(dto.IndustryId.NotNullOrEmpty(), (redPackAudit, order, snapshot, record, industry) => snapshot.IndustryId == dto.IndustryId)
  389. .WhereIF(dto.ConfigAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => industry.CitizenReadPackAmount == dto.ConfigAmount)
  390. .WhereIF(dto.AcutalAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.AcutalAmount == dto.AcutalAmount)
  391. .WhereIF(dto.ApprovedAmount.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.ApprovedAmount == dto.ApprovedAmount)
  392. .WhereIF(dto.IsDanger.HasValue, (redPackAudit, order, snapshot, record, industry) => snapshot.IsDanger == dto.IsDanger)
  393. .WhereIF(status.HasValue, (redPackAudit, order, snapshot, record, industry) => redPackAudit.Status == status)
  394. .OrderByDescending((redPackAudit, order, snapshot, record, industry) => redPackAudit.CreationTime)
  395. .Select((redPackAudit, order, snapshot, record, industry, industryCase) => new SnapshotOrderAuditItemsOutDto
  396. {
  397. Id = redPackAudit.Id,
  398. RedPackAuditId = redPackAudit.Id,
  399. OrderId = order.Id,
  400. No = order.No,
  401. Title = order.Title,
  402. IndustryName = industry.Name,
  403. IndustryCaseId = snapshot.IndustryCase,
  404. IndustryCase = industryCase.Name,
  405. IndustryId = industry.Id,
  406. SourceChannel = order.SourceChannel,
  407. SourceChannelCode = order.SourceChannelCode,
  408. Status = order.Status,
  409. IsDanger = snapshot.IsDanger,
  410. FromPhone = order.FromPhone,
  411. FromName = order.FromName,
  412. AuditTime = redPackAudit.AuditTime,
  413. ApprovedAmount = redPackAudit.ApprovedAmount,
  414. AcutalAmount = redPackAudit.AcutalAmount,
  415. IsIssued = redPackAudit.IsSend,
  416. RecordRemark = record.Remark,
  417. County = order.County,
  418. // IsRectify = s.IsRepetition
  419. IsDeal = snapshot.IsDeal,
  420. NetworkENumber = snapshot.NetworkENumber,
  421. IsTruth = snapshot.IsTruth,
  422. IsTruthDepartment = snapshot.IsTruthDepartment,
  423. IsRepetition = snapshot.IsRepetition,
  424. CreationTime = order.CreationTime,
  425. OrgLevelOneCode = order.OrgLevelOneCode,
  426. OrgLevelOneName = order.OrgLevelOneName,
  427. AuditId = redPackAudit.AuditId,
  428. AuditName = redPackAudit.AuditName,
  429. AuditOrgId = redPackAudit.AuditOrgId,
  430. AuditOrgName = redPackAudit.AuditOrgName,
  431. AuditRemark = redPackAudit.AuditRemark,
  432. BankCardNo = record.BankCardNo,
  433. OpenBank = record.OpenBank,
  434. AwardName = record.Name,
  435. AuditStatus = redPackAudit.Status,
  436. }, true);
  437. return query;
  438. }
  439. /// <summary>
  440. /// 网格员审核集合
  441. /// </summary>
  442. /// <param name="dto"></param>
  443. /// <returns></returns>
  444. [ExportExcel("网格员红包审批")]
  445. public ISugarQueryable<SnapshotOrderGuiderAuditItemsOutDto> GetRedPackGuiderAuditItems(SnapshotOrderGuiderAuditItemsInDto dto)
  446. {
  447. var areaCode = _sessionContext.OrgAreaCode;
  448. if (_sessionContext.OrgIsCenter)
  449. {
  450. areaCode = null;
  451. }
  452. ERedPackAuditStatus? status = null;
  453. if (dto.Status != -1 && Enum.TryParse<ERedPackAuditStatus>(dto.Status.ToString(), out var statusParse))
  454. {
  455. status = statusParse;
  456. }
  457. var query = _redPackGuiderAuditRepository.Queryable(includeDeleted: true)
  458. .LeftJoin<Order>((redPackAudit, order) => redPackAudit.OrderId == order.Id)
  459. .LeftJoin<OrderSnapshot>((redPackAudit, order, snapshot) => redPackAudit.OrderId == snapshot.Id)
  460. .LeftJoin<Industry>((redPackAudit, order, snapshot, industry) => snapshot.IndustryId == industry.Id)
  461. .Where((redPackAudit, order, snapshot, industry) => order.Status >= EOrderStatus.Filed)
  462. .WhereIF(dto.No.NotNullOrEmpty(), (redPackAudit, order, snapshot, industry) => order.No.Contains(dto.No))
  463. .WhereIF(dto.Title.NotNullOrEmpty(), (redPackAudit, order, snapshot, industry) => order.Title.Contains(dto.Title))
  464. .WhereIF(areaCode.NotNullOrEmpty(), (redPackAudit, order, snapshot, industry) => order.AreaCode == areaCode);
  465. var orgName = _sessionContext.OrgName ?? string.Empty;
  466. if (orgName.Contains("应急管理局") && status != null)
  467. query = query.Where((redPackAudit, order, snapshot, industry) => redPackAudit.LevelOneStatus == ERedPackAuditStatus.Agree && redPackAudit.LevelTwoStatus == status);
  468. else if (status != null)
  469. query = query.Where((redPackAudit, order, snapshot, industry) => redPackAudit.LevelOneStatus == status);
  470. query = query.OrderByDescending(redPackAudit => redPackAudit.CreationTime);
  471. return query.Select((redPackAudit, order, snapshot, industry) => new SnapshotOrderGuiderAuditItemsOutDto
  472. {
  473. Id = redPackAudit.Id,
  474. RedPackAuditId = redPackAudit.Id,
  475. OrderId = order.Id,
  476. No = order.No,
  477. Title = order.Title,
  478. SourceChannel = order.SourceChannel,
  479. SourceChannelCode = order.SourceChannelCode,
  480. Status = order.Status,
  481. FromPhone = order.FromPhone,
  482. FromName = order.FromName,
  483. ApprovedAmount = redPackAudit.ApprovedAmount,
  484. IsIssued = redPackAudit.IsIssued,
  485. County = order.County,
  486. IsDeal = snapshot.IsDeal,
  487. NetworkENumber = snapshot.NetworkENumber,
  488. IsTruth = snapshot.IsTruth,
  489. IsTruthDepartment = snapshot.IsTruthDepartment,
  490. IsRepetition = snapshot.IsRepetition,
  491. IsRectify = snapshot.IsRectifyDepartment,
  492. CreationTime = order.CreationTime,
  493. LevelOneAuditName = redPackAudit.LevelOneAuditName,
  494. LevelOneAuditOrgName = redPackAudit.LevelOneAuditOrgName,
  495. LevelOneAuditRemark = redPackAudit.LevelOneAuditRemark,
  496. LevelOneAuditTime = redPackAudit.LevelOneAuditTime,
  497. NetworkRemark = snapshot.NetworkRemark,
  498. LevelOneStatus = redPackAudit.LevelOneStatus,
  499. LevelTwoStatus = redPackAudit.LevelTwoStatus,
  500. LevelTwoAuditTime = redPackAudit.LevelTwoAuditTime,
  501. LevelTwoAuditRemark = redPackAudit.LevelTwoAuditRemark,
  502. }, true);
  503. }
  504. /// <summary>
  505. /// 获取审核短信模板
  506. /// </summary>
  507. /// <param name="dto"></param>
  508. /// <returns></returns>
  509. public async Task<IList<GetRedPackAuditSMSTemplateOutDto>> GetRedPackAuditSMSTemplateAsync(GetRedPackAuditSMSTemplateInDto dto)
  510. {
  511. var industryId = await _orderSnapshotRepository.Queryable()
  512. .Where(m => m.Id == dto.OrderId)
  513. .Select(m => m.IndustryId).FirstAsync();
  514. var items = await _snapshotSMSTemplateRepository.Queryable(includeDeleted: true)
  515. .Where(sms => (sms.IsPublic == true || sms.IndustryId == industryId)
  516. && sms.Status == dto.Status && sms.IsEnable == true && sms.IsDeleted == false)
  517. .Select(sms => new GetRedPackAuditSMSTemplateOutDto
  518. {
  519. Id = sms.Id,
  520. Content = sms.Content
  521. })
  522. .GroupBy(sms => new { sms.Id, sms.Content })
  523. .ToListAsync();
  524. return items;
  525. }
  526. /// <summary>
  527. /// 审核添加备注
  528. /// </summary>
  529. /// <param name="dto"></param>
  530. /// <returns></returns>
  531. public async Task UpdateRedPackAuditRemarkAsync(UpdateRedPackAuditRemarkInDto dto)
  532. {
  533. var audit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  534. audit.AcutalAmount = dto.AcutalAmount;
  535. audit.IsSend = dto.IsSend;
  536. audit.SendRemarks = dto.SendRemarks;
  537. await _redPackRecordRepository.Queryable()
  538. .Where(m => m.RedPackAuditId == audit.Id)
  539. .FirstAsync()
  540. .Then(async (record) =>
  541. {
  542. if (dto.FailCase != null)
  543. {
  544. record.FailCase = dto.FailCase.Value;
  545. record.DistributionState = EReadPackSendStatus.Fail;
  546. if (record.FailCase == ERedPackPickupFailCase.Excuse)
  547. record.PickupStatus = ERedPackPickupStatus.Excuse;
  548. }
  549. if (dto.IsSend)
  550. record.DistributionState = EReadPackSendStatus.Successful;
  551. await _redPackRecordRepository.UpdateAsync(record);
  552. });
  553. await _redPackAuditRepository.UpdateAsync(audit);
  554. }
  555. /// <summary>
  556. /// 添加补充发放信息
  557. /// </summary>
  558. /// <param name="dto"></param>
  559. /// <returns></returns>
  560. public async Task UpdateRedPackRecordAsync(UpdateRedPackRecordInDto dto)
  561. {
  562. await _redPackAuditRepository.Queryable().Where(m => m.Id == dto.RedPackAuditId)
  563. .Select(m => new { m.Id, m.OrderId})
  564. .FirstAsync()
  565. .Then(async audit =>
  566. {
  567. var orderNo = await _orderRepository.Queryable().Where(m => m.Id == audit.OrderId).Select(m => m.No).FirstAsync();
  568. var entity = dto.Adapt<SupplementRecord>();
  569. var industryName = await _orderSnapshotRepository.Queryable()
  570. .Where(m => m.Id == audit.OrderId)
  571. .Select(m => new { m.IndustryName, m.IndustryId })
  572. .FirstAsync();
  573. entity.OrderId = audit.OrderId;
  574. entity.RedPackAuditId = audit.Id;
  575. entity.No = orderNo;
  576. entity.IndustryName = industryName.IndustryName;
  577. entity.IndustryId = industryName.IndustryId;
  578. entity.ReplenishRemark = dto.ReplenishRemark;
  579. await _supplementRecordRepository.AddAsync(entity);
  580. if (dto.IsSendSMS)
  581. {
  582. // TODO: 发送短信
  583. }
  584. });
  585. }
  586. /// <summary>
  587. /// 添加补充发放信息(特殊红包)
  588. /// </summary>
  589. /// <param name="dto"></param>
  590. /// <returns></returns>
  591. public async Task UpdateRedPackSpecialRecordAsync(UpdateRedPackRecordInDto dto)
  592. {
  593. await _specialRedPackAuditRepository.Queryable()
  594. .Where(m => m.Id == dto.RedPackAuditId)
  595. .Select(m => new { m.Id, m.OrderId })
  596. .FirstAsync()
  597. .Then(async audit =>
  598. {
  599. var orderNo = await _orderRepository.Queryable().Where(m => m.Id == audit.OrderId).Select(m => m.No).FirstAsync();
  600. var auditTypeId = _systemDic.SnapshotRedPackSpecialType.FirstOrDefault(m => m.DicDataName.StartsWith(dto.AuditType))?.DicDataValue;
  601. var entity = dto.Adapt<SupplementRecord>();
  602. var industryName = await _orderSnapshotRepository.Queryable()
  603. .Where(m => m.Id == audit.OrderId)
  604. .Select(m => new { m.IndustryName, m.IndustryId })
  605. .FirstAsync();
  606. entity.OrderId = audit.OrderId;
  607. entity.RedPackAuditId = audit.Id;
  608. entity.No = orderNo;
  609. entity.IndustryName = industryName.IndustryName;
  610. entity.IndustryId = industryName.IndustryId;
  611. entity.ReplenishRemark = dto.ReplenishRemark;
  612. entity.AuditType = dto.AuditType;
  613. entity.AuditTypeCode = auditTypeId;
  614. await _supplementRecordRepository.AddAsync(entity);
  615. if (dto.IsSendSMS)
  616. {
  617. // TODO: 发送短信
  618. }
  619. });
  620. }
  621. #region 红包发放记录
  622. /// <summary>
  623. /// 市民红包发放记录
  624. /// </summary>
  625. /// <param name="dto"></param>
  626. /// <returns></returns>
  627. [ExportExcel("市民红包发放记录")]
  628. public ISugarQueryable<SnapshotRedPackRecordItemsOutDto> GetRedPackRecordItems(SnapshotRedPackRecordItemsInDto dto)
  629. {
  630. var query = _redPackRecordRepository.Queryable()
  631. .Where(m => m.PeopleType == EReadPackUserType.Citizen)
  632. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
  633. .WhereIF(dto.No.NotNullOrEmpty(), m => m.No.Contains(dto.No))
  634. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
  635. .Select<SnapshotRedPackRecordItemsOutDto>();
  636. if (dto.Status == 3)
  637. query = query.Where(m => m.PickupStatus == ERedPackPickupStatus.Excuse);
  638. else
  639. {
  640. if (Enum.TryParse(dto.Status.ToString(), out EReadPackSendStatus status))
  641. query = query.Where(m => m.DistributionState == status);
  642. }
  643. return query;
  644. }
  645. /// <summary>
  646. /// 获取特提参数
  647. /// </summary>
  648. /// <param name="id"></param>
  649. /// <returns></returns>
  650. public async Task<GetAuditBackBaseDataOutDto> GetAuditBackBaseDataAsync(string id)
  651. {
  652. var order = await _orderRepository.Queryable()
  653. .Where(m => m.Id == id)
  654. .Select<GetAuditBackBaseDataOutDto>()
  655. .FirstAsync()
  656. ?? throw UserFriendlyException.SameMessage("工单不存在");
  657. order.SpecialNum = await _orderSpecialRepository.CountAsync(x => x.OrderId == id);
  658. return order;
  659. }
  660. [ExportExcel("网格员红包发放记录")]
  661. public ISugarQueryable<SnapshotRedPackRecordItemsGuiderOutDto> GetRedPackRecordGuiderItems(SnapshotRedPackRecordItemsGuiderInDto dto)
  662. {
  663. var query = _redPackRecordRepository.Queryable()
  664. .Where(m => m.PeopleType == EReadPackUserType.Guider)
  665. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
  666. .WhereIF(dto.No.NotNullOrEmpty(), m => m.No.Contains(dto.No))
  667. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
  668. .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name))
  669. .OrderByDescending(m => m.CreationTime)
  670. .Select<SnapshotRedPackRecordItemsGuiderOutDto>();
  671. if (dto.Status == 3)
  672. query = query.Where(m => m.PickupStatus == ERedPackPickupStatus.Excuse);
  673. else
  674. {
  675. if (Enum.TryParse(dto.Status.ToString(), out EReadPackSendStatus status))
  676. query = query.Where(m => m.DistributionState == status);
  677. }
  678. return query;
  679. }
  680. [ExportExcel("红包发放明细")]
  681. public ISugarQueryable<SnapshotRedPackRecordSendOutDto> GetRedPackRecordDetail(SnapshotRedPackRecordSendInDto dto)
  682. {
  683. var query = _redPackRecordRepository.Queryable()
  684. .LeftJoin<OrderSnapshot>((m, snapshot) => m.OrderId == snapshot.Id)
  685. .LeftJoin<Order>((m, snapshot, order) => m.OrderId == order.Id)
  686. .Where(m => m.DistributionState != EReadPackSendStatus.Unsend)
  687. .WhereIF(dto.Status == 1, m => m.PickupStatus == ERedPackPickupStatus.Received)
  688. .WhereIF(dto.Status == 2, m => m.PickupStatus == ERedPackPickupStatus.Back)
  689. .WhereIF(dto.Status == 3, m => m.DistributionState == EReadPackSendStatus.Fail)
  690. .WhereIF(dto.Status == 4, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
  691. .WhereIF(dto.IndustryId.NotNullOrEmpty(), (m, snapshot) => snapshot.IndustryId == dto.IndustryId)
  692. .WhereIF(dto.No.NotNullOrEmpty(), order => order.No.Contains(dto.No))
  693. .WhereIF(dto.UserType.HasValue, m => m.PeopleType == dto.UserType)
  694. .WhereIF(dto.OpenId.NotNullOrEmpty(), m => m.WXOpenId == dto.OpenId)
  695. .WhereIF(dto.SendStatus.HasValue, m => m.DistributionState == dto.SendStatus)
  696. .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == true, m => m.PickupStatus == ERedPackPickupStatus.Received)
  697. .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == false, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
  698. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
  699. .Select((m, snapshot, order) => new SnapshotRedPackRecordSendOutDto
  700. {
  701. OrderId = m.OrderId,
  702. UserType = m.PeopleType,
  703. IndustryName = snapshot.IndustryName,
  704. WXOpenId = m.WXOpenId,
  705. MerchantCode = m.MerchantCode
  706. }, true);
  707. return query;
  708. }
  709. /// <summary>
  710. /// 补充发放集合
  711. /// </summary>
  712. /// <param name="dto"></param>
  713. /// <returns></returns>
  714. [ExportExcel("补充发放")]
  715. public ISugarQueryable<SnapshotRedPackRecordSupplementItemsOutDto> GetRedPackRecordSupplementItems(SnapshotRedPackRecordSupplementItemsInDto dto)
  716. {
  717. var query = _supplementRecordRepository.Queryable()
  718. .LeftJoin<Order>((supp, order) => supp.OrderId == order.Id)
  719. .WhereIF(dto.No.NotNullOrEmpty(), (supp, order) => order.No.Contains(dto.No))
  720. .WhereIF(dto.FromPhone.NotNullOrEmpty(), (supp, order) => order.FromPhone.Contains(dto.FromPhone))
  721. .WhereIF(dto.Title.NotNullOrEmpty(), (supp, order) => order.Title.Contains(dto.Title))
  722. .WhereIF(dto.IndustryId.NotNullOrEmpty(), (supp, order) => supp.IndustryId == dto.IndustryId)
  723. .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, (supp, order) => supp.CreationTime >= dto.BeginCreationTime && supp.CreationTime <= dto.EndCreationTime)
  724. .Select((supp, order) => new SnapshotRedPackRecordSupplementItemsOutDto
  725. {
  726. Remark = supp.ReplenishRemark
  727. }, true);
  728. return query;
  729. }
  730. public async Task AuditRedPackSpecialAuditAsync(UpdateRedPackSpecialAuditInDto dto)
  731. {
  732. var audit = await _redPackAuditRepository.GetAsync(dto.RedPackAuditId) ?? throw UserFriendlyException.SameMessage("审核记录不存在");
  733. if (_specialRedPackAuditRepository.ExistByOrderId(audit.OrderId)) throw UserFriendlyException.SameMessage("已审核, 不可重复审核");
  734. var specialAudit = audit.Adapt<SpecialRedPackAudit>();
  735. if (dto.AuditTypeId.NotNullOrEmpty())
  736. {
  737. var specialType = _systemDic.SnapshotRedPackSpecialType.FirstOrDefault(m => m.Id == dto.AuditTypeId);
  738. if (specialType != null)
  739. {
  740. specialAudit.AuditType = specialType.DicDataName.Split('|')[0];
  741. specialAudit.AuditTypeCode = specialType.DicDataValue;
  742. }
  743. }
  744. specialAudit.Status = dto.Status;
  745. specialAudit.ApprovedAmount = dto.ApprovedAmount;
  746. specialAudit.AuditId = _sessionContext.UserId;
  747. specialAudit.AuditName = _sessionContext.UserName;
  748. specialAudit.AuditOrgId = _sessionContext.OrgId;
  749. specialAudit.AuditOrgName = _sessionContext.OrgName;
  750. await _specialRedPackAuditRepository.AddAsync(specialAudit);
  751. }
  752. public async Task<SnapshotOrderAuditSpecialDetailOutDto> GetRedPackSpecialAuditBaseDataAsync(string id)
  753. {
  754. var outDto = new SnapshotOrderAuditSpecialDetailOutDto();
  755. var order = await _orderRepository.GetAsync(id) ?? throw new UserFriendlyException("工单不存在");
  756. outDto.Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>();
  757. outDto.AuditType = _systemDic.SnapshotRedPackSpecialType.Adapt<List<SystemDicDataAmountOutDto>>();
  758. outDto.AuditComBox = EnumExts.GetDescriptions<ERedPackAuditStatus>().Where(m => m.Key != 0).ToList();
  759. var audit = await _redPackAuditRepository.GetAsync(m => m.OrderId == id);
  760. outDto.AuditDetail = audit.Adapt<SnapshotOrderAuditSpecialAuditDetailOutDto>();
  761. return outDto;
  762. }
  763. /// <summary>
  764. /// 获取补充发放记录基础数据
  765. /// </summary>
  766. /// <param name="v"></param>
  767. /// <param name="orderId"></param>
  768. /// <returns></returns>
  769. public async Task<GetRedPackRecordBaseDataOutDto> GetRedPackRecordBaseDataAsync(string orderId)
  770. {
  771. var snapshot = await _orderSnapshotRepository.Queryable()
  772. .Where(m => m.Id == orderId)
  773. .Select(m => new
  774. {
  775. m.Id,
  776. m.AwardBankCardNo,
  777. m.AwardOpenBank,
  778. m.AwardName,
  779. })
  780. .FirstAsync();
  781. var outDto = new GetRedPackRecordBaseDataOutDto();
  782. if (snapshot != null)
  783. {
  784. outDto.BankCardNo = snapshot.AwardBankCardNo;
  785. outDto.OpenBank = snapshot.AwardOpenBank;
  786. outDto.Name = snapshot.AwardName;
  787. }
  788. var audit = await _specialRedPackAuditRepository.Queryable().Where(m => m.OrderId == orderId).FirstAsync()
  789. ?? throw new UserFriendlyException("审核记录不存在");
  790. if (audit != null)
  791. {
  792. outDto.AuditType = audit.AuditType;
  793. outDto.AuditTypeCode = audit.AuditTypeCode;
  794. outDto.RedPackAuditId = audit.Id;
  795. outDto.Amount = audit.ApprovedAmount;
  796. }
  797. outDto.OrderId = orderId;
  798. outDto.ReplenishType = _systemDic.SnapshotReplenishType;
  799. return outDto;
  800. }
  801. #endregion
  802. }