Browse Source

储值卡管理

gorden 3 months ago
parent
commit
e4f781857c

+ 83 - 1
app/admin/controller/coupon/CardController.php

@@ -5,12 +5,15 @@ namespace app\admin\controller\coupon;
 use app\admin\service\member\MemberService;
 use app\controller\Curd;
 use app\model\Card;
+use app\model\CardIssue;
 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\Db;
 use support\exception\BusinessException;
+use support\Log;
 use support\Model;
 use support\Request;
 use support\Response;
@@ -32,6 +35,8 @@ class CardController extends Curd
     public function select(Request $request): Response
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'card_addtimes';
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
@@ -191,13 +196,90 @@ class CardController extends Curd
             return json_fail('参数异常');
         }
         $status = $request->get('status');
+        $isIssue = $request->get('is_issue');
+        $allocation = $request->get('allocation');
 
         $cardIds = Card::where('join_card_main_id', $mainId)
             ->when(!empty($status), function ($query) use ($status) {
                 $query->where('card_status', $status);
+            })->when(!empty($isIssue), function ($query) use ($isIssue) {
+                $query->where('is_issue', $isIssue);
+            })->when(!empty($allocation), function ($query) use ($allocation) {
+                if ($allocation == 'N') {   // 未分配
+                    $query->where('join_card_dept_id', '');
+                } elseif ($allocation == 'Y') {     // 已分配
+                    $query->where('join_card_dept_id', '<>', '');
+                }
             })->pluck('card_id')
             ->toArray();
 
-        return json_success('success',$cardIds);
+        return json_success('success', $cardIds);
+    }
+
+    /**
+     * @Desc 储值卡发行
+     * @Author Gorden
+     * @Date 2024/11/18 15:13
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function issue(Request $request)
+    {
+        $params = $request->post();
+
+        try {
+            $issueMode = $params['issue'];
+            // 1.按卡号
+            if ($issueMode == 'CARDID' && !empty($params['card_id'])) {
+                Card::whereIn('card_id', $params['card_id'])->where('is_issue', 'N')->update(['is_issue' => 'Y']);
+            } elseif ($issueMode == 'ISSUE' && !empty($params['card_issue_id'])) {
+                // 2.按批次
+                Card::where('join_card_issue_id', $params['card_issue_id'])->where('is_issue', 'N')->update(['is_issue' => 'Y']);
+            }
+
+            _syslog("储值卡", '发行成功');
+            return json_success('success');
+        } catch (\Exception $e) {
+            _syslog("储值卡", '发行失败');
+            Log::error('储值卡发行失败', ['msg' => $e->getMessage()]);
+            return json_fail("发行失败");
+        }
+    }
+
+    /**
+     * @Desc 储值卡分配
+     * @Author Gorden
+     * @Date 2024/11/18 16:02
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function allocation(Request $request)
+    {
+        $params = $request->post();
+
+        try {
+            $allocation = $params['allocation'];
+            // 1.按卡号分配
+            if ($allocation == 'CARDID' && !empty($params['card_id'])) {
+                Card::whereIn('card_id', $params['card_id'])->where('join_card_dept_id', '')->update([
+                    'join_card_dept_id' => $params['join_card_dept_id'],
+                    'card_assign_datetime' => date('Y-m-d H:i:s')
+                ]);
+            } elseif ($allocation == 'ISSUE' && !empty($params['card_issue_id'])) {
+                Card::where('join_card_issue_id', $params['card_issue_id'])->where('join_card_dept_id', '')->update([
+                    'join_card_dept_id' => $params['join_card_dept_id'],
+                    'card_assign_datetime' => date('Y-m-d H:i:s')
+                ]);
+            }
+
+            _syslog("储值卡", '分配成功');
+            return json_success('success');
+        } catch (\Exception $e) {
+            _syslog("储值卡", '分配失败');
+            Log::error('储值卡分配失败', ['msg' => $e->getMessage()]);
+            return json_fail('分配失败');
+        }
     }
 }

+ 325 - 0
app/admin/controller/coupon/CardIssueController.php

@@ -0,0 +1,325 @@
+<?php
+
+namespace app\admin\controller\coupon;
+
+use app\controller\Curd;
+use app\model\Card;
+use app\model\CardIssue;
+use app\model\SysCategory;
+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 CardIssueController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new CardIssue();
+    }
+
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'card_issue_addtimes';
+
+        if (!empty($where['card_main_name'])) {
+            $where['card_main_name'] = ['like', $where['card_main_name']];
+        }
+        if (!empty($where['card_issue_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([
+            'main',
+            'user'
+        ]);
+        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 (!empty($item['main']['join_card_main_category_id'])) {
+                $item['main']['category_name'] = SysCategory::where('category_id', $item['main']['join_card_main_category_id'])->value('category_name');
+            }
+            if (!empty($item['main']['card_main_valid_mode']) && $item['main']['card_main_valid_mode'] == 'DAYS') {
+                $item['main']['valid_term'] = $item['main']['card_main_valid_days'] ? $item['main']['card_main_valid_days'] . '天' : 0;
+            } elseif (!empty($item['main']['card_main_valid_mode']) && $item['main']['card_main_valid_mode'] == 'LONG') {
+                $item['main']['valid_term'] = '长期有效';
+            } elseif (!empty($item['main']['card_main_valid_mode']) && $item['main']['card_main_valid_mode'] == 'DATE') {
+                $item['main']['valid_term'] = date('Y/m/d H:i:s', strtotime($item['main']['card_main_valid_begin'])) . '-' . date('Y/m/d H:i:s', strtotime($item['main']['card_main_valid_end']));
+            }
+
+            if (empty($item['main'])) {
+                continue;
+            }
+
+//            $item['main']['cardMainJson'] = json_decode($item['main']['card_main_json'], true);
+
+            // 总发行金额
+            $item['issue_total_amount'] = sprintf('%.2f', $item['card_issue_num'] * $item['main']['card_main_amount']);
+
+            $cardModel = Card::where('join_card_issue_id', $item['card_issue_id']);
+            // 未激活
+            $inactiveTotalModel = clone $cardModel;
+            $item['inactive_total'] = $inactiveTotalModel->whereIn('card_status', ['INIT', 'WAITING', 'PENDING'])->count();
+            $item['inactive_amount'] = sprintf('%.2f', $item['inactive_total'] * $item['main']['card_main_amount']);
+            // 已激活
+            $activeTotalModel = clone $cardModel;
+            $item['active_total'] = $activeTotalModel->whereIn('card_status', ['USED', 'DONE'])->count();
+            $item['active_amount'] = sprintf('%.2f', $item['active_total'] * $item['main']['card_main_amount']);
+            // 无效
+            $invalidTotalModel = clone $cardModel;
+            $item['invalid_total'] = $invalidTotalModel->whereIn('card_status', ['EXPIRED', 'PAUSED', 'DISABLED'])->count();
+            $item['invalid_amount'] = sprintf('%.2f', $item['invalid_total'] * $item['main']['card_main_amount']);
+        }
+
+        return $items;
+    }
+
+    /**
+     * @Desc 创建发行
+     * @Author Gorden
+     * @Date 2024/11/18 10:09
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        Db::beginTransaction();
+        try {
+            if (empty($params['card_issue_serial_fill'])) {
+                $params['card_issue_serial_fill'] = '0';
+            }
+            // 验证是否有相同的前缀,长度相同,且开始结束数字有交叉的
+            $cardIssueExists = CardIssue::where('card_issue_serial_length', $params['card_issue_serial_length'])
+                ->where('card_issue_serial_prefix', $params['card_issue_serial_prefix'])
+                ->where(function ($query) use ($params) {
+                    $query->whereBetween('card_issue_serial_begin', [$params['card_issue_serial_begin'], $params['card_issue_serial_end']])
+                        ->orWhereBetween('card_issue_serial_end', [$params['card_issue_serial_begin'], $params['card_issue_serial_end']]);
+                })->exists();
+            if ($cardIssueExists) {
+                throw new BusinessException("当前设置的发行规则在前缀、长度、开始数字、结束数字与已存在的规则存在冲突,请重新设置");
+            }
+
+            $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, $params['card_issue_serial_fill'], 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'],
+                '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 (BusinessException $e) {
+            Db::rollBack();
+            _syslog("储值卡批次", '创建失败', false, $request->all());
+            Log::error("储值卡批次创建失败", ['msg' => $e->getMessage()]);
+
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            _syslog("储值卡批次", '创建失败', false, $request->all());
+            Log::error("储值卡发行失败", ['msg' => $e->getMessage()]);
+
+            return json_fail("储值卡批次创建失败");
+        }
+    }
+
+    /**
+     * @Desc 删除批次
+     * @Author Gorden
+     * @Date 2024/11/18 11:05
+     *
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function delete(Request $request): Response
+    {
+        $ids = $this->deleteInput($request);
+
+        Db::beginTransaction();
+        try {
+            if (Card::whereIn('join_card_issue_id', $ids)->where(function ($query) {
+                $query->where('card_status', '<>', 'INIT')
+                    ->orWhere('join_card_dept_id', '<>', '')
+                    ->orWhere('join_card_member_id', '<>', '');
+            })->exists()) {
+                return json_fail("存在已发行、已分配的卡,无法删除!");
+            }
+
+            $this->doDelete($ids);
+            // 同时删除卡记录
+            Card::whereIn('join_card_issue_id', $ids)->delete();
+
+            Db::commit();
+            _syslog("储值卡批次", '删除成功');
+            return json_success('success');
+        } catch (\Exception $e) {
+            Db::rollBack();
+            _syslog("储值卡批次", '删除失败');
+            Log::error("储值卡批次删除失败", ['msg' => $e->getMessage()]);
+
+            return json_fail("删除失败");
+        }
+
+    }
+
+    /**
+     * @Desc 获取没发行完的批次列表
+     * @Author Gorden
+     * @Date 2024/11/18 14:44
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function getIssueList(Request $request)
+    {
+        $cardMainId = $request->get('card_main_id');
+        if (!$cardMainId) {
+            return json_fail('参数异常');
+        }
+        $isIssue = $request->get('is_issue');
+        $allocation = $request->get('allocation');
+
+        $cardIssues = CardIssue::where('join_issue_card_main_id', $cardMainId)
+            ->select('card_issue_id', 'card_issue_name')
+            ->get()
+            ->toArray();
+        if (empty($isIssue) && empty($allocation)) {
+            return json_success('success', $cardIssues);
+        }
+        $cardIssueIds = array_column($cardIssues, 'card_issue_id');
+        $inCardsIssueIds = Card::whereIn('join_card_issue_id', $cardIssueIds)
+            ->when(!empty($isIssue), function ($query) use ($isIssue) {
+                $query->where('is_issue', $isIssue);
+            })->when(!empty($allocation), function ($query) use ($allocation) {
+                if ($allocation == 'N') {
+                    $query->where('join_card_dept_id', '');
+                } elseif ($allocation == 'Y') {
+                    $query->where('join_card_dept_id', '<>', '');
+                }
+            })
+            ->groupBy('join_card_issue_id')
+            ->pluck('join_card_issue_id')
+            ->toArray();
+        $data = [];
+        foreach ($cardIssues as $cardIssue) {
+            foreach ($inCardsIssueIds as $issueId) {
+                if ($cardIssue['card_issue_id'] == $issueId) {
+                    $data[] = [
+                        'card_issue_id' => $cardIssue['card_issue_id'],
+                        'card_issue_name' => $cardIssue['card_issue_name']
+                    ];
+                }
+            }
+        }
+
+        return json_success('success', $data);
+    }
+}

+ 125 - 52
app/admin/controller/coupon/CardMainController.php

@@ -32,7 +32,7 @@ class CardMainController extends Curd
         if (!empty($where['card_main_name'])) {
             $where['card_main_name'] = ['like', $where['card_main_name']];
         }
-        if (!empty($where['card_main_addtimes'])){
+        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]);
         }
@@ -110,6 +110,24 @@ class CardMainController extends Curd
         return $items;
     }
 
+    /**
+     * @Desc 卡的下拉搜索
+     * @Author Gorden
+     * @Date 2024/11/18 9:51
+     *
+     * @return Response
+     */
+    public function selectList()
+    {
+        $cardMain = CardMain::where('card_main_status', 'ACTIVED')
+            ->orderBy('card_main_addtimes', 'DESC')
+            ->select('card_main_id', 'card_main_name')
+            ->get()
+            ->toArray();
+
+        return json_success('success', $cardMain);
+    }
+
     /**
      * @Desc 储值卡详情
      * @Author Gorden
@@ -258,78 +276,133 @@ class CardMainController extends Curd
         }
         $data['card_main_json'] = json_encode($cardMainJson);
 
+        // 卡状态设置为禁用,则未绑定的卡冻结,恢复未发行状态
+        if ($data['card_main_status'] == 'DISABLED' && $model->card_main_status != 'DISABLED') {
+            Card::where('join_card_main_id', $id)->where('join_card_member_id', '')->update(['card_status' => 'PAUSED', 'is_issue' => 'N']);
+            // 记录日志
+            _syslog("储值卡", "禁用");
+        } elseif ($data['card_main_status'] == 'ACTIVED' && $model->card_main_status == 'DISABLED') {
+            Card::where('join_card_main_id', $id)->where('join_card_member_id', '')
+                ->where('card_status', 'PAUSED')
+                ->update(['card_status' => 'INIT']);
+            // 记录日志
+            _syslog("储值卡", "重新启用");
+        }
+
         unset($data[$primary_key]);
         return [$id, $data];
     }
 
     /**
-     * @Desc 储值卡发行
+     * @Desc 删除储值卡
      * @Author Gorden
-     * @Date 2024/11/15 13:56
+     * @Date 2024/11/18 16:33
      *
      * @param Request $request
-     * @return Response|void
+     * @return Response
+     * @throws BusinessException
      */
-    public function issue(Request $request)
+    public function delete(Request $request): Response
     {
-        $params = $request->post();
+        $ids = $this->deleteInput($request);
 
         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'];
-
+            if (Card::whereIn('join_card_main_id', $ids)->where(function ($query) {
+                $query->where('card_status', '<>', 'INIT')
+                    ->orWhere('join_card_dept_id', '<>', '')
+                    ->orWhere('join_card_member_id', '<>', '');
+            })->exists()) {
+                return json_fail("存在已发行、已分配的卡,无法删除!");
             }
 
-            // 写入发行表
-            $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);
-            }
+            $this->doDelete($ids);
+            // 同时删除批次记录
+            CardIssue::whereIn('join_issue_card_main_id',$ids)->delete();
+            // 同时删除卡记录
+            Card::whereIn('join_card_main_id', $ids)->delete();
 
             Db::commit();
-            _syslog("储值卡", '发行成功', false, $request->all());
+            _syslog("储值卡", '删除成功');
             return json_success('success');
         } catch (\Exception $e) {
             Db::rollBack();
-            _syslog("储值卡", '发行失败', false, $request->all());
-            Log::error("储值卡发行失败", ['msg' => $e->getMessage()]);
+            _syslog("储值次", '删除失败');
+            Log::error("储值卡删除失败", ['msg' => $e->getMessage()]);
 
-            return json_fail("储值卡发行失败");
+            return json_fail("删除失败");
         }
+
     }
+
+    /**
+     * @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("储值卡发行失败");
+//        }
+//    }
 }

+ 24 - 0
app/model/CardIssue.php

@@ -21,4 +21,28 @@ class CardIssue extends Model
     {
         return $date->format('Y-m-d H:i:s');
     }
+
+    /**
+     * @Desc 关联卡主表
+     * @Author Gorden
+     * @Date 2024/11/18 11:15
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function main()
+    {
+        return $this->hasOne(CardMain::class, 'card_main_id', 'join_issue_card_main_id');
+    }
+
+    /**
+     * @Desc 关联后台用户
+     * @Author Gorden
+     * @Date 2024/11/18 11:15
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function user()
+    {
+        return $this->hasOne(SysUser::class, 'user_id', 'card_issue_creator_user_id')->select('user_id', 'user_name');
+    }
 }

+ 17 - 2
route/admin.php

@@ -1063,12 +1063,25 @@ Route::group('/admin', function () {
         Route::group('/main', function () {
             Route::get('/list', [\app\admin\controller\coupon\CardMainController::class, 'select']);
 //            Route::get('/statistics', [\app\admin\controller\coupon\CouponController::class, 'statistics']);
-//            Route::get('/selectList', [\app\admin\controller\coupon\CouponController::class, 'selectList']);
+            Route::get('/selectList', [\app\admin\controller\coupon\CardMainController::class, 'selectList']);
             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::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('/issue', function () {
+            Route::get('/list', [\app\admin\controller\coupon\CardIssueController::class, 'select']);
+            Route::get('/selectList', [\app\admin\controller\coupon\CardIssueController::class, 'getIssueList']);
+//            Route::get('/statistics', [\app\admin\controller\coupon\CouponController::class, 'statistics']);
+//            Route::get('/selectList', [\app\admin\controller\coupon\CouponController::class, 'selectList']);
+            Route::get('/info', [\app\admin\controller\coupon\CardIssueController::class, 'info']);
+            Route::post('/add', [\app\admin\controller\coupon\CardIssueController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\coupon\CardIssueController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\coupon\CardIssueController::class, 'delete']);
 //            Route::post('/disable', [\app\admin\controller\coupon\CouponController::class, 'disableCoupon']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
@@ -1079,6 +1092,8 @@ Route::group('/admin', function () {
             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::post('/issue', [\app\admin\controller\coupon\CardController::class, 'issue']);
+            Route::post('/allocation', [\app\admin\controller\coupon\CardController::class, 'allocation']);
             Route::delete('/delete', [\app\admin\controller\coupon\CardController::class, 'delete']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class