sunpengfei
6 天以前 8ffda541b48cbf619f8493196da4fb44d4f3ddc5
FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs
@@ -34,115 +34,116 @@
        [UnitOfWork(false)]
        public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
        {
            var now = DateTime.Now;
            var env = App.GetConfig<string>("Environment");
            var q = rep.AsQueryable()
                .Where(it => it.SettlementStatus == EnumTaskSettlementStatus.InProcess);
            var minTime = env == "Local"
                ? now.AddMinutes(-1)
                : env == "Test"
                ? now.AddMinutes(-5)
                : now.AddDays(-1);
            q = q.Where(it => it.SettlementStartTime.HasValue && it.SettlementStartTime < minTime);
            var tasks = await q.ToListAsync();
            var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId);
            var taskIds = tasks.DistinctSelect(it => it.Id);
            var taskUsers = await repTaskInfoUser
                .Where(it => taskIds.Contains(it.TaskInfoId) && it.SettlementStatus == EnumTaskSettlementStatus.InProcess)
                .ToListAsync();
            var wallets = await repEnterpriseWallet.AsQueryable()
                .Where(it => enterpriseIds.Contains(it.EnterpriseId) && it.Access == EnumEnterpriseWalletAccess.Alipay)
                .ToListAsync();
            foreach (var wallet in wallets)
            if (env != "Local")
            {
                var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
                var now = DateTime.Now;
                var q = rep.AsQueryable()
                    .Where(it => it.SettlementStatus == EnumTaskSettlementStatus.InProcess);
                var minTime = env == "Test"
                    ? now.AddMinutes(-5)
                    : now.AddDays(-1);
                q = q.Where(it => it.SettlementStartTime.HasValue && it.SettlementStartTime < minTime);
                var tasks = await q.ToListAsync();
                var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId);
                var taskIds = tasks.DistinctSelect(it => it.Id);
                var taskUsers = await repTaskInfoUser
                    .Where(it => taskIds.Contains(it.TaskInfoId) && it.SettlementStatus == EnumTaskSettlementStatus.InProcess)
                    .ToListAsync();
                var wallets = await repEnterpriseWallet.AsQueryable()
                    .Where(it => enterpriseIds.Contains(it.EnterpriseId) && it.Access == EnumEnterpriseWalletAccess.Alipay)
                    .ToListAsync();
                foreach (var wallet in wallets)
                {
                    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.UpdateNowAsync(wallet);
            }
            if (tasks.IsNotNull())
            {
                foreach (var task in tasks)
                {
                    var wallet = wallets.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId);
                    task.SettlementStatus = EnumTaskSettlementStatus.Completed;
                    task.SettlementTime = DateTime.Now;
                    await rep.UpdateNowAsync(task);
                    var users = taskUsers.Where(it => it.TaskInfoId == task.Id).ToList();
                    foreach (var user in users)
                    var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
                    {
                        user.SettlementStatus = EnumTaskSettlementStatus.Completed;
                        user.SettlementTime = DateTime.Now;
                        await repTaskInfoUser.UpdateNowAsync(user);
                        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.UpdateNowAsync(wallet);
                }
                if (tasks.IsNotNull())
                {
                    foreach (var task in tasks)
                    {
                        var wallet = wallets.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId);
                        task.SettlementStatus = EnumTaskSettlementStatus.Completed;
                        task.SettlementTime = DateTime.Now;
                        await rep.UpdateNowAsync(task);
                        var order = new EnterpriseWalletTransaction();
                        order.Type = EnumEnterpriseWalletTransactionType.Recharge;
                        order.WalletId = wallet.Id;
                        order.Amount = user.ActualSettlementAmount ?? 0;
                        order.Remark = user.SettlementRemark;
                        order.ProductCode = "SINGLE_TRANSFER_NO_PWD";
                        order.BizScene = "ENTRUST_TRANSFER";
                        order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit;
                        order.Balance = wallet.Balance;
                        await SetCode(order);
                        await repEnterpriseWalletTransaction.InsertNowAsync(order);
                        var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
                        var users = taskUsers.Where(it => it.TaskInfoId == task.Id).ToList();
                        foreach (var user in users)
                        {
                            OutBizNo = order.Code,
                            TransAmount = order.Amount.ToString(),
                            ProductCode = order.ProductCode,
                            BizScene = order.BizScene,
                            PayeeInfo = new Participant
                            user.SettlementStatus = EnumTaskSettlementStatus.Completed;
                            user.SettlementTime = DateTime.Now;
                            await repTaskInfoUser.UpdateNowAsync(user);
                            var order = new EnterpriseWalletTransaction();
                            order.Type = EnumEnterpriseWalletTransactionType.Recharge;
                            order.WalletId = wallet.Id;
                            order.Amount = user.ActualSettlementAmount ?? 0;
                            order.Remark = user.SettlementRemark;
                            order.ProductCode = "SINGLE_TRANSFER_NO_PWD";
                            order.BizScene = "ENTRUST_TRANSFER";
                            order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit;
                            order.Balance = wallet.Balance;
                            await SetCode(order);
                            await repEnterpriseWalletTransaction.InsertNowAsync(order);
                            var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
                            {
                                IdentityType = "ALIPAY_LOGON_ID",
                                Identity = user.ReceiveAccount,
                                Name = user.ReceiveName,
                            },
                            PayerInfo = new Participant
                            {
                                IdentityType = "ACCOUNT_BOOK_ID",
                                Identity = wallet.AccountBookId,
                                ExtInfo = new
                                OutBizNo = order.Code,
                                TransAmount = order.Amount.ToString(),
                                ProductCode = order.ProductCode,
                                BizScene = order.BizScene,
                                PayeeInfo = new Participant
                                {
                                    agreement_no = wallet.AgreementNo,
                                }.ToJson(),
                            },
                            OrderTitle = order.Remark,
                            Remark = order.Remark,
                            BusinessParams = new
                                    IdentityType = "ALIPAY_LOGON_ID",
                                    Identity = user.ReceiveAccount,
                                    Name = user.ReceiveName,
                                },
                                PayerInfo = new Participant
                                {
                                    IdentityType = "ACCOUNT_BOOK_ID",
                                    Identity = wallet.AccountBookId,
                                    ExtInfo = new
                                    {
                                        agreement_no = wallet.AgreementNo,
                                    }.ToJson(),
                                },
                                OrderTitle = order.Remark,
                                Remark = order.Remark,
                                BusinessParams = new
                                {
                                    withdraw_timeliness = "T0"
                                }.ToJson()
                            }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
                            if (response.IsError)
                            {
                                withdraw_timeliness = "T0"
                            }.ToJson()
                        }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
                        if (response.IsError)
                        {
                            order.ErrorCode = response.Code;
                            order.FailReason = response.SubMsg ?? response.Msg;
                        }
                        else
                        {
                            order.OrderId = response.OrderId;
                            order.PayFundOrderId = response.PayFundOrderId;
                            order.SettleSerialNo = response.SettleSerialNo;
                            order.TransDate = response.TransDate.ToDateTime();
                            order.Link = response.Link;
                            order.Status = response.Status;
                            order.SubStatus = response.SubStatus;
                            order.TransactionStatus = response.Status == "SUCCESS"
                                ? EnumEnterpriseWalletTransactionStatus.Success
                                : response.Status == "DEALING"
                                ? EnumEnterpriseWalletTransactionStatus.Dealing
                                : response.Status == "REFUND"
                                ? EnumEnterpriseWalletTransactionStatus.Refund
                                : EnumEnterpriseWalletTransactionStatus.Fail;
                            await repEnterpriseWalletTransaction.UpdateNowAsync(order);
                                order.ErrorCode = response.Code;
                                order.FailReason = response.SubMsg ?? response.Msg;
                            }
                            else
                            {
                                order.OrderId = response.OrderId;
                                order.PayFundOrderId = response.PayFundOrderId;
                                order.SettleSerialNo = response.SettleSerialNo;
                                order.TransDate = response.TransDate.ToDateTime();
                                order.Link = response.Link;
                                order.Status = response.Status;
                                order.SubStatus = response.SubStatus;
                                order.TransactionStatus = response.Status == "SUCCESS"
                                    ? EnumEnterpriseWalletTransactionStatus.Success
                                    : response.Status == "DEALING"
                                    ? EnumEnterpriseWalletTransactionStatus.Dealing
                                    : response.Status == "REFUND"
                                    ? EnumEnterpriseWalletTransactionStatus.Refund
                                    : EnumEnterpriseWalletTransactionStatus.Fail;
                                await repEnterpriseWalletTransaction.UpdateNowAsync(order);
                            }
                        }
                    }
                }