RedPackApplication.cs 47 KB

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