Browse Source

专用储值卡

gorden 3 months ago
parent
commit
19869fab17

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

@@ -287,6 +287,13 @@ class CardMainController extends Curd
                 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
             ];
         }
+        // 关联产品
+        $cardMainJson['goods_ary'] = $params['goods_id'] ?? [];
+        // 关联产品分类
+        $cardMainJson['goods_category_ary'] = $params['category_id'] ?? [];
+        // 关联门店
+        $cardMainJson['premises_ary'] = $params['premises'] ?? [];
+
         $data['card_main_json'] = json_encode($cardMainJson);
 
         // 卡状态设置为禁用,则未绑定的卡冻结,恢复未发行状态

+ 59 - 8
app/admin/controller/order/CardController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CardService;
 use app\admin\service\coupon\CouponDetailService;
 use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
@@ -308,7 +309,6 @@ class CardController extends Curd
             // 验证库存
             foreach ($params['goodsContentList'] as $goods) {
                 $goodsRunning = GoodsRunning::where('join_running_goods_id', $goods['goods_id'])->first();
-                dump($goodsRunning);
                 $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
                 if ($goodsRunning->goods_running_storage < 0) {
                     throw new BusinessException('库存不足');
@@ -771,6 +771,15 @@ class CardController extends Curd
             $orderConfigJson['preferential'] = $params['preferential'] ?? '';
             $order->order_config_json = json_encode($orderConfigJson);
             $order->order_amount_pay = $params['order_amount_pay'] + $qrcodePayAmount;
+
+            // 发卡
+            $cardId = CardService::sendDemandCard($params['join_order_member_id'], $goods, $params);
+            if ($cardId !== false) {
+                $order->order_is_complete = 'Y';
+                $order->order_status_system = 'CONFIRM';
+                // 更新express表
+                $this->addCardIdToExpress($order->order_id, $cardId);
+            }
             // 主订单
             $order->save();
 
@@ -918,7 +927,11 @@ class CardController extends Curd
             $params['order_extend_json']['referee'] = $params['referee'] ?? '';
             $orderAmount = [];
             foreach ($params['goodsContentList'] as $goods) {
-                $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
+                if (floatval($goods['goods_sales_price']) > 0) {
+                    $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
+                } else {
+                    $amountPay = 0;
+                }
                 $discountJson = [];
                 if (!empty($params['order_discount_json'])) {
                     $discountJson = json_decode($params['order_discount_json'], true);
@@ -939,6 +952,18 @@ class CardController extends Curd
                     }
                 }
                 $orderId = 'OD' . date('ymdHi') . random_string(4, 'up');
+
+                // 发卡
+                $orderIsComplete = $params['order_is_complete'] ?? 'N';
+                $orderStatusSystem = $params['order_status_system'];
+                $cardId = '';
+                if ($params['order_status_payment'] == 'SUCCESS') {
+                    $cardId = CardService::sendDemandCard($params['join_order_member_id'], $goods, $params);
+                    if ($cardId !== false) {
+                        $orderIsComplete = 'Y';
+                        $orderStatusSystem = 'CONFIRM';
+                    }
+                }
                 $data = [
                     'order_id' => $orderId,
                     'order_groupby' => $params['orderGroupId'],
@@ -948,8 +973,8 @@ class CardController extends Curd
                     'order_amount_pay' => $amountPay,
                     'order_category' => $goods['goods_classify'],
                     'order_classify' => $goods['goods_classify'],
-                    'order_is_complete' => $params['order_is_complete'] ?? 'N',
-                    'order_status_system' => $params['order_status_system'],
+                    'order_is_complete' => $orderIsComplete,
+                    'order_status_system' => $orderStatusSystem,
                     'order_status_payment' => $params['order_status_payment'],
                     'order_status_storage' => $params['order_status_storage'],
                     'order_platform' => $params['order_platform'],
@@ -970,10 +995,10 @@ class CardController extends Curd
 
                 $params['order_express_goods'] = json_encode(['sheet' => $sheetIds]);
 
-                $this->insertExpressOne($params, $orderId);
+                $this->insertExpressOne($params, $orderId, $cardId);
             }
         } catch (\Exception $e) {
-            dump($e->getMessage());
+            dump($e->getMessage(), $e->getFile(), $e->getLine());
             throw new BusinessException('订单创建信息失败');
         }
     }
@@ -1739,7 +1764,7 @@ class CardController extends Curd
      * @return void
      * @throws BusinessException
      */
-    public function insertExpressOne($params, $orderId)
+    public function insertExpressOne($params, $orderId, $cardId = '')
     {
         if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
             $params['order_express_type'] = '配送';
@@ -1755,7 +1780,11 @@ class CardController extends Curd
             $params['order_express_city'] = $premises->dept_city;
             $params['order_express_address'] = $premises->dept_address;
             $params['order_express_telephone'] = $premises->dept_telephone;
-            $params['order_express_extend_json'] = json_encode(['pick_code' => random_string(4, 'number')]);
+            $orderExpressExtendJson = ['pick_code' => random_string(4, 'number')];
+            if (!empty($cardId)) {
+                $orderExpressExtendJson['card_id'] = $cardId;
+            }
+            $params['order_express_extend_json'] = json_encode($orderExpressExtendJson);
 
             $this->saveExpress($params, $orderId);
         } else if (isset($params['delivery']) && $params['delivery'] == 'ARRIVAL') {
@@ -1849,4 +1878,26 @@ class CardController extends Curd
             }
         }
     }
+
+    /**
+     * @Desc 物流表加储值卡号
+     * @Author Gorden
+     * @Date 2024/12/9 16:38
+     *
+     * @param $orderId
+     * @param $cardId
+     * @return void
+     */
+    private function addCardIdToExpress($orderId, $cardId)
+    {
+        $express = OrderExpress::where('join_express_order_id', $orderId)->first();
+        $expressExtendJson = [];
+        if (!empty($express->order_express_extend_json)) {
+            $expressExtendJson = json_decode($express->order_express_extend_json, true);
+            $expressExtendJson['card_id'] = $cardId;
+        }
+
+        $express->order_express_extend_json = json_encode($expressExtendJson);
+        $express->save();
+    }
 }

+ 112 - 1
app/admin/controller/order/GoodsController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CardService;
 use app\admin\service\coupon\CouponDetailService;
 use app\admin\service\member\MemberService;
 use app\admin\service\order\OrderService;
@@ -10,6 +11,7 @@ use app\admin\service\order\PayDetailService;
 use app\admin\validate\order\OrderValidate;
 use app\controller\Curd;
 use app\model\Appointment;
+use app\model\Card;
 use app\model\CouponDetail;
 use app\model\Goods;
 use app\model\GoodsComponent;
@@ -503,6 +505,32 @@ class GoodsController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary']) && !empty($premises)) {
+                        if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -658,6 +686,9 @@ class GoodsController extends Curd
             _syslog("订单", "创建订单失败");
             return json_fail('创建订单失败');
         }
+        if (!empty($params['dept_premises_id'])) {
+            $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
+        }
         Db::beginTransaction();
         try {
             // 使用优惠券
@@ -800,6 +831,32 @@ class GoodsController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary']) && !empty($premises)) {
+                            if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1197,6 +1254,33 @@ class GoodsController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary']) && !empty($premises)) {
+                        $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                        if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -1574,6 +1658,33 @@ class GoodsController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary']) && !empty($premises)) {
+                            $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                            if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1794,7 +1905,7 @@ class GoodsController extends Curd
                             $payAmountUseCoupon = $params['order_amount_pay'] - ($params['order_amount_total'] - $orderAmount['amount']);
                             if (in_array($goods['goods_id'], $orderAmount['goodsIds'])) {
                                 $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $orderAmount['amount']) * $payAmountUseCoupon, 2);
-                            }else{
+                            } else {
                                 $amountPay = floatval($goods['goods_sales_price']) * $goods['nbr'];
                             }
                         } else {

+ 125 - 0
app/admin/controller/order/PackagesController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CardService;
 use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
 use app\admin\service\order\OrderService;
@@ -10,6 +11,7 @@ use app\admin\service\order\PayDetailService;
 use app\admin\validate\order\OrderValidate;
 use app\controller\Curd;
 use app\model\Appointment;
+use app\model\Card;
 use app\model\ClientConfig;
 use app\model\Coupon;
 use app\model\CouponDetail;
@@ -543,6 +545,35 @@ class PackagesController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        if (empty($premises)) {
+                            return json_fail('请选择服务场所');
+                        }
+                        if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -606,6 +637,9 @@ class PackagesController extends Curd
             // 配送方式
             if (isset($params['delivery']) && ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL')) { // 自提/ 到店
                 $orderConfigJson['premises'] = $params['dept_premises_id'];
+                if (!empty($premises)){
+                    $orderConfigJson['dept'] = $premises->dept_id;
+                }
             }
 
             if (isset($params['delivery']) && in_array($params['delivery'], ['PICKUP', 'ARRIVAL']) && !empty($params['dept_premises_id'])) {
@@ -665,6 +699,10 @@ class PackagesController extends Curd
         if (in_array('PACKAGE', $goodsClassifys)) {
             $params['submit_goods_classify'] = 'PACKAGE';
         }
+        $premises = [];
+        if (!empty($params['dept_premises_id'])) {
+            $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
+        }
 
         Db::beginTransaction();
         try {
@@ -829,6 +867,35 @@ class PackagesController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            if (empty($premises)) {
+                                return json_fail('请选择服务场所');
+                            }
+                            if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1210,6 +1277,35 @@ class PackagesController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        if (empty($premises)) {
+                            return json_fail('请选择服务场所');
+                        }
+                        if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -1647,6 +1743,35 @@ class PackagesController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            if (empty($premises)) {
+                                return json_fail('请选择服务场所');
+                            }
+                            if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];

+ 126 - 1
app/admin/controller/order/ServicesController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CardService;
 use app\admin\service\member\MemberService;
 use app\admin\service\order\OrderService;
 use app\admin\service\order\OrderSheetService;
@@ -9,6 +10,7 @@ use app\admin\service\order\PayDetailService;
 use app\admin\validate\order\OrderValidate;
 use app\controller\Curd;
 use app\model\Appointment;
+use app\model\Card;
 use app\model\CouponDetail;
 use app\model\Goods;
 use app\model\GoodsComponent;
@@ -481,6 +483,35 @@ class ServicesController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        if (empty($premises)) {
+                            return json_fail('请选择服务场所');
+                        }
+                        if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -599,6 +630,10 @@ class ServicesController extends Curd
         if (!OrderService::checkGoodsLimit($params['goodsContentList'], $params['join_order_member_id'])) {
             return json_fail('超出产品限额');
         }
+        $premises = [];
+        if (!empty($params['dept_premises_id'])) {
+            $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
+        }
 
         Db::beginTransaction();
         try {
@@ -760,6 +795,35 @@ class ServicesController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            if (empty($premises)) {
+                                return json_fail('请选择服务场所');
+                            }
+                            if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1148,6 +1212,35 @@ class ServicesController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        if (empty($premises)) {
+                            return json_fail('请选择服务场所');
+                        }
+                        if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -1596,6 +1689,35 @@ class ServicesController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            if (empty($premises)) {
+                                return json_fail('请选择服务场所');
+                            }
+                            if (!in_array($premises->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $premises->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1837,8 +1959,11 @@ class ServicesController extends Curd
             }
             _syslog("订单", "订单支付成功");
             return json_success('支付成功');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            _syslog("订单", "订单支付失败:".$e->getMessage());
+            return json_fail('支付失败:'.$e->getMessage());
         } catch (\Exception $e) {
-            dump($e->getMessage());
             Db::rollBack();
             _syslog("订单", "订单支付失败");
             return json_fail('支付失败');

+ 127 - 5
app/admin/controller/order/WholeController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CardService;
 use app\admin\service\coupon\CouponDetailService;
 use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
@@ -1069,6 +1070,36 @@ class WholeController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        if (empty($premises)){
+                            throw new BusinessException("当前订单没有指定门店");
+                        }
+                        $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                        if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -1593,6 +1624,36 @@ class WholeController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡【".$cardNbr."】结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            if (empty($premises)){
+                                throw new BusinessException("当前订单没有指定门店");
+                            }
+                            $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                            if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡【".$cardNbr."】结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];
@@ -1835,6 +1896,11 @@ class WholeController extends Curd
             }
             _syslog("订单", "订单支付成功");
             return json_success('支付成功');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            _syslog("订单", "订单支付失败:".$e->getMessage());
+
+            return json_fail('支付失败:'.$e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
             _syslog("订单", "订单支付失败");
@@ -1996,6 +2062,9 @@ class WholeController extends Curd
         if (!empty($params['dept_premises_id'])) {
             $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
         }
+        if (empty($premises)) {
+            return json_fail('请选择餐厅');
+        }
 
         $params['goods_classify'] = $goodsClassifys[0];
         Db::beginTransaction();
@@ -2253,6 +2322,33 @@ class WholeController extends Curd
                 if (!$account) {
                     throw new BusinessException('账户异常');
                 }
+                // 检测专用卡
+                $cardModel = Card::with([
+                    'main' => function ($query) {
+                        $query->select('card_main_id', 'card_main_json');
+                    }
+                ])->where('card_id', $cardNbr)
+                    ->first();
+                if (!empty($cardModel->main)) {
+                    $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                    // 限制商品
+                    if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                        $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                        $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                        $diff = array_diff($goodsIds, $cardGoodsIds);
+                        if (!empty($diff)) {
+                            $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                            throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                    // 限制门店
+                    if (!empty($cardMainJson['premises_ary'])) {
+                        $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                        if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                            throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡结算范围内,请更换支付方式");
+                        }
+                    }
+                }
                 $amount = $account->member_account_surplus + $account->member_account_added;
                 if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
@@ -2510,7 +2606,6 @@ class WholeController extends Curd
 
             // 打小票
             if (!empty($premises) && isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
-                dump("insert 打小票");
                 if ($premises->dept_category != '餐厅') {
                     $restaurant = SysDept::where('dept_super_id', $premises->dept_id)->where('dept_category', '餐厅')->first();
                 } else {
@@ -2576,14 +2671,10 @@ class WholeController extends Curd
             return json_success('创建订单成功');
         } catch (BusinessException $e) {
             Db::rollBack();
-            dump($e->getMessage());
-            dump($e->getTrace());
             _syslog("订单", $e->getMessage());
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
-            dump($e->getMessage());
-            dump($e->getTrace());
             _syslog("订单", "创建订单失败");
             return json_fail('创建订单失败');
         }
@@ -2671,6 +2762,9 @@ class WholeController extends Curd
         if (!empty($params['dept_premises_id'])) {
             $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
         }
+        if (empty($premises)) {
+            return json_fail('请选择餐厅');
+        }
 
         Db::beginTransaction();
         try {
@@ -2829,6 +2923,34 @@ class WholeController extends Curd
                         Db::rollBack();
                         return json_fail('账户异常');
                     }
+                    // 检测专用卡
+                    $cardModel = Card::with([
+                        'main' => function ($query) {
+                            $query->select('card_main_id', 'card_main_json');
+                        }
+                    ])->where('card_id', $cardNbr)
+                        ->first();
+                    if (!empty($cardModel->main)) {
+                        $cardMainJson = json_decode($cardModel->main->card_main_json, true);
+                        // 限制商品
+                        if (!empty($cardMainJson['goods_ary']) || !empty($cardMainJson['goods_category_ary'])) {
+                            $goodsIds = array_column($params['goodsContentList'], 'goods_id');
+                            $cardGoodsIds = CardService::getCardGoods($cardMainJson['goods_ary'], $cardMainJson['goods_category_ary']);
+                            $diff = array_diff($goodsIds, $cardGoodsIds);
+                            if (!empty($diff)) {
+                                $goodsNameArr = Goods::whereIn('goods_id', $diff)->pluck('goods_name')->toArray();
+                                throw new BusinessException("产品:【" . implode('】【', $goodsNameArr) . "】不在储值卡【".$cardNbr."】结算范围内,请更换支付方式");
+                            }
+                        }
+                        // 限制门店
+                        if (!empty($cardMainJson['premises_ary'])) {
+                            $dept = SysDept::where('dept_id', $premises->dept_super_id)->first();
+                            if (!empty($dept) && !in_array($dept->dept_id, $cardMainJson['premises_ary'])) {
+                                throw new BusinessException("门店:【" . $dept->dept_name . "】不在储值卡【".$cardNbr."】结算范围内,请更换支付方式");
+                            }
+                        }
+                    }
+
                     // 储值卡账户支付金额
                     if (isset($constituteList2['amount'])) {
                         $params['order_amount_pay'] = $constituteList2['amount'];

+ 171 - 1
app/admin/service/coupon/CardService.php

@@ -3,7 +3,12 @@
 namespace app\admin\service\coupon;
 
 use app\model\Card;
+use app\model\CardMain;
+use app\model\Goods;
 use app\model\MemberAccount;
+use app\model\MemberAccountList;
+use app\model\SysCategory;
+use support\Db;
 use support\Log;
 use support\exception\BusinessException;
 
@@ -35,6 +40,33 @@ class CardService
         return $cardId;
     }
 
+    /**
+     * @Desc 生成按需卡号
+     * @Author Gorden
+     * @Date 2024/12/9 15:02
+     *
+     * @param $demandConfig
+     * @param $lastCard
+     * @return string
+     */
+    public static function generateDemandCardId($demandConfig, $lastCard)
+    {
+        $prefixLength = strlen($demandConfig['prefix']);
+        $suffixLength = strlen($demandConfig['suffix']);
+        $rand = $demandConfig['rand'] ?? 0;
+        if (!empty($lastCard)) {
+            $oldCardId = $lastCard->card_id;
+            $oldCardId = ltrim($oldCardId, $demandConfig['prefix']);
+            $oldCardId = rtrim($oldCardId, $demandConfig['suffix']);
+            $oldCardId = ltrim($oldCardId, $demandConfig['rand']);
+            $number = intval($oldCardId) + 1;
+        } else {
+            $number = $demandConfig['begin'];
+        }
+
+        return $demandConfig['prefix'] . str_pad($number, $demandConfig['length'] - $prefixLength - $suffixLength, $rand, STR_PAD_LEFT) . $demandConfig['suffix'];
+    }
+
     /**
      * @Desc 储值卡过期
      * @Author Gorden
@@ -68,12 +100,150 @@ class CardService
             $cardNow->card_extend_json = json_encode($cardExtendJson);
             $cardNow->save();
 
-            _syslog('储值卡',"【" . $card['card_id'] . '】已过期',false,['card_id'=>$card['card_id']],1001);
+            _syslog('储值卡', "【" . $card['card_id'] . '】已过期', false, ['card_id' => $card['card_id']], 1001);
 
             Log::info("储值卡:【" . $card['card_id'] . '】已过期');
         }
     }
 
+    /**
+     * @Desc 按需发卡
+     * @Author Gorden
+     * @Date 2024/12/9 16:02
+     *
+     * @param $memberId
+     * @param $good
+     * @param $params
+     * @return string
+     * @throws BusinessException
+     */
+    public static function sendDemandCard($memberId, $good, $params)
+    {
+        try {
+            $goodsModel = Goods::where('goods_id', $good['goods_id'])->select('goods_attribute_json')->first();
+            $goodsAttributeJson = json_decode($goodsModel->goods_attribute_json, true);
+            if (!empty($goodsAttributeJson['card_main_id'])) {
+                $cardMain = CardMain::where('card_main_id', $goodsAttributeJson['card_main_id'])->first();
+                $cardMainJson = json_decode($cardMain->card_main_json, true);
+                if ($cardMainJson['issue'] == 'DEMAND') {
+                    return self::issueDemandCard($memberId, $goodsAttributeJson['card_main_id'], $params, $good);;
+                }
+            }
+
+            return false;
+        } catch (\Exception $e) {
+            throw new BusinessException("储值卡发行失败");
+        }
+    }
+
+    /**
+     * @Desc 发行按需卡
+     * @Author Gorden
+     * @Date 2024/12/9 15:27
+     *
+     * @param $memberId
+     * @param $cardMainId
+     * @param $params
+     * @param $good
+     */
+    public static function issueDemandCard($memberId, $cardMainId, $params, $good)
+    {
+        try {
+            $lastCard = Card::where('join_card_main_id', $cardMainId)->orderByDesc('card_addtimes')->first();
+            $cardMain = CardMain::where('card_main_id', $cardMainId)->first();
+            $cardMainJson = json_decode($cardMain->card_main_json, true);
+            $demandConfig = $cardMainJson['demand_config'];
+
+            $cardId = self::generateDemandCardId($demandConfig, $lastCard);
+            // 开卡账户
+            $accountDuedate = '';
+            if ($cardMain->card_main_valid_mode == 'LONG') {
+                $accountDuedate = 0;
+            } elseif ($cardMain->card_main_valid_mode == 'DAYS') {
+                $accountDuedate = date('Y-m-d 23:59:59', strtotime("+ " . ($cardMain->card_main_valid_days - 1) . 'day'));
+            } elseif ($cardMain->card_main_valid_mode == 'DATE') {
+                $accountDuedate = $cardMain->card_main_valid_end;
+            }
+            $accountId = MemberAccount::insertGetId([
+                'join_account_member_id' => $memberId,
+                'member_account_classify' => 'CARD',
+                'member_account_status' => 'ACTIVED',
+                'member_account_category' => 'NORMAL',
+                'member_account_nbr' => $cardId,
+                'member_account_name' => $cardMain->card_main_name,
+                'member_account_income' => $cardMain->card_main_amount,
+                'member_account_surplus' => $cardMain->card_main_amount,
+                'member_account_duedate' => $accountDuedate,
+                'member_account_addtimes' => time()
+            ]);
+
+            // member_account_list 加卡充值记录
+            MemberAccountList::insert([
+                'join_list_member_account_nbr' => $cardId,
+                'join_member_account_list_member_id' => $memberId,
+                'member_account_list_status' => 'ACTIVED',
+                'member_account_list_attr' => 'IN',
+                'member_account_list_classify' => 'CARD',
+                'member_account_list_category' => '绑卡',
+                'member_account_list_datetime' => date('Y-m-d H:i:s'),
+                'member_account_list_amount' => $cardMain->card_main_amount,
+                'member_account_list_addtimes' => time()
+            ]);
+
+            // 存卡数据
+            $cardModel = new Card();
+            $cardModel->card_id = $cardId;
+            $cardModel->join_card_member_id = $memberId;
+            $cardModel->join_card_member_account_id = $accountId;
+            $cardModel->join_card_main_id = $cardMainId;
+            $cardModel->card_assign_datetime = date('Y-m-d H:i:s');
+            $cardModel->card_status = 'USED';
+            $cardModel->card_json = json_encode([
+                'order_id' => $params['orderId'],
+                'goods_id' => $good['goods_id'],
+                'order_amount_pay' => $params['order_amount_pay']
+            ]);
+            $cardModel->is_issue = 'Y';
+            $cardModel->card_extend_json = json_encode([
+                'buy_member' => $memberId,
+                'buy_datetime' => date('Y-m-d H:i:s'),
+                'buy_order_id' => $params['orderId'],
+                'used_datetime' => date('Y-m-d H:i:s')
+            ]);
+            $cardModel->card_addtimes = time();
+            $cardModel->save();
+
+            return $cardId;
+        } catch (\Exception $e) {
+            Log::error("生成卡号失败", ['msg' => $e->getMessage()]);
+            throw new BusinessException("生成卡号失败");
+        }
+    }
+
+    /**
+     * @Desc 卡包含的所哟商品
+     * @Author Gorden
+     * @Date 2024/12/9 17:03
+     *
+     * @param $goodsId
+     * @param $goodsCategory
+     * @return array
+     */
+    public static function getCardGoods($goodsId, $goodsCategory)
+    {
+        $categoryId = [];
+        foreach ($goodsCategory as $item) {
+            array_push($categoryId, $item);
+            $categoryIds = SysCategory::where('category_super_path', 'like', '#' . $item . '#')->pluck('category_id')->toArray();
+            $categoryId = array_merge($categoryId, $categoryIds);
+        }
+
+        $goodsIds = Goods::whereIn('join_goods_category_id', $categoryId)->pluck('goods_id')->toArray();
+        $goodsIds = array_unique(array_merge($goodsId));
+
+        return $goodsIds;
+    }
+
     public static $status = [
         'INIT' => '待分配',
         'WAITING' => '已分配,待售',