Browse Source

储值卡

gorden 3 months ago
parent
commit
c7ef3e3fb9

+ 203 - 0
app/admin/controller/coupon/CardController.php

@@ -0,0 +1,203 @@
+<?php
+
+namespace app\admin\controller\coupon;
+
+use app\admin\service\member\MemberService;
+use app\controller\Curd;
+use app\model\Card;
+use app\model\MemberRole;
+use app\model\SysCategory;
+use app\model\SysUser;
+use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
+use Illuminate\Database\Query\Builder as QueryBuilder;
+use support\exception\BusinessException;
+use support\Model;
+use support\Request;
+use support\Response;
+
+class CardController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Card();
+    }
+
+
+    /**
+     * 查询
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * 指定查询where条件,并没有真正的查询数据库操作
+     * @param array $where
+     * @param string|null $field
+     * @param string $order
+     * @return EloquentBuilder|QueryBuilder|Model
+     */
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+            'dept',
+            'user',
+            'main' => function ($query) {
+                $query->select('card_main_id', 'card_main_name', 'card_main_amount', 'card_main_valid_mode');
+            },
+            'issue' => function ($query) {
+                $query->select('card_issue_id', 'card_issue_name');
+            }
+        ]);
+        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;
+    }
+
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            $mobile = $item['member']['member_mobile'] ?? '';
+            $certName = $item['cert']['member_cert_name'] ?? '';
+            $item['member_name'] = MemberService::getMemberCertName($mobile, $certName, '');
+            if (!empty($item['main']['card_main_valid_mode'])) {
+                if ($item['main']['card_main_valid_mode'] == 'LONG') {
+                    $item['valid_datetime'] = '长期有效';
+                } else if (!empty($item['card_deadline_datetime'])) {
+                    $item['valid_datetime'] = date('Y/m/d H:i:s', strtotime($item['card_assign_datetime'])) . '-' . date('Y/m/d H:i:s', strtotime($item['card_deadline_datetime']));
+                }
+            }
+        }
+
+        return $items;
+    }
+
+    public function info(Request $request): Response
+    {
+        $cardId = $request->get('card_id');
+        if (!$cardId) {
+            return json_fail("参数异常");
+        }
+
+        $info = Card::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', 'member_is_franchisee');
+            },
+            'cert',
+            'info',
+            'dept',
+            'user',
+            'main',
+            'issue'
+        ])->where('card_id', $cardId)
+            ->first();
+        $info = $info ? $info->toArray() : [];
+        if (!empty($info['member']) && !empty($info['member']['join_member_role_id'])) {
+            $info['role_name'] = MemberRole::where('member_role_id', $info['member']['join_member_role_id'])->value('member_role_name');
+        }
+        // 头像
+        $memberAvatar = !empty($info['info']) && !empty($info['info']['member_info_headimg']) ? $info['info']['member_info_headimg'] : '';
+        $info['info']['member_info_headimg'] = MemberService::getAvatarUrl($memberAvatar);
+        // 昵称
+        $memberNickname = !empty($info['info']) && !empty($info['info']['member_info_nickname']) ? $info['info']['member_info_nickname'] : '';
+        $memberMobile = !empty($info['member']) && !empty($info['member']['member_mobile']) ? $info['member']['member_mobile'] : '';
+        $info['info']['member_info_nickname'] = MemberService::getNickname($memberNickname, $memberMobile);
+
+        if (!empty($info['main'])) {
+            if (!empty($info['main']['join_card_main_category_id'])) {
+                $info['main_category_name'] = SysCategory::where('category_id', $info['main']['join_card_main_category_id'])->value('category_name');
+            }
+            if (!empty($info['main']['card_main_valid_mode']) && $info['main']['card_main_valid_mode'] == 'LONG') {
+                $info['valid_term'] = '长期有效';
+            } elseif (!empty($info['main']['card_main_valid_mode']) && $info['main']['card_main_valid_mode'] == 'DAYS') {
+                $info['valid_term'] = $info['main']['card_main_valid_days'] . '天';
+            } elseif (!empty($info['main']['card_main_valid_mode']) && $info['main']['card_main_valid_mode'] == 'DATE') {
+                $info['valid_term'] = date('Y/m/d H:i:s', strtotime($info['main']['card_main_valid_begin'])) . '-' . date('Y/m/d H:i:s', strtotime($info['main']['card_main_valid_end']));
+            }
+            if (!empty($info['main']['card_main_json'])) {
+                $cardMainJson = json_decode($info['main']['card_main_json'], true);
+                $info['is_recharge'] = $cardMainJson['is_recharge'];
+                $info['issue_mode'] = $cardMainJson['issue'];
+            }
+            if (!empty($info['main']['card_main_valid_mode'])) {
+                if ($info['main']['card_main_valid_mode'] == 'LONG') {
+                    $info['valid_datetime'] = '长期有效';
+                } else if (!empty($info['card_deadline_datetime'])) {
+                    $info['valid_datetime'] = date('Y/m/d H:i:s', strtotime($info['card_assign_datetime'])) . '-' . date('Y/m/d H:i:s', strtotime($info['card_deadline_datetime']));
+                }
+            }
+        }
+        if (!empty($info['issue']) && !empty($info['issue']['card_issue_creator_user_id'])) {
+            $info['issue_username'] = SysUser::where('user_id', $info['issue']['card_issue_creator_user_id'])->value('user_name');
+        }
+
+        return json_success('', $info);
+    }
+
+    /**
+     * @Desc 获取指定状态的 card_id
+     * @Author Gorden
+     * @Date 2024/11/15 17:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function getCardIdsByMainId(Request $request)
+    {
+        $mainId = $request->get('main_id');
+        if (!$mainId) {
+            return json_fail('参数异常');
+        }
+        $status = $request->get('status');
+
+        $cardIds = Card::where('join_card_main_id', $mainId)
+            ->when(!empty($status), function ($query) use ($status) {
+                $query->where('card_status', $status);
+            })->pluck('card_id')
+            ->toArray();
+
+        return json_success('success',$cardIds);
+    }
+}

+ 273 - 0
app/admin/controller/coupon/CardMainController.php

@@ -3,9 +3,18 @@
 namespace app\admin\controller\coupon;
 
 use app\controller\Curd;
+use app\model\Card;
+use app\model\CardIssue;
 use app\model\CardMain;
+use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
+use Illuminate\Database\Query\Builder as QueryBuilder;
+use support\Db;
 use support\exception\BusinessException;
+use support\Log;
+use support\Model;
 use support\Request;
+use support\Response;
+use Tinywan\Jwt\JwtToken;
 
 class CardMainController extends Curd
 {
@@ -14,6 +23,140 @@ class CardMainController extends Curd
         $this->model = new CardMain();
     }
 
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'card_main_addtimes';
+
+        if (!empty($where['card_main_name'])) {
+            $where['card_main_name'] = ['like', $where['card_main_name']];
+        }
+        if (!empty($where['card_main_addtimes'])){
+            $where['card_main_addtimes'][0] = strtotime($where['card_main_addtimes'][0]);
+            $where['card_main_addtimes'][1] = strtotime($where['card_main_addtimes'][1]);
+        }
+
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+
+    /**
+     * 指定查询where条件,并没有真正的查询数据库操作
+     * @param array $where
+     * @param string|null $field
+     * @param string $order
+     * @return EloquentBuilder|QueryBuilder|Model
+     */
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with('category');
+        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/11/15 8:35
+     *
+     * @param $items
+     * @return mixed
+     */
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if ($item['card_main_valid_mode'] == 'DAYS') {
+                $item['valid_term'] = $item['card_main_valid_days'] ? $item['card_main_valid_days'] . '天' : 0;
+            } elseif ($item['card_main_valid_mode'] == 'LONG') {
+                $item['valid_term'] = '长期有效';
+            } elseif ($item['card_main_valid_mode'] == 'DATE') {
+                $item['valid_term'] = date('Y/m/d H:i:s', strtotime($item['card_main_valid_begin'])) . '-' . date('Y/m/d H:i:s', strtotime($item['card_main_valid_end']));
+            }
+        }
+
+        return $items;
+    }
+
+    /**
+     * @Desc 储值卡详情
+     * @Author Gorden
+     * @Date 2024/11/15 11:33
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request): Response
+    {
+        $cardMainId = $request->get('card_main_id');
+        if (!$cardMainId) {
+            return json_fail('参数异常');
+        }
+        // 发行记录
+        $cardIssue = CardIssue::where('join_issue_card_main_id', $cardMainId)->orderBy('card_issue_addtimes', 'DESC')->get()->toArray();
+
+        // 发行统计
+        $cardTotal = Card::where('join_card_main_id', $cardMainId)->count();
+        $cardInitTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'INIT')->count();
+        $cardWaitingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'WAITING')->count();
+        $cardPendingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PENDING')->count();
+        $cardUsedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'USED')->count();
+        $cardDoneTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'DONE')->count();
+        $cardExpiredTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'EXPIRED')->count();
+        $cardPausedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PAUSED')->count();
+        $statistics = [
+            [
+                'total' => $cardTotal,
+                'initTotal' => $cardInitTotal,
+                'waitingTotal' => $cardWaitingTotal,
+                'pendingTotal' => $cardPendingTotal,
+                'usedTotal' => $cardUsedTotal,
+                'doneTotal' => $cardDoneTotal,
+                'expiredTotal' => $cardExpiredTotal,
+                'pausedTotal' => $cardPausedTotal
+            ]
+        ];
+
+        $data = [
+            'issue' => $cardIssue,
+            'statistics' => $statistics
+        ];
+
+        return json_success('', $data);
+    }
+
     /**
      * @Desc 插入前置方法
      * @Author Gorden
@@ -25,13 +168,40 @@ class CardMainController extends Curd
      */
     public function insertInput(Request $request): array
     {
+        $params = $request->post();
+
         $data = $this->inputFilter($request->post());
 
         if ($data['card_main_valid_mode'] == 'DATE') {
             $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
             $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
+            $data['card_main_valid_days'] = 0;
+        } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
+            $data['card_main_valid_begin'] = '';
+            $data['card_main_valid_end'] = '';
+        }
+
+
+        $cardMainJson = [
+            'desc' => $params['card_main_desc'] ?? [],
+            'is_recharge' => $params['is_recharge'] ?? 'N',
+            'issue' => $params['issue'] ?? 'BATCH',
+            'demand_config' => []
+        ];
+        if ($params['issue'] == 'DEMAND') {
+            $cardMainJson['demand_config'] = [
+                'length' => $params['card_length'],
+                'begin' => $params['card_begin'],
+                'end' => $params['card_end'],
+                'prefix' => $params['card_prefix'],
+                'suffix' => $params['card_suffix'],
+                'rand' => $params['card_rand'],
+                'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
+            ];
         }
 
+        $data['card_main_json'] = json_encode($cardMainJson);
+
         return $data;
     }
 
@@ -43,6 +213,8 @@ class CardMainController extends Curd
      */
     protected function updateInput(Request $request): array
     {
+        $params = $request->post();
+
         $primary_key = $this->model->getKeyName();
         $id = $request->post($primary_key);
         $data = $this->inputFilter($request->post());
@@ -54,9 +226,110 @@ class CardMainController extends Curd
         if ($data['card_main_valid_mode'] == 'DATE') {
             $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
             $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
+            $data['card_main_valid_days'] = 0;
+        } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
+            $data['card_main_valid_begin'] = '';
+            $data['card_main_valid_end'] = '';
+        }
+
+        $cardMainJson = [];
+        if (!empty($model->card_main_json)) {
+            $cardMainJson = json_decode($model->card_main_json, true);
+        }
+        $cardMainJson['desc'] = $params['card_main_desc'] ?? [];
+        if (!empty($params['is_recharge'])) {
+            $cardMainJson['is_recharge'] = $params['is_recharge'];
+        }
+        if (!empty($params['issue'])) {
+            $cardMainJson['issue'] = $params['issue'];
+        }
+        if ($cardMainJson['issue'] == 'BATCH') {
+            $cardMainJson['demand_config'] = [];
+        } elseif ($cardMainJson['issue'] == 'DEMAND') {
+            $cardMainJson['demand_config'] = [
+                'length' => $params['card_length'],
+                'begin' => $params['card_begin'],
+                'end' => $params['card_end'],
+                'prefix' => $params['card_prefix'],
+                'suffix' => $params['card_suffix'],
+                'rand' => $params['card_rand'],
+                'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
+            ];
         }
+        $data['card_main_json'] = json_encode($cardMainJson);
 
         unset($data[$primary_key]);
         return [$id, $data];
     }
+
+    /**
+     * @Desc 储值卡发行
+     * @Author Gorden
+     * @Date 2024/11/15 13:56
+     *
+     * @param Request $request
+     * @return Response|void
+     */
+    public function issue(Request $request)
+    {
+        $params = $request->post();
+
+        Db::beginTransaction();
+        try {
+            $cardIds = [];
+            // 创建卡号
+            for ($i = 0; $i < intval($params['card_issue_num']); $i++) {
+                $prefixLength = strlen($params['card_issue_serial_prefix']);
+                $suffixLength = strlen($params['card_issue_serial_suffix']);
+                $cardIds[] = $params['card_issue_serial_prefix'] . str_pad($params['card_issue_serial_begin'] + $i, $params['card_issue_serial_length'] - $prefixLength - $suffixLength, '0', STR_PAD_LEFT) . $params['card_issue_serial_suffix'];
+
+            }
+
+            // 写入发行表
+            $issueId = CardIssue::insertGetId([
+                'join_issue_card_main_id' => $params['join_issue_card_main_id'],
+                'card_issue_name' => $params['card_issue_name'],
+                'card_issue_num' => $params['card_issue_num'],
+                'card_issue_datetime' => date('Y-m-d H:i:s'),
+                'card_issue_serial_length' => $params['card_issue_serial_length'],
+                'card_issue_serial_prefix' => $params['card_issue_serial_prefix'],
+                'card_issue_serial_suffix' => $params['card_issue_serial_suffix'],
+                'card_issue_serial_begin' => $params['card_issue_serial_begin'],
+                'card_issue_serial_end' => $params['card_issue_serial_end'],
+                'card_issue_serial_fill' => $params['card_issue_serial_fill'] ?? 0,
+                'card_issue_begin_nbr' => $cardIds[0],
+                'card_issue_end_nbr' => $cardIds[count($cardIds) - 1],
+                'card_issue_creator_user_id' => JwtToken::getCurrentId(),
+                'card_issue_addtimes' => time()
+            ]);
+            // 分批入库
+            $cardsCollect = collect($cardIds);
+            $chunks = $cardsCollect->chunk(200);
+            foreach ($chunks as $chunk) {
+                $insertData = [];
+                foreach ($chunk as $key => $item) {
+                    $insertData[$key] = [
+                        'card_id' => $item,
+                        'join_card_main_id' => $params['join_issue_card_main_id'],
+                        'join_card_issue_id' => $issueId,
+                        'card_status' => 'INIT',
+                        'card_cdkey' => random_string(8, 'number'),
+                        'card_addtimes' => time()
+                    ];
+                }
+
+                Card::insert($insertData);
+            }
+
+            Db::commit();
+            _syslog("储值卡", '发行成功', false, $request->all());
+            return json_success('success');
+        } catch (\Exception $e) {
+            Db::rollBack();
+            _syslog("储值卡", '发行失败', false, $request->all());
+            Log::error("储值卡发行失败", ['msg' => $e->getMessage()]);
+
+            return json_fail("储值卡发行失败");
+        }
+    }
 }

+ 57 - 0
app/command/CardGenerateCommand.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace app\command;
+
+use app\model\Card;
+use app\model\CardIssue;
+use app\model\Member;
+use app\model\MemberAccount;
+use app\model\Order;
+use app\model\PayDetail;
+use support\Db;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CardGenerateCommand extends Command
+{
+
+    protected static $defaultName = 'CardGenerateCommand';
+    protected static $defaultDescription = 'CardGenerateCommand';
+
+    /**
+     * @return void
+     */
+    protected function configure()
+    {
+        $this->addArgument('name', InputArgument::OPTIONAL, '生成卡号');
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        try {
+            $issue = CardIssue::where('card_issue_id', 5)->first();
+            $cards = [];
+            for ($i = 0; $i < $issue->card_issue_num; $i++) {
+                $cardId = $issue->card_issue_serial_prefix . str_pad($issue->card_issue_serial_begin + $i, $issue->card_issue_serial_length - strlen($issue->card_issue_serial_prefix), '0', STR_PAD_LEFT);
+                $cards[] = [
+                    'card_id' => $cardId,
+                    'join_card_main_id' => $issue->join_issue_card_main_id,
+                    'join_card_issue_id' => $issue->card_issue_id,
+                    'card_status' => 'INIT',
+                    'card_cdkey' => random_string(8, 'number'),
+                    'card_addtimes' => time()
+                ];
+            }
+
+            Card::insert($cards);
+
+            return self::SUCCESS;
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return self::SUCCESS;
+        }
+
+    }
+}

+ 88 - 4
app/model/Card.php

@@ -11,18 +11,102 @@ class Card extends Model
 
     public $primaryKey = 'card_id';
 
+    public $keyType = 'string';
+
     protected $dateFormat = 'U';
 
     const CREATED_AT = 'card_addtimes';
 
     const UPDATED_AT = null;
 
-    //卡状态 INTI=初始化|PRODUCTED=制作完成|ENABLED=已启用|WAITING=已分配|PENDING=待激活|ACTIVED=已激活|DISABLED=已禁用|EXPIRED=已过期|PAUSED=暂停使用
-    public const CARD_STATUS = ['INIT' => '初始化', 'PRODUCTED' => '制作完成', 'ENABLED' => '已启用', 'WAITING' => '已分配', 'PENDING' => '待激活', 'ACTIVED' => '已激活', 'DISABLED' => '已禁用', 'EXPIRED' => '已过期', 'PAUSED' => '暂停使用'];
-
-
     public function serializeDate(DateTimeInterface $date)
     {
         return $date->format('Y-m-d H:i:s');
     }
+
+    /**
+     * @Desc 关联会员主表
+     * @Author Gorden
+     * @Date 2024/11/15 14:39
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_card_member_id');
+    }
+
+    /**
+     * @Desc 关联会员详情表
+     * @Author Gorden
+     * @Date 2024/11/15 15:57
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function info()
+    {
+        return $this->hasOne(MemberInfo::class, 'join_info_member_id', 'join_card_member_id')
+            ->select('join_info_member_id', 'member_info_nickname', 'member_info_headimg');
+    }
+
+    /**
+     * @Desc 关联会员认证表
+     * @Author Gorden
+     * @Date 2024/11/15 14:39
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function cert()
+    {
+        return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_card_member_id')
+            ->select('join_cert_member_id', 'member_cert_name');
+    }
+
+    /**
+     * @Desc 关联部门
+     * @Author Gorden
+     * @Date 2024/11/15 14:43
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function dept()
+    {
+        return $this->hasOne(SysDept::class, 'dept_id', 'join_card_dept_id')->select('dept_id', 'dept_name');
+    }
+
+    /**
+     * @Desc 关联后台用户
+     * @Author Gorden
+     * @Date 2024/11/15 14:44
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function user()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'join_card_user_id')->select('user_id', 'user_name');
+    }
+
+    /**
+     * @Desc 关联卡主表
+     * @Author Gorden
+     * @Date 2024/11/15 14:55
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function main()
+    {
+        return $this->hasOne(CardMain::class, 'card_main_id', 'join_card_main_id');
+    }
+
+    /**
+     * @Desc 关联发行表
+     * @Author Gorden
+     * @Date 2024/11/15 14:56
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function issue()
+    {
+        return $this->hasOne(CardIssue::class, 'card_issue_id', 'join_card_issue_id');
+    }
 }

+ 24 - 0
app/model/CardIssue.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class CardIssue extends Model
+{
+    protected $table = 'card_issue';
+
+    protected $primaryKey = 'card_issue_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'card_issue_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 4 - 0
app/model/CardMain.php

@@ -21,4 +21,8 @@ class CardMain extends Model
     {
         return $date->format('Y-m-d H:i:s');
     }
+
+    public function category(){
+        return $this->hasOne(SysCategory::class,'category_id','join_card_main_category_id')->select('category_id','category_name');
+    }
 }

+ 11 - 0
route/admin.php

@@ -1067,11 +1067,22 @@ Route::group('/admin', function () {
             Route::get('/info', [\app\admin\controller\coupon\CardMainController::class, 'info']);
             Route::post('/add', [\app\admin\controller\coupon\CardMainController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\coupon\CardMainController::class, 'update']);
+            Route::post('/issue', [\app\admin\controller\coupon\CardMainController::class, 'issue']);
             Route::delete('/delete', [\app\admin\controller\coupon\CardMainController::class, 'delete']);
 //            Route::post('/disable', [\app\admin\controller\coupon\CouponController::class, 'disableCoupon']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        Route::group('', function () {
+            Route::get('/list', [\app\admin\controller\coupon\CardController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\coupon\CardController::class, 'info']);
+            Route::get('/getCardIdsByMainId', [\app\admin\controller\coupon\CardController::class, 'getCardIdsByMainId']);
+            Route::post('/add', [\app\admin\controller\coupon\CardController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\coupon\CardController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\coupon\CardController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
 
     /* 订单管理 */