diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/TransactionController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/TransactionController.php index 9864c9e..173683f 100644 --- a/Laravel/app/Http/Controllers/API/Admin/YeWu/TransactionController.php +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/TransactionController.php @@ -151,30 +151,32 @@ class TransactionController throw new \Exception('该用户昨日日切异常,无法审核'); } + $amount = (string)$transaction->amount; + $balance = (string)$memberInfo->balance; // 3. 处理审核结果 if ($status === 3) { // 审核通过 - $amount = (string)$transaction->amount; - $balance = (string)$memberInfo->balance; + if (!is_numeric($amount) || !is_numeric($balance)) { throw new \Exception('余额或交易金额格式错误'); } if ($TransactionsType === 3) { - // 提现:余额减少 - $new_balance = bcsub($balance, $amount, 2); - // 可选:检查余额是否足够 - if (bccomp($new_balance, '0', 2) < 0) { - throw new \Exception('用户余额不足'); - } + // 提现:余额不再减少,申请提现时已经减少 + $new_balance =$balance; +// $new_balance = bcsub($balance, $amount, 2); +// // 可选:检查余额是否足够 +// if (bccomp($new_balance, '0', 2) < 0) { +// throw new \Exception('用户余额不足'); +// } //累积提现金额 $withdraw_amount = (string)$memberInfo->withdraw_amount; $new_withdraw_amount = bcadd($withdraw_amount, $amount, 2); $up_member_date = [ 'withdraw_amount' => $new_withdraw_amount, - 'balance' => $new_balance, + // 'balance' => $new_balance,不再减少,申请提现时已经减少 ]; } else { // 充值/利息:余额增加 @@ -205,6 +207,25 @@ class TransactionController 'verify_userid' => $userid, 'note' => $Note, ]; + if ($TransactionsType === 3) {//提现拒绝 + $new_balance = bcadd($balance, $amount, 2); + $interest_total = (string)$memberInfo->interest_balance; + $new_interest_balance = bcadd($interest_total, $amount, 2); + $up_member_date = [ + 'balance' => $new_balance, + ]; + + if($transaction->is_interest_eligible===1){//已经日切,恢复余额,恢复利息总额 + $up_member_date = [ + 'balance' => $new_balance, + 'interest_balance' => $new_interest_balance + ]; + + } + DB::table('members') + ->where('id', $transaction->member_id) + ->update($up_member_date); + } } // 更新交易状态 diff --git a/Laravel/app/Http/Controllers/API/H5/TransactionController.php b/Laravel/app/Http/Controllers/API/H5/TransactionController.php index f81b85b..33bb26e 100644 --- a/Laravel/app/Http/Controllers/API/H5/TransactionController.php +++ b/Laravel/app/Http/Controllers/API/H5/TransactionController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API\H5; +use App\Http\Middleware\Log; use App\Services\TencentSmsApiService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -215,19 +216,21 @@ class TransactionController public function Withdraw(Request $request) { $systemStatus = \Yz::systemStatusCheck(); - if(!$systemStatus['status']){ + if (!$systemStatus['status']) { return \Yz::echoError1($systemStatus['msg']); } $dayCutCheck = \Yz::DayCutCheck(); - if(!$dayCutCheck['status']){ + if (!$dayCutCheck['status']) { return \Yz::echoError1($dayCutCheck['msg']); } - $userid = $request->get('userid');//中间件产生的参数 + + $userid = $request->get('userid'); // 中间件产生的参数 $amount = request('amount'); - if (empty($amount) || $amount < 0) { - return \Yz::echoError1('提现金额不能为0元'); + if (empty($amount) || $amount <= 0) { + return \Yz::echoError1('提现金额不能为0元或负数'); } + $memberInfo = DB::table('members')->where(['id' => $userid, 'is_del' => 0])->first(); if (!$memberInfo) { return \Yz::echoError1('用户不存在'); @@ -235,23 +238,55 @@ class TransactionController if ($memberInfo->balance < $amount) { return \Yz::echoError1('余额不足'); } - $insertData = [ - 'member_id' => $userid, - 'type' => 3, - 'amount' => $amount, - 'status' => 1, - 'source' => 'member', - 'operator_id' => $userid, - 'created_at' => date('Y-m-d H:i:s'), - ]; - $id = DB::table('transactions')->insertGetId($insertData); - if (!!$id) { - $config=DB::table('configs')->where(['label'=>'管理员手机号'])->first(); - $service = new TencentSmsApiService(); - $ss= $service->send($config->value,$this->templateId, [$memberInfo->name,"转出"]); - return \Yz::Return(true, '充值成功!', ['id' => $id]); - } else { - return \Yz::echoError1('提交失败'); + + DB::beginTransaction(); + try { + // 1. 扣减余额 + $newBalance = bcsub($memberInfo->balance, $amount, 2); + $updated = DB::table('members') + ->where(['id' => $userid]) + ->update(['balance' => $newBalance]); + + if (!$updated) { + throw new \Exception('更新余额失败'); + } + + // 2. 插入交易记录 + $insertData = [ + 'member_id' => $userid, + 'type' => 3, + 'amount' => $amount, + 'status' => 1, + 'source' => 'member', + 'operator_id' => $userid, + 'created_at' => now(), // 使用 now() 更规范 + ]; + $id = DB::table('transactions')->insertGetId($insertData); + + if (!$id) { + throw new \Exception('创建交易记录失败'); + } + + // 3. 提交事务(关键!) + DB::commit(); + + // 4. 事务已提交,安全地发送短信(即使短信失败,也不影响资金操作) + try { + $config = DB::table('configs')->where(['label' => '管理员手机号'])->first(); + if ($config) { + $service = new TencentSmsApiService(); + $service->send($config->value, $this->templateId, [$memberInfo->name, "转出"]); + } + } catch (\Exception $smsException) { + // 短信失败可记录日志,但不中断流程 + Log::warning('提现短信发送失败: ' . $smsException->getMessage()); + } + + return \Yz::Return(true, '提现成功!', ['id' => $id]); + + } catch (\Exception $e) { + DB::rollBack(); + return \Yz::echoError1($e->getMessage()); } } diff --git a/Laravel/app/Http/Controllers/TestController.php b/Laravel/app/Http/Controllers/TestController.php index 2894467..b89631f 100644 --- a/Laravel/app/Http/Controllers/TestController.php +++ b/Laravel/app/Http/Controllers/TestController.php @@ -8,6 +8,6 @@ use Illuminate\Support\Facades\DB; class TestController extends Controller { public function DBtest(){ - echo DB::table('users')->count(); + echo "66"; } } diff --git a/Laravel/app/Services/DayCutService.php b/Laravel/app/Services/DayCutService.php index d042b60..dd3c20e 100644 --- a/Laravel/app/Services/DayCutService.php +++ b/Laravel/app/Services/DayCutService.php @@ -99,16 +99,58 @@ class DayCutService return ['status'=>true,'msg'=>$msg]; } private static function processMemberDayCut($member, $Carbon_day, $daysToAdd, $cunkuan_rate, $day){ - $transactions = DB::table("transactions")->where([ //查找未计算利息的交易 - "member_id" => $member->id, - "is_del" => 0, - "status" => 3, - "is_interest_eligible" => 0 - ])->whereIn("type",[1,3])->orderBy("verify_time","asc")->get(); + // 查询1:已审核通过的交易(status=3)——包括充值(type=1)和提现(type=3) + $transactions1 = DB::table("transactions") + ->where("member_id", $member->id) + ->where("is_del", 0) + ->where("status", 3) + ->where("is_interest_eligible", 0) + ->whereIn("type", [1, 3]) + ->orderBy("verify_time", "asc") // 这里用 verify_time 排序没问题 + ->get(); + +// 查询2:提现申请(type=3, status=1)——因系统在申请时已扣款并需立即止息 + $transactions2 = DB::table("transactions") + ->where("member_id", $member->id) + ->where("is_del", 0) + ->where("status", 1) + ->where("type", 3) + ->where("is_interest_eligible", 0) + ->orderBy("created_at", "asc") // 👈 关键:这里按 created_at 排序! + ->get(); + +// 合并后统一按“实际生效时间”排序(需自定义) + $transactions = $transactions1->merge($transactions2); + +// 自定义排序:status=1 用 created_at,其他用 verify_time + $transactions = $transactions->sortBy(function ($tx) { + if ($tx->type == 3 && $tx->status == 1) { + return $tx->created_at; + } + return $tx->verify_time; + })->values(); + + $member_interest_balance = (string)$member->interest_balance;//用户表计息本金余额 foreach($transactions as $transaction){ - Log::info("处理交易 - 用户ID: {$member->id}, 交易ID: {$transaction->id}, 审核时间: {$transaction->verify_time}, 类型: {$transaction->type}"); - $shenHeDate_n = Carbon::parse($transaction->verify_time)->startOfDay()->addDays($daysToAdd); + if ($transaction->type == 3 && $transaction->status == 1) { + // 提现申请:用 created_at 作为起息/止息基准 + $baseTime = $transaction->created_at; + } else { + // 充值(type=1, status=3)或其他成功交易:用 verify_time + $baseTime = $transaction->verify_time; + } + if (empty($baseTime)) { + Log::warning("交易缺少生效时间,跳过处理", [ + 'member_id' => $member->id, + 'transaction_id' => $transaction->id, + 'type' => $transaction->type, + 'status' => $transaction->status, + ]); + continue; // 跳过这条异常数据 + } + Log::info("处理交易 - 用户ID: {$member->id}, 交易ID: {$transaction->id}, 生效时间: {$baseTime}, 类型: {$transaction->type}, 状态: {$transaction->status}"); + $shenHeDate_n = Carbon::parse($baseTime)->startOfDay()->addDays($daysToAdd); $trans_amount= (string)$transaction->amount; //本笔流水金额 if($transaction->type == 1){//充值