Browse Source

会员充值

gorden 6 months ago
parent
commit
4f7df8f8c1

+ 291 - 1
app/admin/controller/member/MemberController.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\member;
 
 use app\admin\service\member\MemberService;
+use app\admin\service\order\OrderService;
 use app\admin\validate\member\MemberValidate;
 use app\model\Coupon;
 use app\model\CouponDetail;
@@ -12,9 +13,14 @@ use app\model\Member;
 use app\model\MemberAccount;
 use app\model\MemberBenefit;
 use app\model\MemberQuota;
+use app\model\Order;
+use app\model\OrderReturn;
+use app\model\OrderSheet;
 use app\model\PayDetail;
 use support\Db;
+use support\exception\BusinessException;
 use support\Request;
+use Tinywan\Jwt\JwtToken;
 
 class MemberController
 {
@@ -509,7 +515,7 @@ class MemberController
         $memberId = $request->get('member_id', '');
         $coupons = CouponDetail::leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
             ->where('join_coupon_detail_member_id', $memberId)
-            ->select('coupon.coupon_name', 'coupon.coupon_classify','coupon.coupon_value')
+            ->select('coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
             ->get()
             ->toArray();
         $data = ['manjian' => 0, 'diyong' => 0, 'zhekou' => 0, 'lijian' => 0, 'zengpin' => 0, 'fuli' => 0, 'nianka' => 0, 'jika' => 0, 'yueka' => 0];
@@ -741,4 +747,288 @@ class MemberController
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));
     }
+
+    /**
+     * @Desc 新会员充值备份记录
+     * @Author Gorden
+     * @Date 2024/10/15 10:27
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public function rechargeBackupsList(Request $request)
+    {
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+        $memberId = $request->get('member_id');
+        if (!$memberId) {
+            return json_fail("参数异常");
+        }
+
+        $member = Member::where('member_id', $memberId)
+            ->select('member_id', 'member_extend_json')
+            ->first();
+        $data = [];
+        if (!empty($member->member_extend_json)) {
+            $extendJson = json_decode($member->member_extend_json, true);
+            if (isset($extendJson['snap'])) {
+                foreach ($extendJson['snap'] as $key => $item) {
+                    $data[] = [
+                        'recharge_times' => $key,
+                        'member_account_surplus' => $item['member_account_surplus'],
+                        'member_account_added' => $item['member_account_added'],
+                        'pay_amount' => $item['pay_amount'],
+                        'added_rate' => floatval($item['added_rate']) * 100,
+                        'added_amount' => $item['added_amount']
+                    ];
+                }
+            }
+        }
+
+        $total = count($data);
+        $start = ($page - 1) * $pageSize;
+        $rows = array_slice($data, $start, $pageSize);
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
+    /**
+     * @Desc 会员权益使用记录
+     * @Author Gorden
+     * @Date 2024/10/15 11:13
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public function roleBenefitUsedList(Request $request)
+    {
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+        $memberId = $request->get('member_id');
+        if (!$memberId) {
+            return json_fail('参数异常');
+        }
+
+        $data = $this->getRoleBenefitUsedList($memberId);
+        $total = count($data);
+        $start = ($page - 1) * $pageSize;
+        $rows = array_slice($data, $start, $pageSize);
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
+    /**
+     * @Desc 获取权益使用记录
+     * @Author Gorden
+     * @Date 2024/10/15 11:35
+     *
+     * @param $memberId
+     * @param $orderIds
+     * @return array
+     */
+    public function getRoleBenefitUsedList($memberId, $orderIds = [])
+    {
+        $couponDetails = CouponDetail::where('join_coupon_detail_member_id', $memberId)
+            ->where('coupon_detail_status', 'USED')
+            ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
+            ->get()
+            ->toArray();
+        $data = [];
+        foreach ($couponDetails as $couponDetail) {
+            $orders = Order::where('order_discount_json', 'like', '%' . $couponDetail['coupon_detail_id'] . '%')
+                ->whereIn('order_is_complete', ['Y', 'N'])
+                ->where('order_status_payment', 'SUCCESS')
+                ->when(!empty($orderIds), function ($query) use ($orderIds) {
+                    $query->whereIn('order_id', $orderIds);
+                })->get()
+                ->toArray();
+            foreach ($orders as $order) {
+                $sheets = OrderSheet::with([
+                    'goods' => function ($query) {
+                        $query->select('goods_id', 'goods_name');
+                    }
+                ])->where('join_sheet_order_id', $order['order_id'])
+                    ->get()
+                    ->toArray();
+                $deng = "";
+                if (count($sheets) > 1) {
+                    $deng = '等';
+                }
+
+                $discountJson = json_decode($order['order_discount_json'], true);
+                $couponName = '';
+                $discountAmount = 0;
+                foreach ($discountJson as $item) {
+                    $discountAmount = $item['coupon_value'];
+                    $couponName = Coupon::where('coupon_id', $item['coupon_id'])->value('coupon_name');
+                }
+
+                $payDetailTimes = PayDetail::whereJsonContains('join_pay_object_json->order_id', $order['order_id'])->value('pay_paytimes');
+                $data[] = [
+                    'order_id' => $order['order_id'],
+                    'goods_name' => !empty($sheets[0]) && !empty($sheets[0]['goods']) ? ($sheets[0]['goods']['goods_name'] . $deng) : '',
+                    'order_classify' => $order['order_classify'],
+                    'order_amount_total' => $order['order_amount_total'],
+                    'order_amount_pay' => $order['order_amount_pay'],
+                    'coupon_name' => $couponName,
+                    'discountAmount' => $discountAmount,
+                    'order_status_system' => $order['order_status_system'],
+                    'order_addtimes' => $order['order_addtimes'],
+                    'pay_paytimes' => $payDetailTimes
+                ];
+            }
+        }
+
+        return $data;
+    }
+
+    public function roleBenefitExport(Request $request)
+    {
+        $orderIds = $request->post('order_id', []);
+        $memberId = $request->post('member_id');
+        $applyUsername = $request->post('apply_username', '');
+        $applyMobile = $request->post('apply_mobile', '');
+        $applyAmount = $request->post('apply_amount', '');
+        if (!$memberId) {
+            return json_fail("参数异常");
+        }
+
+        $data = $this->getRoleBenefitUsedList($memberId, $orderIds);
+        $dicountAmount = 0;
+        foreach ($data as $key => $item) {
+            $data[$key]['order_classify'] = OrderService::$orderClassify[$item['order_classify']];
+            $dicountAmount += $item['discountAmount'];
+        }
+
+        $returnApplayData['data'] = $data;
+        $returnApplayData['amount'] = $applyAmount;
+        $returnApplayData['apply_username'] = $applyUsername;
+        $returnApplayData['apply_mobile'] = $applyMobile;
+        $returnApplayData['reason'] = "会员权益退款";
+
+
+        $data[] = [
+            'discountAmount' => '优惠合计:¥' . sprintf('%.2f', $dicountAmount)
+        ];
+        $data[] = [
+            'order_classify' => '申请人:' . $applyUsername,
+        ];
+        $data[] = [
+            'order_classify' => '电话:' . $applyMobile,
+        ];
+        $data[] = [
+            'order_classify' => '退款金额:' . $applyAmount,
+        ];
+
+        // 产生退款记录
+        $this->refundOrder($memberId, $returnApplayData);
+
+        return json_success('success', $data);
+    }
+
+    public function refundOrder($memberId, $data)
+    {
+        try {
+            OrderReturn::where('join_return_member_id', $memberId)
+                ->where('order_return_status', '<>', 'DONE')
+                ->where('order_return_category', '会员权益退款')
+                ->delete();
+            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' => '会员权益退款',
+                'order_return_apply_datetime' => date('Y-m-d H:i:s'),
+                'order_return_apply_json' => json_encode($data),
+                'order_return_addtimes' => time()
+            ]);
+        } catch (\Exception $e) {
+            return json_fail("创建退款记录失败");
+        }
+    }
+
+    public function roleBenefitRefund(Request $request)
+    {
+        $memberId = $request->post('member_id');
+        if (!$memberId) {
+            return json_fail('参数异常');
+        }
+
+        $returnOrder = OrderReturn::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['amount'];
+            $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->save();
+            // 账户剩余
+            if ($memberAccount->member_account_surplus + $memberAccount->member_account_added < $amount) {
+                throw new BusinessException("账户余额不足");
+            }
+            // 本金
+            if ($memberAccount->member_account_surplus >= $amount) {
+                $memberAccount->member_account_surplus = $memberAccount->member_account_surplus - $amount;
+            }else{
+                $memberAccount->member_account_added = $memberAccount->member_account_added - ($amount - $memberAccount->member_account_surplus);
+                $memberAccount->member_account_surplus = 0;
+            }
+            $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,
+                '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('退款失败');
+        }
+    }
 }

+ 16 - 0
app/admin/service/order/OrderService.php

@@ -983,4 +983,20 @@ class OrderService
         'NONE' => '付零',
         'VIP' => 'VIP账户'
     ];
+
+    public static $orderClassify = [
+        'GOODS'=>'产品订单',
+        'CHNMED'=>'服务订单',
+        'CHNNCD'=>'服务订单',
+        'SERVICE'=>'服务订单',
+        'DEVICE'=>'设备订单',
+        'SPECIAL'=>'专题业务订单',
+        'PACKAGE'=>'套包订单',
+        'RECHARGE'=>'充值订单',
+        'DESHES'=>'餐饮订单',
+        'VIP'=>'康养城订单',
+        'PARTNER'=>'合伙人订单',
+        'REFERRER'=>'康养推荐官订单',
+        'COMBINE'=>'新客专享订单'
+    ];
 }

+ 4 - 0
route/admin.php

@@ -764,6 +764,10 @@ Route::group('/admin', function () {
             Route::get('/exportMember', [\app\admin\controller\member\MemberController::class, 'exportMember']);
             Route::get('/fansList', [\app\admin\controller\member\MemberController::class, 'fansList']);
             Route::get('/commissionList', [\app\admin\controller\member\MemberController::class, 'commissionList']);
+            Route::get('/rechargeBackupsList', [\app\admin\controller\member\MemberController::class, 'rechargeBackupsList']);
+            Route::get('/roleBenefitUsedList', [\app\admin\controller\member\MemberController::class, 'roleBenefitUsedList']);
+            Route::post('/roleBenefitExport', [\app\admin\controller\member\MemberController::class, 'roleBenefitExport']);
+            Route::post('/roleBenefitRefund', [\app\admin\controller\member\MemberController::class, 'roleBenefitRefund']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);