RedPackApplication.cs 40 KB

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