yxjapp 3 months ago
parent
commit
81740941f1

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

@@ -2,10 +2,13 @@
 
 namespace app\admin\controller\coupon;
 
+use app\admin\service\sys_manage\CategoryService;
 use app\controller\Curd;
 use app\model\Card;
 use app\model\CardIssue;
 use app\model\CardMain;
+use app\model\Goods;
+use app\model\SysDept;
 use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
 use Illuminate\Database\Query\Builder as QueryBuilder;
 use support\Db;
@@ -154,6 +157,26 @@ class CardMainController extends Curd
         }
         // 发行记录
         $cardIssue = CardIssue::where('join_issue_card_main_id', $cardMainId)->orderBy('card_issue_addtimes', 'DESC')->get()->toArray();
+        $cardMainJson = json_decode($main->card_main_json, true);
+        // 适用门店
+        $premises = [];
+        if (!empty($cardMainJson['premises_ary'])){
+            $premises = SysDept::whereIn('dept_id',$cardMainJson['premises_ary'])->pluck('dept_name');
+        }
+        $category = [];
+        if (!empty($cardMainJson['goods_category_ary'])){
+            $category = CategoryService::getCategoryAndSupper($cardMainJson['goods_category_ary']);
+        }
+        // 适用产品
+        $goods = [];
+        if (!empty($cardMainJson['goods_ary'])){
+            $goods = Goods::whereIn('goods_id',$cardMainJson['goods_ary'])
+                ->select('goods_id','goods_name','goods_cover','goods_sales_price','goods_addtimes')
+                ->orderByDesc('goods_sort')->orderByDesc('goods_addtimes')->get()->toArray();
+            foreach ($goods as &$goodsItem){
+                $goodsItem['goods_cover'] = getenv("STORAGE_DOMAIN").$goodsItem['goods_cover'];
+            }
+        }
 
         // 发行统计
         $cardTotal = Card::where('join_card_main_id', $cardMainId)->count();
@@ -182,6 +205,9 @@ class CardMainController extends Curd
         $data = [
             'main' => $main,
             'issue' => $cardIssue,
+            'premises'=>$premises,
+            'category'=>$category,
+            'goods'=>$goods,
             'statistics' => $statistics
         ];
 
@@ -230,6 +256,12 @@ 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);
 
@@ -287,6 +319,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);
 
         // 卡状态设置为禁用,则未绑定的卡冻结,恢复未发行状态

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

@@ -1321,7 +1321,7 @@ class MemberController
             $memberAccount = MemberAccount::where('join_account_member_id', $params['member_id'])
                 ->where('member_account_classify', 'CASH')
                 ->first();
-            if ($params['surplus'] + $params['bank_amount'] > $memberAccount->member_account_surplus) {
+            if ($params['surplus'] > $memberAccount->member_account_surplus) {
                 throw new BusinessException("本金退款金额超出账户本金余额");
             }
             if ($params['added'] > $memberAccount->member_account_added) {

+ 2 - 2
app/admin/controller/notify/RechargeController.php

@@ -111,7 +111,7 @@ class RechargeController
         }
         try {
             $updateUserId = JwtToken::getCurrentId();
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
             $updateUserId = 1001;
         }
 
@@ -148,7 +148,7 @@ class RechargeController
             $memberAccount->member_account_update_user_id = $updateUserId ?? 1001;
             $memberAccount->member_account_updatetimes = time();
             $memberAccount->save();
-            if (!empty($goodsAttributeJson)){
+            if (!empty($goodsAttributeJson)) {
                 // 根据最新的数据,更新用户等级
                 RechargeService::disposeRole($payDetail->join_pay_member_id, $payDetail->pay_amount);
 

+ 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'];

+ 5 - 5
app/admin/controller/order/RefundController.php

@@ -928,7 +928,7 @@ class RefundController extends Curd
             Db::beginTransaction();
             $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
             // 应减金额等于 扣除金额 + 银行打款金额
-            $amount = $refundApplyJson['surplus'] + $refundApplyJson['amount'];
+            $amount = $refundApplyJson['surplus'];
             $addedAmount = $refundApplyJson['added'];
             $refundApplyJson['added_amount'] = $addedAmount;
             $refundApplyJson['user_id'] = JwtToken::getCurrentId();
@@ -983,10 +983,10 @@ class RefundController extends Curd
             // 退款记录
             PayDetail::insert($payDetailInsertData);
             // 扣除记录
-            $payDetailInsertData['join_pay_order_id'] = 'ROLE_DEDUCT';
-            $payDetailInsertData['pay_category'] = 'ROLE_DEDUCT';
-            $payDetailInsertData['pay_amount'] = $refundApplyJson['surplus'] + $addedAmount;
-            PayDetail::insert($payDetailInsertData);
+//            $payDetailInsertData['join_pay_order_id'] = 'ROLE_DEDUCT';
+//            $payDetailInsertData['pay_category'] = 'ROLE_DEDUCT';
+//            $payDetailInsertData['pay_amount'] = $refundApplyJson['surplus'] + $addedAmount;
+//            PayDetail::insert($payDetailInsertData);
 
             Db::commit();
 

+ 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'];

+ 5 - 0
app/admin/controller/sys_manage/RoleController.php

@@ -32,10 +32,15 @@ class RoleController extends Curd
 
     public function select(Request $request): Response
     {
+        $keyword = $request->get('keyword');
+
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
         $format = 'tree';
         $order = $request->get('order', 'desc');
         $field = $field ?? 'role_addtimes';
+        if (!empty($keyword)){
+            $where['role_name'] = ['like',$keyword];
+        }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, 1000);
     }

+ 173 - 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,36 @@ 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;
+        $begin = $demandConfig['begin'] ?? 1;
+        if (!empty($lastCard)) {
+            $oldCardId = $lastCard->card_id;
+            $oldCardId = substr($oldCardId, strripos($oldCardId, $demandConfig['prefix']) + $prefixLength);
+            if (strrpos($oldCardId, $demandConfig['suffix']) !== false){
+                $oldCardId = substr($oldCardId, 0, strrpos($oldCardId, $demandConfig['suffix']));
+            }
+
+            $number = intval($oldCardId) + 1;
+        } else {
+            $number = $begin;
+        }
+
+        return $demandConfig['prefix'] . str_pad($number, $demandConfig['length'] - $prefixLength - $suffixLength, $rand, STR_PAD_LEFT) . $demandConfig['suffix'];
+    }
+
     /**
      * @Desc 储值卡过期
      * @Author Gorden
@@ -68,12 +103,149 @@ 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();
+
+        return array_unique(array_merge($goodsId, $goodsIds));
+    }
+
     public static $status = [
         'INIT' => '待分配',
         'WAITING' => '已分配,待售',

+ 1 - 0
app/admin/service/goods/GoodsService.php

@@ -1731,6 +1731,7 @@ class GoodsService
             $model->goods_groupby = $params['goods_groupby'] ?? '';
             $model->goods_remark = $params['goods_remark'] ?? '';
             $model->goods_extend_json = $params['goods_extend_json'] ?? '{}';
+            $model->goods_if_express = $params['goods_if_express'] ?? 'N';
             $model->is_support_appointment = $params['is_support_appointment'] ?? 'N';
             $model->creator_user_id = JwtToken::getCurrentId();
             $model->goods_addtimes = time();

+ 1 - 0
app/admin/service/member/MemberService.php

@@ -1210,6 +1210,7 @@ class MemberService
 //            ->toArray();
 
         $memberAccountList = MemberAccountList::where('join_member_account_list_member_id', $memberId)
+            ->whereIn('member_account_list_classify',['PARTNER','REFERRER','FRANCHISE'])
             ->where('member_account_list_status', 'ACTIVED')
             ->selectRaw('
                 member_account_list_extend_json as join_pay_object_json,

+ 32 - 0
app/admin/service/sys_manage/CategoryService.php

@@ -307,4 +307,36 @@ class CategoryService
         return $category;
     }
 
+    /**
+     * @Desc 获取分类及父级
+     * @Author Gorden
+     * @Date 2024/12/10 15:54
+     *
+     * @param $category_id
+     * @return array
+     */
+    public static function getCategoryAndSupper($category_id = [])
+    {
+        $categoryNames = [];
+        foreach ($category_id as $id) {
+            $category = SysCategory::where('category_id', $id)->first();
+            if (!empty($category) && !empty($category->category_super_path)) {
+                $superIds = array_filter(array_unique(explode('#', $category->category_super_path)));
+                $superCategory = SysCategory::whereIn('category_id', $superIds)->pluck('category_name', 'category_id')->toArray();
+                foreach ($superIds as $superId) {
+                    if (key_exists($superId, $superCategory)) {
+                        if (isset($categoryNames[$id])) {
+                            $categoryNames[$id] = $categoryNames[$id] . $superCategory[$superId] . ' / ';
+                        }else{
+                            $categoryNames[$id] = $superCategory[$superId] . ' / ';
+                        }
+                    }
+                }
+                $categoryNames[$id] = $categoryNames[$id] . $category->category_name;
+            }
+        }
+
+        return $categoryNames;
+    }
+
 }

+ 1 - 1
app/event/statistics/InOutEvent.php

@@ -56,7 +56,7 @@ class InOutEvent
                     ->where('pay_status', 'SUCCESS')
                     ->get()
                     ->toArray();
-            
+            }
             $data = [
                 'dept_id' => 0,
                 'member_id' => $order->join_order_member_id,