Browse Source

完善功能

gorden 9 months ago
parent
commit
6853793cc9

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

@@ -21,8 +21,10 @@ class MemberController
 
         $res = Db::table('member')
             ->leftjoin('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
-            ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name')
+            ->leftjoin('member_account', 'member.member_id', '=', 'member_account.join_account_member_id')
+            ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name','member_account.member_account_surplus')
             ->where('member.member_is_owner', $isOwner)
+            ->where('member_account.member_account_classify', 'CASH')
             ->where(function ($query) use ($keywords) {
                 $query->where('member.member_mobile', 'like', '%' . $keywords . '%')
                     ->orWhere("member.member_id", 'like', '%' . $keywords . '%')

+ 108 - 19
app/admin/controller/member/QuotaController.php

@@ -8,8 +8,10 @@ use app\controller\Curd;
 use app\model\Member;
 use app\model\MemberQuota;
 use app\model\RuleAdded;
+use app\model\RuleAddedComponent;
 use app\model\RulePricing;
 use app\model\SysSerial;
+use support\Db;
 use support\Redis;
 use support\exception\BusinessException;
 use support\Request;
@@ -26,26 +28,67 @@ class QuotaController extends Curd
 
     public function select(Request $request): Response
     {
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+
         $keywords = $request->get('keywords', '');
         $memberIds = [];
         if (!empty($keywords)) {
             $memberIds = Member::leftJoin('member_cert', 'member_cert.join_cert_member_id', '=', 'member.member_id')
                 ->where('member.member_mobile', 'like', '%' . $keywords . '%')
                 ->orWhere('member_cert.member_cert_name', 'like', '%' . $keywords . '%')
-                ->pluck('member.member_id')->toArray();
+                ->pluck('member.member_id')
+                ->toArray();
             if (empty($memberIds)) {
                 return json_success('', []);
             }
         }
 
-        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
-        if (!empty($memberIds)) {
-            $where['join_quota_member_id'] = ['in', $memberIds];
+        $rows = MemberQuota::select('join_quota_member_id', 'join_member_rule_added_component_id', 'member_quota_addtimes')
+            ->when(!empty($memberIds), function ($query) use ($memberIds) {
+                $query->whereIn('join_quota_member_id', $memberIds);
+            })
+            ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id', 'member_quota_addtimes');
+
+        $total = $rows->count();
+
+        $rows = $rows->orderBy('member_quota_addtimes', 'DESC')
+            ->forPage($page, $pageSize)
+            ->get()
+            ->toArray();
+        foreach ($rows as &$row) {
+            $quota = MemberQuota::with([
+                'member' => function ($query) {
+                    $query->select('member_id', 'member_mobile');
+                },
+                'cert' => function ($query) {
+                    $query->select('join_cert_member_id', 'member_cert_name');
+                },
+                'component' => function ($query) {
+                    $query->select('rule_added_component_id', 'rule_added_component_name');
+                }
+            ])->where('join_quota_member_id', $row['join_quota_member_id'])
+                ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
+                ->first()
+                ->toArray();
+            $quotaTotal = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
+                ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
+                ->count();
+            $quotaUsed = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
+                ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
+                ->where('member_quota_status', 'USED')
+                ->count();
+            $quota['total'] = $quotaTotal;
+            $quota['used'] = $quotaUsed;
+            $quota['unused'] = $quotaTotal - $quotaUsed;
+
+            $addedId = RuleAddedComponent::where('rule_added_component_id', $row['join_member_rule_added_component_id'])->value('join_component_rule_added_id');
+            $addedName = RuleAdded::where('rule_added_id', $addedId)->value('rule_added_name');
+            $quota['added_name'] = $addedName;
+
+            $row = $quota;
         }
-        $order = $request->get('order', 'desc');
-        $field = $field ?? 'member_quota_addtimes';
-        $query = $this->doSelect($where, $field, $order);
-        return $this->doFormat($query, $format, $limit);
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
     }
 
     protected function doSelect(array $where, string $field = null, string $order = 'desc')
@@ -61,6 +104,7 @@ class QuotaController extends Curd
                 $query->select('rule_added_component_id', 'rule_added_component_name');
             }
         ]);
+        $model = $model->groupBy('join_member_rule_added_component_id');
         foreach ($where as $column => $value) {
             if (is_array($value)) {
                 if ($value[0] === 'like' || $value[0] === 'not like') {
@@ -90,6 +134,7 @@ class QuotaController extends Curd
                 $model = $model->where($column, $value);
             }
         }
+
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
@@ -122,6 +167,29 @@ class QuotaController extends Curd
         return [$id, $data];
     }
 
+    public function writeOffList(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        $componentId = $request->get('component_id', '');
+
+        $quotas = MemberQuota::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+            'component' => function ($query) {
+                $query->select('rule_added_component_id', 'rule_added_component_name');
+            }
+        ])->where('join_quota_member_id', $memberId)
+            ->where('join_member_rule_added_component_id', $componentId)
+            ->where('member_quota_status', 'USED')
+            ->get();
+
+        return json_success('', $quotas);
+    }
+
     /**
      * @Desc 额度核销
      * @Author Gorden
@@ -132,31 +200,52 @@ class QuotaController extends Curd
      */
     public function writeOff(Request $request)
     {
-        $quotaIds = $request->post('quota_id', []);
+        $memberId = $request->post('member_id', []);
+        $componentId = $request->post('component_id', []);
+        $nbr = $request->post('nbr');
+        $times = $request->post('times', '');
         $code = $request->post('sms_code', '');
 
-        $quotas = MemberQuota::whereIn('member_quota_id', $quotaIds)->get()->toArray();
-        $memberIds = array_column($quotas, 'join_quota_member_id');
-
-        if (count(array_unique($memberIds)) > 1) {
-            return json_fail("不可同时核销多个会员的权益");
+        if (!$memberId || !$componentId) {
+            return json_fail("参数异常");
         }
 
-        $status = array_column($quotas, 'member_quota_status');
-        if (in_array('USED', $status) || in_array('CANCEL',$status)) {
-            return json_fail('存在已核销 / 无效的权益,请重新选择');
+        $quotas = MemberQuota::where('join_quota_member_id', $memberId[0])
+            ->where('join_member_rule_added_component_id', $componentId[0])
+            ->where('member_quota_status', 'PENDING')
+            ->limit($nbr)
+            ->get()
+            ->toArray();
+        if (count($quotas) < intval($nbr)) {
+            return json_fail("可核销数量不足");
         }
 
-        $member = Member::find(current($memberIds));
+        $member = Member::find(current($memberId));
         $mobile = $member->member_mobile;
         $key = "SMS:CODE:QUOTA:" . $mobile;
         $redisCode = Redis::get($key);
         if ($redisCode != $code) {
             return json_fail("验证码错误,请重新输入");
         }
+        Redis::del($key);
+
+        if (!$times) {
+            $times = date('Y-m-d H:i:s');
+        } else {
+            $times = date('Y-m-d H:i:s', strtotime($times));
+        }
 
         try {
-            MemberQuota::whereIn('member_quota_id', $quotaIds)->update(['member_quota_status' => 'USED']);
+            foreach ($quotas as $quota) {
+                $extend = [];
+                if (!empty($quota['member_quota_extend_json'])) {
+                    $extend = json_decode($quota['member_quota_extend_json'], true);
+                }
+                $extend['writeOffTime'] = $times;
+
+                MemberQuota::where('member_quota_id', $quota['member_quota_id'])->update(['member_quota_status' => 'USED', 'member_quota_extend_json' => $extend]);
+            }
+
         } catch (\Exception $e) {
             return json_fail("核销失败");
         }

+ 195 - 0
app/admin/controller/order/PayDetailController.php

@@ -0,0 +1,195 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\controller\Curd;
+use app\model\Goods;
+use app\model\GoodsSku;
+use app\model\Order;
+use app\model\OrderSheet;
+use app\model\PayDetail;
+use support\Db;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class PayDetailController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new PayDetail();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'pay_addtimes';
+//        $where['pay_status'] = 'SUCCESS';
+        if ($where['pay_category'] == 'OTHER') {
+            $where['pay_category'] = ['<>', 'RECHARGE'];
+        }
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with(['member', 'cert']);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    /**
+     * @Desc 产品订单
+     * @Author Gorden
+     * @Date 2024/6/5 10:10
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function goodsOrder(Request $request)
+    {
+        $orderId = $request->get('order_id', '');
+        if (!$orderId) {
+            return json_fail('参数异常');
+        }
+        $orderSheet = OrderSheet::with([
+            'order' => function ($query) {
+                $query->select('order_id', 'order_amount_total', 'order_amount_pay', 'order_is_complete', 'order_category', 'order_status_system', 'order_status_payment', 'order_status_storage', 'order_addtimes');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name', 'goods_status', 'goods_market_price', 'goods_sales_price', 'goods_addtimes');
+            },
+            'sku' => function ($query) {
+                $query->select('goods_sku_id', 'goods_sku_specs_json', 'goods_sku_market_price', 'goods_sku_sales_price');
+            }
+        ])->where('join_sheet_order_id', $orderId)
+            ->get()
+            ->toArray();
+
+        return json_success('', $orderSheet);
+    }
+
+    public function insertRecharge(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        try {
+            $data = $this->insertRechargeInput($request);
+            $this->doInsert($data);
+        } catch (BusinessException $customException) {
+            return json_fail($customException->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('数据写入失败11');
+        }
+        return json_success('success');
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/6/5 13:39
+     *
+     * @param Request $request
+     * @return array
+     * @throws BusinessException
+     */
+    protected function insertRechargeInput(Request $request): array
+    {
+        $params = $request->post();
+        $data = $this->inputFilter($params);
+        if (!$params['is_custom']) {
+            try {
+                Db::beginTransaction();
+                $goods = Goods::find($params['goods_id']);
+                $data['pay_amount'] = $goods->goods_sales_price;
+
+                $orderId = "OD" . date("YmdHis") . random_string(6, 'up');
+                $orderGroupId = "OD" . date("YmdHis") . random_string(6, 'up');
+                $orderData = [
+                    'order_id' => $orderId,
+                    'order_groupby' => $orderGroupId,
+                    'join_order_member_id' => $data['join_pay_member_id'],
+                    'order_name' => date('Y-m-d H:i:s') . '-订单',
+                    'order_amount_total' => $data['pay_amount'],
+                    'order_amount_pay' => $data['pay_amount'],
+                    'order_amount_json' => '{"tax": 0, "freight": 0}',
+                    'order_status_payment' => 'SUCCESS',
+                    'order_category' => 'NORMAL',
+                    'order_status_system' => 'WAITING',
+                    'order_status_storage' => 'PENDING',
+                    'order_addtimes' => time()
+                ];
+                $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first();
+
+                Order::insert($orderData);
+                $orderSheetData = [
+                    'join_sheet_member_id' => $data['join_pay_member_id'],
+                    'join_sheet_order_id' => $orderId,
+                    'join_sheet_goods_id' => $params['goods_id'],
+                    'join_sheet_goods_sku_id' => $sku->goods_sku_id ?? '',
+                    'order_sheet_status' => 'PAYING',
+                    'order_sheet_category' => 'NORMAL',
+                    'order_sheet_num' => 1,
+                    'order_sheet_price' => $data['pay_amount'],
+                    'order_sheet_amount' => $data['pay_amount'],
+                    'order_sheet_pay' => $data['pay_amount'],
+                    'order_sheet_addtimes' => time()
+                ];
+
+                OrderSheet::insert($orderSheetData);
+
+                Db::commit();
+            } catch (\Exception $e) {
+                dump($e->getMessage());
+                Db::rollBack();
+
+                throw new BusinessException("数据错误");
+            }
+            $data['join_pay_order_id'] = $orderGroupId;
+            $data['join_pay_object_json'] = json_encode(['order_id' => $orderId]);
+        } else {
+            $extendJson['notify'] = 'success';
+            $extendJson['is_custom'] = $params['is_custom'];
+        }
+        $data['pay_extend_json'] = json_encode($extendJson);
+        $data['pay_paytimes'] = date('Y-m-d H:i:s', strtotime($data['pay_paytimes']));
+        $data['pay_prepayid'] = 0;
+        return $data;
+    }
+}

+ 14 - 13
app/admin/controller/sms/SmsController.php

@@ -22,25 +22,26 @@ class SmsController
      */
     public function sendSmsCodeByQuota(Request $request)
     {
-        $quotaIds = $request->post('quota_id', []);
-        if (!$quotaIds) {
-            return json_fail("参数异常");
-        }
+        $memberId = $request->post('member_id', []);
+        $componentId = $request->post('component_id', []);
+        $nbr = $request->post('nbr');
 
-        $quotas = MemberQuota::whereIn('member_quota_id', $quotaIds)->get()->toArray();
-        $memberIds = array_column($quotas, 'join_quota_member_id');
-
-        if (count(array_unique($memberIds)) > 1) {
-            return json_fail("不可同时核销多个会员的权益");
+        if (!$memberId || !$componentId) {
+            return json_fail("参数异常");
         }
 
-        $status = array_column($quotas, 'member_quota_status');
-        if (in_array('USED', $status) || in_array('CANCEL',$status)) {
-            return json_fail('存在已核销 / 无效的权益,请重新选择');
+        $quotas = MemberQuota::where('join_quota_member_id', $memberId[0])
+            ->where('join_member_rule_added_component_id', $componentId[0])
+            ->where('member_quota_status', 'PENDING')
+            ->limit($nbr)
+            ->get()
+            ->toArray();
+        if (count($quotas) < intval($nbr)) {
+            return json_fail("可核销数量不足");
         }
 
         try {
-            $member = Member::find(current($memberIds));
+            $member = Member::find(current($memberId));
             $mobile = $member->member_mobile;
 
             $code = random_string(6, 'number');

+ 2 - 2
app/admin/service/goods/GoodsService.php

@@ -91,8 +91,8 @@ class GoodsService
 
     public static function select(Request $request, $classify = "GOODS")
     {
-        $page = $request->get('page');
-        $pageSize = $request->get('pageSize');
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
         $goodsName = $request->get('goods_name', '');
         $categoryId = $request->get('join_goods_category_id', null);
         $goodsCategory = $request->get('goods_category', null);

+ 5 - 5
app/admin/service/order/AppointmentService.php

@@ -197,8 +197,9 @@ class AppointmentService
                 ];
                 MemberInfo::insert($infoData);
             }
+            $appointmentId = "AP" . date('YmdHis') . random_string(6, 'up');
             $data = [
-                'appointment_id' => "AP" . str_pad(SysSerial::getSerial(), 16, '0') . random_string(6, 'up'),
+                'appointment_id' => $appointmentId,
                 'join_appointment_member_id' => $params['join_appointment_member_id'] ?? '',
                 'join_appointment_goods_id' => $params['join_appointment_goods_id'] ?? '',
                 'join_appointment_goods_sku_id' => $params['join_appointment_goods_sku_id'] ?? '',
@@ -279,7 +280,9 @@ class AppointmentService
                     'pay_remark' => '预约单',
                     'pay_addtimes' => time(),
                     'pay_prepayid' => 0,
-                    'pay_paytimes' => date('Y-m-d H:i:s')
+                    'pay_paytimes' => date('Y-m-d H:i:s'),
+                    'join_pay_object_json'=>json_encode(['appointment_id' => $appointmentId]),
+                    'pay_category'=>"APPOINTMENT"
                 ];
                 // 现金余额结算
                 if ($params['settlement_mode'] == 'CASH') {
@@ -300,15 +303,12 @@ class AppointmentService
                             'member_account_surplus' => $account->member_account_surplus - $sheet['order_sheet_pay']
                         ]);
                         $pay['pay_status'] = 'SUCCESS';
-                        $pay['join_pay_object_json'] = json_encode(['payment' => ['member_account_id' => $account->member_account_id]]);
                         // 更新订单状态
                         Order::where('order_id', $orderId)->update(['order_status_system' => 'CONFIRM', 'order_status_payment' => 'SUCCESS']);
                         OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CONFIRM']);
                     }
-                    $pay['pay_category'] = 'CASH';
                     PayDetail::insert($pay);
                 } elseif ($params['settlement_mode'] == 'QRCODE') {
-                    $pay['pay_category'] = 'QRCODE';
                     $pay['pay_status'] = 'SUCCESS';
                     PayDetail::insert($pay);
                     // 更新订单状态

+ 6 - 1
app/model/OrderSheet.php

@@ -97,6 +97,11 @@ class OrderSheet extends Model
     public function running()
     {
         return $this->hasOne(GoodsRunning::class, 'join_running_goods_id', 'join_sheet_goods_id')
-            ->select('join_running_goods_id','goods_running_storage','goods_running_sale');
+            ->select('join_running_goods_id', 'goods_running_storage', 'goods_running_sale');
+    }
+
+    public function sku()
+    {
+        return $this->hasOne(GoodsSku::class, 'goods_sku_id', 'join_sheet_goods_sku_id');
     }
 }

+ 18 - 0
app/model/PayDetail.php

@@ -2,6 +2,7 @@
 
 namespace app\model;
 
+use DateTimeInterface;
 use support\Model;
 
 class PayDetail extends Model
@@ -15,4 +16,21 @@ class PayDetail extends Model
     const CREATED_AT = 'pay_addtimes';
 
     const UPDATED_AT = null;
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_pay_member_id')
+            ->select('member_id', 'member_mobile');
+    }
+
+    public function cert()
+    {
+        return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_pay_member_id')
+            ->select('join_cert_member_id', 'member_cert_name');
+    }
 }

+ 9 - 0
route/admin.php

@@ -643,6 +643,8 @@ Route::group('/admin', function () {
         /* 会员额度明细 */
         Route::group('/quota', function () {
             Route::get('/list', [\app\admin\controller\member\QuotaController::class, 'select']);
+            Route::get('/writeOffList', [\app\admin\controller\member\QuotaController::class, 'writeOffList']);
+
             Route::post('/add', [\app\admin\controller\member\QuotaController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\member\QuotaController::class, 'update']);
             Route::post('/writeOff', [\app\admin\controller\member\QuotaController::class, 'writeOff']);
@@ -776,6 +778,13 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        // 支付记录
+        Route::group('/payDetail', function () {
+            Route::get('/list', [\app\admin\controller\order\PayDetailController::class, 'select']);
+            Route::get('/goodsOrder',[\app\admin\controller\order\PayDetailController::class,'goodsOrder']);
+            Route::post('/insertRecharge',[\app\admin\controller\order\PayDetailController::class,'insertRecharge']);
+//            Route::get('/info', [\app\admin\controller\order\AppointmentController::class, 'info']);
+        });
     });
     /* 统计 */
     Route::group('/statistics', function () {