using Aop.Api.Domain; using Furion; using Furion.DatabaseAccessor; using Furion.FriendlyException; using Furion.Schedule; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace FlexJobApi.Core.Jobs { public class RefreshEnterpriseWalletTransactionStatusJob( IRepository rep, IRepository repEnterpriseWallet, AlipayUtils alipayUtils ) : IJob { private readonly IRepository rep = rep; private readonly IRepository repEnterpriseWallet = repEnterpriseWallet; private readonly AlipayUtils alipayUtils = alipayUtils; public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) { var env = App.GetConfig("Environment"); if (env != "Local") { var entities = await rep.AsQueryable() .Where(it => it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.WaitPay || it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Dealing) .ToListAsync(); if (entities.IsNotNull()) { foreach (var entity in entities) { var response = alipayUtils.FundTransCommonQuery(new Aop.Api.Domain.AlipayFundTransCommonQueryModel { ProductCode = entity.ProductCode, BizScene = entity.BizScene, OutBizNo = entity.Code }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); entity.OrderId = response.OrderId; entity.InflowSettleSerialNo = response.InflowSettleSerialNo; entity.SettleSerialNo = response.SettleSerialNo; entity.ReceiverOpenId = response.ReceiverOpenId; entity.ReceiverUserId = response.ReceiverUserId; entity.PayFundOrderId = response.PayFundOrderId; entity.ArrivalTimeEnd = response.ArrivalTimeEnd.ToDateTime(); entity.OrderFee = response.OrderFee.ToDecimal(); entity.ErrorCode = response.ErrorCode; entity.FailReason = response.FailReason; entity.FailInstReason = response.FailInstReason; entity.FailInstName = response.FailInstName; entity.FailInstErrorCode = response.FailInstErrorCode; entity.SubStatus = response.SubStatus; entity.TransDate = response.PayDate.ToDateTime(); entity.Status = response.Status; entity.TransactionStatus = response.Status == "SUCCESS" ? EnumEnterpriseWalletTransactionStatus.Success : response.Status == "DEALING" ? EnumEnterpriseWalletTransactionStatus.Dealing : response.Status == "REFUND" ? EnumEnterpriseWalletTransactionStatus.Refund : response.Status == "FAIL" ? EnumEnterpriseWalletTransactionStatus.Fail : throw Oops.Oh(EnumErrorCodeType.s510, $"未识别的状态:{response.Status}"); await rep.UpdateAsync(entity); } var walletIds = entities .Where(it => it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Success) .Select(it => it.WalletId) .Distinct() .ToList(); if (walletIds.IsNotNull()) { var wallets = await repEnterpriseWallet.AsQueryable() .Where(it => walletIds.Contains(it.Id)) .ToListAsync(); foreach (var wallet in wallets) { var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel { AccountBookId = wallet.AccountBookId, SceneCode = "SATF_FUND_BOOK", MerchantUserId = wallet.Code, }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0; await repEnterpriseWallet.UpdateAsync(wallet); } } } } } } }