Browse Source

会员充值

gorden 7 months ago
parent
commit
bfeb5b8e48

+ 1 - 0
app/admin/controller/finance/WithdrawalListController.php

@@ -173,6 +173,7 @@ class WithdrawalListController extends Curd
                 $account->member_account_expend = $account->member_account_expend + $withdraw->member_account_list_amount;
                 $account->save();
             }
+            $withdraw->member_account_list_outed = 'Y';
             $withdraw->save();
 
             _syslog('提现', '修改状态成功');

+ 47 - 9
app/admin/controller/member/MemberController.php

@@ -19,6 +19,7 @@ use app\model\OrderSheet;
 use app\model\PayDetail;
 use support\Db;
 use support\exception\BusinessException;
+use support\Log;
 use support\Request;
 use Tinywan\Jwt\JwtToken;
 
@@ -1081,29 +1082,66 @@ class MemberController
 //        ];
 
         // 产生退款记录
-        $this->refundOrder($memberId, $returnApplayData);
+//        $this->refundOrder($memberId, $returnApplayData);
 
         return json_success('success', $data);
     }
 
-    public function refundOrder($memberId, $data)
+    public function refundOrder(Request $request)
     {
+        $params = $request->post();
+        Db::beginTransaction();
         try {
-            OrderReturn::where('join_return_member_id', $memberId)
+            // 查出所有的充值订单
+            $orders = Order::where('join_order_member_id', $params['member_id'])
+                ->where('order_classify', 'RECHARGE')
+                ->where('order_is_complete', 'Y')
+                ->get()
+                ->toArray();
+            $orderIds = array_column($orders, 'order_id');
+
+            // 订单改为退款订单
+            Order::whereIn('order_id', $orderIds)->update([
+                'order_is_complete' => 'R'
+            ]);
+
+            OrderReturn::where('join_return_member_id', $params['member_id'])
                 ->where('order_return_status', '<>', 'DONE')
-                ->where('order_return_category', '会员权益退款')
+                ->where('order_return_category', '会员退款')
                 ->delete();
+
+            $returnApplyJson = [
+                'reason' => '会员退款',
+                'order_id' => $orderIds,
+                'classify' => 'ROLE_REFUND',
+                'username' => $params['username'],
+                'mobile' => $params['mobile'],
+                'surplus' => $params['surplus'],
+                'added' => $params['added'],
+                'bank_name' => $params['bank_name'],
+                'bank_acount' => $params['bank_acount'],
+                'bank_cardno' => $params['bank_cardno']
+            ];
+            // 退款记录
             OrderReturn::insert([
                 'join_order_return_user_id' => JwtToken::getCurrentId(),
-                'join_return_member_id' => $memberId,
-                'join_return_order_id' => 'ROLE_REFUND',
-                'order_return_status' => 'DOING',
-                'order_return_category' => '会员权益退款',
+                'join_return_member_id' => $params['member_id'],
+                'join_return_order_id' => $orderIds[0],
+                'order_return_status' => 'PENDING',
+                'order_return_category' => '会员退款',
                 'order_return_apply_datetime' => date('Y-m-d H:i:s'),
-                'order_return_apply_json' => json_encode($data),
+                'order_return_apply_json' => json_encode($returnApplyJson),
+                'order_return_remark' => $params['remark'] ?? '',
                 'order_return_addtimes' => time()
             ]);
+
+            Db::commit();
+
+            return json_success("success");
         } catch (\Exception $e) {
+            Db::rollBack();
+            Log::error("创建退款记录失败:" . $e->getMessage());
+
             return json_fail("创建退款记录失败");
         }
     }

+ 12 - 4
app/admin/controller/order/RechargeController.php

@@ -217,6 +217,14 @@ class RechargeController extends Curd
                     throw new BusinessException('密码错误,请重新输入');
                 }
             }
+            if (!empty($params['dept_id'])) {
+                $dept = SysDept::where('dept_id', $params['dept_id'])->first();
+                if (!$dept) {
+                    throw new BusinessException("充值场所不存在");
+                }
+                $params['dept_name'] = $dept->dept_name;
+                $orderExtendJson = ['dept_id' => $params['dept_id'], 'dept_name' => $params['dept_name']];
+            }
             // 下单账户
             if (empty($params['join_order_member_id']) && !empty($params['mobile'])) {
                 if (Member::where('member_mobile', $params['mobile'])->exists()) {
@@ -1074,10 +1082,10 @@ class RechargeController extends Curd
             $payStatus = 'N';
             $payAmount = 0;
             if (in_array('WXPAY', $payDetailType)) {
-//                $result = Pay::wechat(config('payment.wxpay'))->find($groupId, 'pos');
-//                $result = json_decode(json_encode($result), true);
-                $result = '{"return_code":"SUCCESS","return_msg":"OK","result_code":"SUCCESS","mch_id":"1680393367","appid":"wxc6274da7198e3eb4","openid":"o3JAn6Ii_bAlxS-jbNEC4WnPhdwM","is_subscribe":"N","trade_type":"MICROPAY","trade_state":"SUCCESS","bank_type":"OTHERS","total_fee":"50","fee_type":"CNY","cash_fee":"1000","cash_fee_type":"CNY","transaction_id":"4200067718202409250802875650","out_trade_no":"OD24092518408RV7","attach":[],"time_end":"20240925184009","trade_state_desc":"支付成功","nonce_str":"OeGOkjch4eaV5qIt","sign":"6DCB3BFC594EBC018A2BEE2C3DFEA4E3"}';
-                $result = json_decode($result, true);
+                $result = Pay::wechat(config('payment.wxpay'))->find($groupId, 'pos');
+                $result = json_decode(json_encode($result), true);
+//                $result = '{"return_code":"SUCCESS","return_msg":"OK","result_code":"SUCCESS","mch_id":"1680393367","appid":"wxc6274da7198e3eb4","openid":"o3JAn6Ii_bAlxS-jbNEC4WnPhdwM","is_subscribe":"N","trade_type":"MICROPAY","trade_state":"SUCCESS","bank_type":"OTHERS","total_fee":"50","fee_type":"CNY","cash_fee":"1000","cash_fee_type":"CNY","transaction_id":"4200067718202409250802875650","out_trade_no":"OD24092518408RV7","attach":[],"time_end":"20240925184009","trade_state_desc":"支付成功","nonce_str":"OeGOkjch4eaV5qIt","sign":"6DCB3BFC594EBC018A2BEE2C3DFEA4E3"}';
+//                $result = json_decode($result, true);
                 if (!empty($result['return_code']) && $result['return_code'] == 'SUCCESS' && !empty($result['result_code']) && $result['result_code'] == 'SUCCESS' && !empty($result['trade_state']) && $result['trade_state'] == 'SUCCESS') {
                     $payStatus = 'Y';
                     $orderUpdateData['order_status_payment'] = 'SUCCESS';

+ 171 - 7
app/admin/controller/order/RefundController.php

@@ -7,6 +7,7 @@ use app\admin\validate\order\ReturnValidate;
 use app\controller\Curd;
 use app\model\CouponDetail;
 use app\model\GoodsComponent;
+use app\model\Member;
 use app\model\MemberAccount;
 use app\model\Order;
 use app\model\OrderExpress;
@@ -39,7 +40,7 @@ class RefundController extends Curd
         $order = $request->get('order', 'desc');
         $type = $request->get('type', '');
         $field = $field ?? 'order_return_addtimes';
-        $where['order_return_category'] = '退款';
+        $where['order_return_category'] = ['in', ['退款', '会员退款']];
         if (!empty($where['order_return_addtimes'])) {
             $where['order_return_addtimes'][0] = strtotime($where['order_return_addtimes'][0]);
             $where['order_return_addtimes'][1] = strtotime($where['order_return_addtimes'][1]);
@@ -175,7 +176,7 @@ class RefundController extends Curd
         $orderId = $request->get('order_id');
         $orderSheet = OrderSheet::with([
             'member' => function ($query) {
-                $query->select('member_id', 'member_mobile','join_member_role_id','member_is_owner','member_is_vip','member_is_partner','member_is_referrer');
+                $query->select('member_id', 'member_mobile', 'join_member_role_id', 'member_is_owner', 'member_is_vip', 'member_is_partner', 'member_is_referrer');
             },
             'goods' => function ($query) {
                 $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price', 'goods_classify');
@@ -192,6 +193,7 @@ class RefundController extends Curd
         $member = [];
         $cert = [];
         $memberInfo = [];
+        $sheets = [];
         foreach ($orderSheet as &$item) {
             if (isset($item['member']) && empty($member)) {
                 $member = $item['member'];
@@ -262,14 +264,47 @@ class RefundController extends Curd
                 $return->userName = SysUser::where('user_id', $returnRefundJson['user_id'])->value('user_name');
             }
         }
+        if (!empty($return->order_return_apply_json)) {
+            $returnApplyJson = json_decode($return->order_return_apply_json, true);
+            if (!empty($returnApplyJson['order_id'])) {
+                $sheets = OrderSheet::with([
+                    'goods' => function ($query) {
+                        $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price', 'goods_classify');
+                    },
+                    'sku' => function ($query) {
+                        $query->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price');
+                    },
+                ])->whereIn('join_sheet_order_id', $returnApplyJson['order_id'])
+                    ->select('order_sheet_id', 'join_sheet_goods_id', 'join_sheet_goods_sku_id', 'order_sheet_num', 'order_sheet_price', 'order_sheet_amount')
+                    ->get()
+                    ->toArray();
+                foreach ($sheets as $key => $sheetsItem) {
+                    $sheets[$key]['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $sheetsItem['goods']['goods_cover'];
+                    if (!empty($sheetsItem['sku'])) {
+                        if (!empty($item['sku']['goods_sku_specs_json'])) {
+                            $specsJson = json_decode($item['sku']['goods_sku_specs_json'], true);
+                            $skuName = '';
+                            foreach ($specsJson as $specsKey => $skuSpecs) {
+                                if (is_array($skuSpecs)) {
+                                    $skuName = $skuName . ' ' . implode(' ', $skuSpecs) . ';';
+                                } else {
+                                    $skuName = $skuName . ' ' . $skuSpecs . ';';
+                                }
+                            }
+                            $sheets[$key]['sku']['goods_sku_title'] = rtrim($skuName, ';');
+                        }
+                    }
+                }
+            }
+        }
         $express = OrderExpress::where('join_express_order_id', $orderId)->first();
-        $payDetails = PayDetail::where('join_pay_order_id',$order->order_groupby)
-            ->whereJsonContains('join_pay_object_json->order_id',$orderId)
-            ->where('pay_status','SUCCESS')
+        $payDetails = PayDetail::where('join_pay_order_id', $order->order_groupby)
+            ->whereJsonContains('join_pay_object_json->order_id', $orderId)
+            ->where('pay_status', 'SUCCESS')
             ->where('pay_category', '<>', 'REFUND')
             ->get()
             ->toArray();
-        if (count($payDetails) > 1){
+        if (count($payDetails) > 1) {
             $order->pay_category = 'CONSTITUTE';
         }
         $payDetail = !empty($payDetails) && count($payDetails) > 0 ? $payDetails[0] : [];
@@ -289,6 +324,7 @@ class RefundController extends Curd
             'order' => $order,
             'refund' => $return,
             'sheet' => $orderSheet,
+            'sheets' => $sheets,
             'express' => $express,
             'payDetail' => json_decode(json_encode($payDetail)),
             'payDetails' => json_decode(json_encode($payDetails))
@@ -422,7 +458,7 @@ class RefundController extends Curd
             // 退款入收支
             $params['orderId'] = $orderId;
             $params['type'] = 'refund';
-            Event::dispatch('statistics.inout.out',$params);
+            Event::dispatch('statistics.inout.out', $params);
 
             return json_success('success');
         } catch (BusinessException $e) {
@@ -675,4 +711,132 @@ class RefundController extends Curd
 
         }
     }
+
+    /**
+     * @Desc 充值退款详情
+     * @Author Gorden
+     * @Date 2024/10/16 11:40
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function rechargeSheet(Request $request)
+    {
+        $refundId = $request->get('return_id');
+        if (!$refundId) {
+            return json_fail("参数异常");
+        }
+
+        $refund = OrderReturn::where('orders_return_id', $refundId)
+            ->first();
+        if (!empty($refund->order_return_apply_json)) {
+            $refund->order_return_apply_json = json_decode($refund->order_return_apply_json);
+        }
+
+
+        return json_success('', $refund);
+    }
+
+    /**
+     * @Desc 充值退款
+     * @Author Gorden
+     * @Date 2024/10/16 11:42
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function rechargeRefund(Request $request)
+    {
+        $memberId = $request->post('member_id');
+        $refundId = $request->post('return_id');
+        $password = $request->post('refund_password', '');
+        if (!$memberId) {
+            return json_fail('参数异常');
+        }
+        if ($password != '123456') {
+            return json_fail('支付密码错误');
+        }
+
+        $returnOrder = OrderReturn::where('orders_return_id', $refundId)
+            ->where('join_return_member_id', $memberId)
+            ->where('order_return_status', 'DOING')
+            ->where('order_return_category', '会员退款')
+            ->first();
+        if (!$returnOrder) {
+            return json_fail("退款数据异常");
+        }
+        $memberAccount = MemberAccount::where('join_account_member_id', $memberId)
+            ->where('member_account_classify', 'CASH')
+            ->where('member_account_status', 'ACTIVED')
+            ->first();
+        if (!$memberAccount) {
+            return json_fail('会员账户异常');
+        }
+        try {
+            Db::beginTransaction();
+            $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
+            $amount = $refundApplyJson['surplus'];
+            $addedAmount = $refundApplyJson['added'];
+            $refundApplyJson['amount'] = $amount;
+            $refundApplyJson['added_amount'] = $addedAmount;
+            $refundApplyJson['user_id'] = JwtToken::getCurrentId();
+            $refundApplyJson['datetime'] = date('Y-m-d H:i:s');
+            $returnOrder->order_return_refund_json = json_encode($refundApplyJson);
+            $returnOrder->order_return_status = 'DONE';
+            $returnOrder->order_return_remark = $request->post('refund_remark', '');
+            $returnOrder->save();
+            // 账户剩余
+            if ($memberAccount->member_account_surplus < $amount) {
+                throw new BusinessException("账户本金余额不足");
+            }
+            if ($memberAccount->member_account_added < $addedAmount) {
+                throw new BusinessException("账户增值余额不足");
+            }
+
+            // 本金
+            $memberAccount->member_account_surplus = $memberAccount->member_account_surplus - $amount;
+            // 增值
+            $memberAccount->member_account_added = $memberAccount->member_account_added - $addedAmount;
+            $memberAccount->save();
+            // 删除会员身份
+            Member::where('member_id', $memberId)
+                ->update([
+                    'join_member_role_id' => '',
+                    'member_role_begintime' => '',
+                    'member_role_config_json' => '[]'
+                ]);
+            // 没用的优惠券失效
+            CouponDetail::where('join_coupon_detail_member_id', $memberId)
+                ->where('coupon_detail_status', '<>', 'USED')
+                ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
+                ->update([
+                    'coupon_detail_status' => 'DISABLED'
+                ]);
+
+            // 产生一条退款记录 (pay_detail)
+            PayDetail::insert([
+                'join_pay_member_id' => $memberId,
+                'join_pay_order_id' => 'ROLE_REFUND',
+                'join_pay_object_json' => '[]',
+                'pay_status' => 'SUCCESS',
+                'pay_category' => 'ROLE_REFUND',
+                'pay_amount' => $amount + $addedAmount,
+                'pay_paytimes' => date('Y-m-d H:i:s'),
+                'pay_prepayid' => $memberId . '-CASH',
+                'pay_addtimes' => time()
+            ]);
+
+            Db::commit();
+
+            return json_success('success');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+
+            return json_fail('退款失败');
+        }
+    }
 }

+ 50 - 3
app/admin/service/member/MemberService.php

@@ -50,8 +50,7 @@ class MemberService
             'account' => function ($query) {
                 $query->where('member_account_status', 'ACTIVED');
             }
-        ])
-            ->where('member_is_owner', 'N')
+        ])->where('member_is_owner', 'N')
             ->where('member_mobile', '<>', '0000')
             ->leftJoin('member_info', 'member_info.join_info_member_id', 'member.member_id')
             ->leftJoin('member_cert', 'member_cert.join_cert_member_id', 'member.member_id')
@@ -392,7 +391,8 @@ class MemberService
             'info',
             'role' => function ($query) {
                 $query->select('member_role_id', 'member_role_name');
-            }
+            },
+            'account'
         ])
             ->where('member_id', $memberId)
             ->first();
@@ -535,6 +535,53 @@ class MemberService
                 ];
             }
         }
+        $account = [];
+        if (!empty($member['account'])) {
+            foreach ($member['account'] as $item) {
+                if ($item['member_account_classify'] == 'WELFARE') {
+                    $account['welfare'] = [
+                        'member_account_name' => $item['member_account_name'],
+                        'member_account_income' => $item['member_account_income'],
+                        'member_account_expend' => $item['member_account_expend'],
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                    ];
+                } else if ($item['member_account_classify'] == 'POINTS') {
+                    $account['points'] = [
+                        'member_account_name' => $item['member_account_name'],
+                        'member_account_income' => $item['member_account_income'],
+                        'member_account_expend' => $item['member_account_expend'],
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                    ];
+                } else if ($item['member_account_classify'] == 'CASH') {
+                    $account['cash'] = [
+                        'member_account_name' => $item['member_account_name'],
+                        'member_account_income' => $item['member_account_income'],
+                        'member_account_expend' => $item['member_account_expend'],
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                    ];
+                } else if ($item['member_account_classify'] == 'CARD') {
+                    $account['card'] = [
+                        'member_account_name' => $item['member_account_name'],
+                        'member_account_income' => $item['member_account_income'],
+                        'member_account_expend' => $item['member_account_expend'],
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                    ];
+                } else if ($item['member_account_classify'] == 'VIP') {
+                    $account['vip'] = [
+                        'member_account_name' => $item['member_account_name'],
+                        'member_account_income' => $item['member_account_income'],
+                        'member_account_expend' => $item['member_account_expend'],
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                    ];
+                }
+            }
+        }
+        $member['account'] = $account;
 
         return json_success('', $member);
     }

+ 3 - 0
route/admin.php

@@ -769,6 +769,7 @@ Route::group('/admin', function () {
             Route::get('/consumptionList', [\app\admin\controller\member\MemberController::class, 'consumptionList']);
             Route::post('/roleBenefitExport', [\app\admin\controller\member\MemberController::class, 'roleBenefitExport']);
             Route::post('/roleBenefitRefund', [\app\admin\controller\member\MemberController::class, 'roleBenefitRefund']);
+            Route::post('/refundOrder', [\app\admin\controller\member\MemberController::class, 'refundOrder']);
             Route::post('/exportConsumptionList', [\app\admin\controller\member\MemberController::class, 'exportConsumptionList']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
@@ -1147,7 +1148,9 @@ Route::group('/admin', function () {
         Route::group('/refund', function () {
             Route::get('/list', [\app\admin\controller\order\RefundController::class, 'select']);
             Route::get('/sheet', [\app\admin\controller\order\RefundController::class, 'sheet']);
+            Route::get('/rechargeSheet', [\app\admin\controller\order\RefundController::class, 'rechargeSheet']);
             Route::post('/customRefund', [\app\admin\controller\order\RefundController::class, 'customRefund']);
+            Route::post('/rechargeRefund', [\app\admin\controller\order\RefundController::class, 'rechargeRefund']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);