Browse Source

Merge branch 'dev'

gorden 4 months ago
parent
commit
5437fd556e

+ 10 - 0
app/admin/controller/coupon/CouponController.php

@@ -49,6 +49,9 @@ class CouponController extends Curd
             $where['coupon_addtimes'][0] = strtotime($where['coupon_addtimes'][0]);
             $where['coupon_addtimes'][1] = strtotime($where['coupon_addtimes'][1]);
         }
+        if (!empty($where['coupon_id'])) {
+            $where['coupon_id'] = ['like', trim($where['coupon_id'])];
+        }
         $order = $request->get('order', 'desc');
         $field = $field ?? 'coupon_addtimes';
         $query = $this->doSelect($where, $field, $order);
@@ -358,6 +361,10 @@ class CouponController extends Curd
             $couponJson['premises_range'] = '部分门店可用';
         }
 
+        if (in_array($data['coupon_classify'], ['抵用券', '立减券', '赠品券', '福利券', '年卡', '季卡', '月卡'])) {
+            $data['coupon_minimum_limit'] = 0;
+        }
+
         $data['coupon_json'] = json_encode($couponJson, JSON_UNESCAPED_UNICODE);
 
         // 处理周期优惠券
@@ -732,6 +739,9 @@ class CouponController extends Curd
                 'nbr' => $params['period_nbr']
             ]);
         }
+        if (in_array($data['coupon_classify'], ['抵用券', '立减券', '赠品券', '福利券', '年卡', '季卡', '月卡'])) {
+            $data['coupon_minimum_limit'] = 0;
+        }
 
         unset($data[$primary_key]);
         return [$id, $data];

+ 66 - 1
app/admin/controller/coupon/CouponDetailController.php

@@ -136,6 +136,7 @@ class CouponDetailController extends Curd
                     $item['member_used'] += 1;
                 }
             }
+            unset($item['detail']);
             if (!empty($item['coupon_detail_extend_json'])) {
                 $couponDetailExtendJson = json_decode($item['coupon_detail_extend_json'], true);
                 if (isset($couponDetailExtendJson['gettype'])) {
@@ -312,6 +313,70 @@ class CouponDetailController extends Curd
         return json_success('', $data);
     }
 
+    /**
+     * @Desc 推广的优惠券
+     * @Author Gorden
+     * @Date 2024/11/5 13:39
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function promotionCoupon(Request $request)
+    {
+        $goods = $request->get('goods', []);
+        $goodsIds = array_column($goods, 'goods_id');
+        $goods = array_column($goods, null, 'goods_id');
+
+        $coupons = Coupon::where('coupon_category', 'PROMOTION')
+            ->where('coupon_status', 'ACTIVED')
+            ->select('coupon_id')
+            ->get()
+            ->toArray();
+        $data = [];
+        foreach ($coupons as $coupon) {
+            $couponGoods = CouponGoods::whereIn('join_coupon_goods_id', $goodsIds)
+                ->where('join_goods_coupon_id', $coupon['coupon_id'])
+                ->select('join_goods_coupon_id', 'join_coupon_goods_id')
+                ->get()
+                ->toArray();
+            $money = 0;
+            $moneyGoodsIds = [];
+            foreach ($couponGoods as $couponGood) {
+                if (isset($goods[$couponGood['join_coupon_goods_id']]) && !in_array($couponGood['join_coupon_goods_id'], $moneyGoodsIds)) {
+                    $good = $goods[$couponGood['join_coupon_goods_id']];
+                    $money = $money + ($good['price'] * $good['nbr']);
+                    $moneyGoodsIds[] = $couponGood['join_coupon_goods_id'];
+                }
+            }
+            if ($money <= 0){
+                continue;
+            }
+            $promotionCoupon = Coupon::where('coupon_id', $coupon['coupon_id'])
+                ->where(function ($query) use ($money) {
+                    $query->where('coupon_minimum_limit', 0)
+                        ->orWhere('coupon_minimum_limit', '<=', $money);
+                })->select('coupon_id', 'coupon_name', 'coupon_minimum_limit', 'coupon_classify', 'coupon_value', 'coupon_category', 'coupon_priority')
+                ->first();
+            if (empty($promotionCoupon)) {
+                continue;
+            }
+            $promotionCoupon = $promotionCoupon->toArray();
+            $classify = CouponService::couponClassifyInfo($promotionCoupon['coupon_classify'], $promotionCoupon['coupon_category'], $promotionCoupon['coupon_value'], $promotionCoupon['coupon_minimum_limit']);
+            $data[] = [
+                'coupon_id' => $promotionCoupon['coupon_id'],
+                'coupon_name' => $promotionCoupon['coupon_name'],
+                'classify' => $classify,
+                'count' => 1,
+                'coupon_classify' => $promotionCoupon['coupon_classify'],
+                'coupon_value' => $promotionCoupon['coupon_value'] ?? '',
+                'coupon_minimum_limit' => $promotionCoupon['coupon_minimum_limit'] ?? '',
+                'priority' => $promotionCoupon['coupon_priority']
+            ];
+        }
+
+        return json_success('', $data);
+    }
+
     /**
      * @Desc 导出优惠券明细
      * @Author Gorden
@@ -437,7 +502,7 @@ class CouponDetailController extends Curd
 
             $data[] = [
                 'cert_name' => $certName,
-                'mobile'=>$mobile,
+                'mobile' => $mobile,
 //                'member_name' => MemberService::getMemberCertName($mobile, $certName, ''),
                 'referrer_name' => $detail['referrer_name'] ?? '',
                 'coupon_name' => $detail['coupon_name'] ?? '',

+ 15 - 5
app/admin/controller/order/GoodsController.php

@@ -211,7 +211,7 @@ class GoodsController extends Curd
                 ->exists()) {
                 $item['have_success_paydetail'] = 'Y';
             }
-            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'],$item['order_id']);
+            $item['payDetail'] = PayDetailService::getPayWay($item['order_groupby'], $item['order_id']);
         }
 
         return $items;
@@ -1786,19 +1786,29 @@ class GoodsController extends Curd
             }
             // 推荐人
             $params['order_extend_json']['referee'] = $params['referee'] ?? '';
+            $orderAmount = [];
             foreach ($params['goodsContentList'] as $goods) {
+                $amountPay = floatval($goods['goods_sales_price']) * $goods['nbr'];
                 $discountJson = [];
                 if (!empty($params['order_discount_json'])) {
                     $discountJson = json_decode($params['order_discount_json'], true);
                     foreach ($discountJson as &$item) {
+                        if (!empty($item['coupon_id'])) {
+                            $orderAmount = OrderService::countAndAmount($params['goodsContentList'], $item['coupon_id']);
+                            $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 {
+                            $orderAmount['amount'] = $params['order_amount_total'];
+                            $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
+                        }
                         if (!empty($item['coupon_value'])) {
-                            $item['coupon_value'] = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $item['coupon_value'], 2);
+                            $item['coupon_value'] = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $orderAmount['amount']) * $item['coupon_value'], 2);
                         }
                     }
                 }
                 $orderId = 'OD' . date('ymdHi') . random_string(4, 'up');
-                $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
-//                $amountPay = round(floatval($goods['goods_sales_price']) * $goods['nbr'] * $params['order_ratio'], 2);
                 $data = [
                     'order_id' => $orderId,
                     'order_groupby' => $params['orderGroupId'],
@@ -1814,7 +1824,7 @@ class GoodsController extends Curd
                     'order_status_storage' => $params['order_status_storage'],
                     'order_platform' => $params['order_platform'],
                     'order_remark' => $params['order_remark'] ?? '',
-                    'order_discount_json' => json_encode($discountJson),
+                    'order_discount_json' => (!empty($orderAmount['goodsIds']) && in_array($goods['goods_id'], $orderAmount['goodsIds'])) || (empty($orderAmount['goodsIds']) && !empty($orderAmount['amount'])) ? json_encode($discountJson) : '[]',
                     'order_config_json' => $params['order_config_json'] ?? '[]',
                     'order_express_json' => $params['order_express_json'] ?? '[]',
                     'order_extend_json' => $params['order_extend_json'] ? json_encode($params['order_extend_json']) : '[]',

+ 73 - 140
app/admin/controller/order/PackagesController.php

@@ -30,6 +30,7 @@ use app\model\SysDept;
 use app\model\SysUser;
 use support\Db;
 use support\exception\BusinessException;
+use support\Log;
 use support\Redis;
 use support\Request;
 use support\Response;
@@ -374,17 +375,12 @@ class PackagesController extends Curd
     public function insert(Request $request): Response
     {
         $params = $request->post();
-        // 判断餐品是否连带着服务或实体
-        $goodsClassifys = array_unique(array_column($params['goodsContentList'], 'goods_classify'));
+        // 产品分类
+        $params['goods_classify'] = $params['submit_goods_classify'] = 'PACKAGE';
         $premises = [];
         if (!empty($params['dept_premises_id'])) {
             $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
         }
-
-        if (in_array('PACKAGE', $goodsClassifys)) {
-            $params['submit_goods_classify'] = 'PACKAGE';
-        }
-        $params['goods_classify'] = $goodsClassifys[0];
         Db::beginTransaction();
         try {
             // 使用优惠券
@@ -403,19 +399,7 @@ class PackagesController extends Curd
             $params['order_discount_json'] = json_encode($this->discountRecord($couponUseJson, $params));
             // 验证库存
             foreach ($params['goodsContentList'] as $goods) {
-                // 减库存,规格和总库存
-                if (!isset($params['submit_goods_classify']) || !in_array($params['submit_goods_classify'], ['MEALS', 'PACKAGE'])) {
-                    $goodsSku = GoodsSku::where('goods_sku_id', $goods['sku_id'])->first();
-                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json, true);
-                    if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])) {
-                        $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
-                    }
-                    if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)) {
-                        throw new BusinessException('库存不足');
-                    }
-                }
-
-
+                // 减库存,总库存
                 $goodsRunning = GoodsRunning::where('join_running_goods_id', $goods['goods_id'])->first();
                 $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
                 if ($goodsRunning->goods_running_storage < 0) {
@@ -459,21 +443,14 @@ class PackagesController extends Curd
                 throw new BusinessException('检查下单账户');
             }
 
-            $qrcodePayAmount = 0;
             $params['orderId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
             $params['orderGroupId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
 
-            $systemStatus = 'SENDING';  // 待发货
+            $systemStatus = 'WAITING';  // 待使用
             // 立即结算
-            if ($params['settlement_now'] == 'Y') {
-                if (in_array($params['goods_classify'], ['MEALS', 'VIP'])) {
-                    $params['order_is_complete'] = 'Y';
-                    $systemStatus = 'DONE';
-                }
-                if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE']) && $params['delivery'] == 'ARRIVAL') {
-                    $params['order_is_complete'] = 'N';
-                    $systemStatus = "WAITING";
-                }
+            if ($params['settlement_now'] == 'Y' && $params['is_complete'] == 'Y') {
+                $params['order_is_complete'] = 'Y';
+                $systemStatus = "DONE";
             }
 
             if ($params['settlement_now'] == 'Y' && ($params['pay_category'] == 'OFFLINE' || $params['pay_category'] == 'MONEY')) {
@@ -491,7 +468,7 @@ class PackagesController extends Curd
                     throw new BusinessException('账户异常');
                 }
                 $amount = $account->member_account_surplus + $account->member_account_added;
-                if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
+                if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
                 }
                 if ($params['order_amount_pay'] > $account->member_account_surplus) {
@@ -507,7 +484,7 @@ class PackagesController extends Curd
                     $params['order_status_system'] = $systemStatus;
                     $params['order_status_payment'] = 'SUCCESS';
                 }
-            } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'VIP') {    // 余额支付
+            } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'VIP') {    // VIP余额支付
                 $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
                     ->where('member_account_classify', 'VIP')
                     ->where('member_account_status', 'ACTIVED')
@@ -516,7 +493,7 @@ class PackagesController extends Curd
                     throw new BusinessException('账户异常');
                 }
                 $amount = $account->member_account_surplus + $account->member_account_added;
-                if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
+                if ($params['order_amount_pay'] > $amount) {
                     throw new BusinessException('账户余额不足');
                 }
                 if ($params['order_amount_pay'] > $account->member_account_surplus) {
@@ -549,69 +526,6 @@ class PackagesController extends Curd
                     $params['order_status_system'] = $systemStatus;
                     $params['order_status_payment'] = 'SUCCESS';
                 }
-                // 福利账户 300 、 700
-                if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS'])) {
-                    $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
-                        ->where('pay_status', 'SUCCESS')
-                        ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
-                        ->whereIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES'])
-                        ->get()
-                        ->toArray();
-
-                    $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
-
-                    $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
-                        ->where('pay_status', 'SUCCESS')
-                        ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
-                        ->where('pay_category', 'REFUND')
-                        ->get()
-                        ->toArray();
-                    $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
-                    $paySum = 0;
-                    foreach ($payDetailArray as $key => $item) {
-                        if (isset($refundPayDetailArray[$key])) {
-                            $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
-                            continue;
-                        }
-
-                        $paySum = $paySum + $item;
-                    }
-
-                    if ($params['pay_constitute'] == 'N' && 700 - $paySum < $params['order_amount_pay']) {
-                        Db::rollBack();
-                        return json_fail('超出福利限额');
-                    }
-                } else {
-                    $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
-                        ->where('pay_status', 'SUCCESS')
-                        ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
-                        ->whereNotIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES', 'REFUND', 'RECHARGE'])
-                        ->get()
-                        ->toArray();
-
-                    $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
-
-                    $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
-                        ->where('pay_status', 'SUCCESS')
-                        ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
-                        ->where('pay_category', 'REFUND')
-                        ->get()
-                        ->toArray();
-                    $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
-                    $paySum = 0;
-                    foreach ($payDetailArray as $key => $item) {
-                        if (isset($refundPayDetailArray[$key])) {
-                            $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
-                            continue;
-                        }
-
-                        $paySum = $paySum + $item;
-                    }
-
-                    if ($params['pay_constitute'] == 'N' && 300 - $paySum < $params['order_amount_pay']) {
-                        throw new BusinessException('超出福利限额');
-                    }
-                }
 
                 $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
                 $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
@@ -649,45 +563,35 @@ class PackagesController extends Curd
                 }
             }
             if (($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && $params['settlement_now'] == 'Y' && !empty($params['qrcode_nbr'])) {     // 付款码
-                if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount <= 0) {
-                    $params['order_status_system'] = $systemStatus;
-                    $params['order_status_payment'] = 'SUCCESS';
-                }
                 // 不组合或者组合后需要付款码的金额>0
-                if ($params['pay_constitute'] == 'N' || ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0)) {
-                    $result = OrderService::qrcodePay($params);
-                    $result = json_encode($result);
-                    $params['pay_json_response'] = $result;
-                    $result = json_decode($result, true);
+                $result = OrderService::qrcodePay($params);
+                $result = json_encode($result);
+                $params['pay_json_response'] = $result;
+                $result = json_decode($result, true);
 
-                    $prefix = substr($params['qrcode_nbr'], 0, 2);
-                    if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
-                        $params['pay_category'] = 'WXPAY';
-                        if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
-                            $params['order_status_system'] = 'PAYING';
-                            $params['order_status_payment'] = 'PENDING';
-                            $params['order_is_complete'] = 'N';
-//                            Db::rollBack();
-//                            return json_fail('支付失败');
-                        } else {
-                            $params['order_status_system'] = $systemStatus;
-                            $params['order_status_payment'] = 'SUCCESS';
-                        }
-                    } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
-                        $params['pay_category'] = 'ALIPAY';
-                        if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
-                            $params['order_status_system'] = 'PAYING';
-                            $params['order_status_payment'] = 'PENDING';
-                            $params['order_is_complete'] = 'N';
-//                            Db::rollBack();
-//                            return json_fail('支付失败');
-                        } else {
-                            $params['order_status_system'] = $systemStatus;
-                            $params['order_status_payment'] = 'SUCCESS';
-                        }
+                $prefix = substr($params['qrcode_nbr'], 0, 2);
+                if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
+                    $params['pay_category'] = 'WXPAY';
+                    if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
+                        $params['order_status_system'] = 'PAYING';
+                        $params['order_status_payment'] = 'PENDING';
+                        $params['order_is_complete'] = 'N';
                     } else {
-                        throw new BusinessException('付款码无效');
+                        $params['order_status_system'] = $systemStatus;
+                        $params['order_status_payment'] = 'SUCCESS';
+                    }
+                } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
+                    $params['pay_category'] = 'ALIPAY';
+                    if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
+                        $params['order_status_system'] = 'PAYING';
+                        $params['order_status_payment'] = 'PENDING';
+                        $params['order_is_complete'] = 'N';
+                    } else {
+                        $params['order_status_system'] = $systemStatus;
+                        $params['order_status_payment'] = 'SUCCESS';
                     }
+                } else {
+                    throw new BusinessException('付款码无效');
                 }
             }
 
@@ -738,14 +642,12 @@ class PackagesController extends Curd
             return json_success('创建订单成功');
         } catch (BusinessException $e) {
             Db::rollBack();
-            dump($e->getMessage());
-            dump($e->getTrace());
+            Log::error("购买套包失败", ['msg' => $e->getMessage()]);
             _syslog("订单", $e->getMessage());
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
-            dump($e->getMessage());
-            dump($e->getTrace());
+            Log::error("购买套包失败", ['msg' => $e->getMessage()]);
             _syslog("订单", "创建订单失败");
             return json_fail('创建订单失败');
         }
@@ -2065,7 +1967,7 @@ class PackagesController extends Curd
                 }
                 $orderId = 'OD' . date('ymdHi') . random_string(4, 'up');
                 $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
-//                $amountPay = round(floatval($goods['goods_sales_price']) * $goods['nbr'] * $params['order_ratio'], 2);
+
                 $data = [
                     'order_id' => $orderId,
                     'order_groupby' => $params['orderGroupId'],
@@ -2097,10 +1999,13 @@ class PackagesController extends Curd
                 $params['order_express_goods'] = json_encode(['sheet' => $sheetIds]);
 
                 $this->insertExpressOne($params, $orderId);
-                // 写到权益里
                 if ($params['order_status_payment'] == 'SUCCESS') {
+                    // 写到权益里
                     $this->insertBenefitOne($params, $goods, $orderId);
+                    // 发放卡券
+                    $this->sendCoupon($params, $goods, $orderId);
                 }
+
             }
         } catch (\Exception $e) {
             dump($e->getMessage() . '|' . $e->getLine());
@@ -2171,6 +2076,34 @@ class PackagesController extends Curd
         }
     }
 
+    /**
+     * @Desc 发放卡券
+     * @Author Gorden
+     * @Date 2024/11/4 11:47
+     *
+     * @param $params
+     * @param $goods
+     * @param $orderId
+     * @return void
+     * @throws BusinessException
+     */
+    public function sendCoupon($params, $goods, $orderId)
+    {
+        try {
+            $couponSendParams = [
+                'gettype' => 'PACKAGE',
+                'member_id' => $params['join_order_member_id'],
+                'orderId' => $orderId,
+                'join_sheet_goods_id' => $goods['goods_id']
+            ];
+
+            CouponService::autoSendCouponByGoods($couponSendParams);
+        } catch (\Exception $e) {
+            throw new BusinessException("卡券发放失败");
+        }
+
+    }
+
     /**
      * @Desc 单套包权益
      * @Author Gorden
@@ -2185,7 +2118,6 @@ class PackagesController extends Curd
     {
         $params['orderId'] = $orderId;
         $writeOffDate = [];
-        $applyData = [];
         if (isset($goods['goods_classify']) && $goods['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') {  // 一个套餐买多个
             $params['packageId'] = $goods['goods_id'];
             $components = GoodsComponent::with([
@@ -2519,7 +2451,8 @@ class PackagesController extends Curd
             ];
             Appointment::insert($data);
         } catch (\Exception $e) {
-            dump($e->getMessage());
+            Log::error('创建权益记录失败', ['msg' => $e->getMessage()]);
+
             throw new BusinessException("创建权益记录失败");
         }
     }

+ 4 - 0
app/admin/controller/order/RefundController.php

@@ -619,6 +619,7 @@ class RefundController extends Curd
             throw new BusinessException("余额账户异常");
         }
         $account->member_account_surplus = $account->member_account_surplus + $amount;
+        $account->member_account_expend  = $account->member_account_expend - $amount;
         $account->save();
     }
 
@@ -639,6 +640,7 @@ class RefundController extends Curd
             throw new BusinessException("余额账户异常");
         }
         $account->member_account_surplus = $account->member_account_surplus + $amount;
+        $account->member_account_expend  = $account->member_account_expend - $amount;
         $account->save();
     }
 
@@ -659,6 +661,7 @@ class RefundController extends Curd
             throw new BusinessException("余额账户异常");
         }
         $account->member_account_surplus = $account->member_account_surplus + $amount;
+        $account->member_account_expend  = $account->member_account_expend - $amount;
         $account->save();
     }
 
@@ -680,6 +683,7 @@ class RefundController extends Curd
             throw new BusinessException("储值卡账户异常");
         }
         $account->member_account_surplus = $account->member_account_surplus + $amount;
+        $account->member_account_expend  = $account->member_account_expend - $amount;
         $account->save();
     }
 

+ 15 - 3
app/admin/controller/order/ServicesController.php

@@ -1918,18 +1918,30 @@ class ServicesController extends Curd
             }
             // 推荐人
             $params['order_extend_json']['referee'] = $params['referee'] ?? '';
+            $orderAmount = [];
             foreach ($params['goodsContentList'] as $goods) {
+                $amountPay = floatval($goods['goods_sales_price']) * $goods['nbr'];
                 $discountJson = [];
                 if (!empty($params['order_discount_json'])) {
                     $discountJson = json_decode($params['order_discount_json'], true);
                     foreach ($discountJson as &$item) {
+                        if (!empty($item['coupon_id'])) {
+                            $orderAmount = OrderService::countAndAmount($params['goodsContentList'], $item['coupon_id']);
+                            $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 {
+                            $orderAmount['amount'] = $params['order_amount_total'];
+                            $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
+                        }
                         if (!empty($item['coupon_value'])) {
-                            $item['coupon_value'] = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $item['coupon_value'], 2);
+                            $item['coupon_value'] = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $orderAmount['amount']) * $item['coupon_value'], 2);
                         }
                     }
                 }
                 $orderId = 'OD' . date('ymdHi') . random_string(4, 'up');
-                $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
+//                $amountPay = round((floatval($goods['goods_sales_price']) * $goods['nbr'] / $params['order_amount_total']) * $params['order_amount_pay'], 2);
 //                $amountPay = round(floatval($goods['goods_sales_price']) * $goods['nbr'] * $params['order_ratio'], 2);
                 $data = [
                     'order_id' => $orderId,
@@ -1946,7 +1958,7 @@ class ServicesController extends Curd
                     'order_status_storage' => $params['order_status_storage'],
                     'order_platform' => $params['order_platform'],
                     'order_remark' => $params['order_remark'] ?? '',
-                    'order_discount_json' => json_encode($discountJson),
+                    'order_discount_json' => (!empty($orderAmount['goodsIds']) && in_array($goods['goods_id'], $orderAmount['goodsIds'])) || (empty($orderAmount['goodsIds']) && !empty($orderAmount['amount'])) ? json_encode($discountJson) : '[]',
                     'order_config_json' => $params['order_config_json'] ?? '[]',
                     'order_express_json' => $params['order_express_json'] ?? '[]',
                     'order_extend_json' => $params['order_extend_json'] ? json_encode($params['order_extend_json']) : '[]',

+ 23 - 0
app/admin/controller/order/WholeController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CouponDetailService;
 use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
 use app\admin\service\order\OrderService;
@@ -5339,6 +5340,28 @@ class WholeController extends Curd
                 return json_fail("参数异常");
             }
         }
+        // 是否是推广券
+        $promotionCoupon = Coupon::whereIn('coupon_id', $coupon)
+            ->where('coupon_category', 'PROMOTION')
+            ->select('coupon_id')
+            ->first();
+        if (!empty($promotionCoupon)) {
+            // 是否已有
+            $couponDetail = CouponDetail::whereIn('join_detail_coupon_id', $coupon)
+                ->where('join_coupon_detail_member_id', $memberId)
+                ->whereIn('coupon_detail_status', ['INIT', 'PENDING', 'ACTIVED'])
+                ->first();
+            if (empty($couponDetail)) {
+                $chooseCoupons[] = [
+                    'id' => $coupon[0],
+                    'nbr' => 1,
+                    'gain_datetime' => date('Y-m-d H:i:s')
+                ];
+
+                CouponDetailService::customSendService($chooseCoupons, '', [$memberId], '');
+            }
+        }
+
         $amountBalance = [
             'pay_amount' => $payAmount,
             'welfare_balance' => 0,

+ 58 - 0
app/admin/controller/sys_manage/AdvController.php

@@ -100,6 +100,24 @@ class AdvController extends Curd
                     $item->adv_media_json = "";
                 }
             }
+            if (!empty($item->adv_config_json)) {
+                $configJson = json_decode($item->adv_config_json, true);
+                $item->adv_cover_type = 'cover';
+                if (!empty($configJson['sliderList'])) {
+                    $item->adv_cover_type = 'slider';
+                    $sliderList = [];
+                    foreach ($configJson['sliderList'] as $slider) {
+                        $sliderList[] = [
+                            'cover' => getenv('STORAGE_DOMAIN') . $slider['url'],
+                            'href' => $slider['href']
+                        ];
+                    }
+                    $item->slider_list = $sliderList;
+                }
+                if (!empty($configJson['cover'])) {
+                    $item->cover = getenv('STORAGE_DOMAIN') . $configJson['cover'];
+                }
+            }
         }
 
         return $items;
@@ -119,6 +137,8 @@ class AdvController extends Curd
         $type = $request->post('adv_type', 0);
         $advMain = $request->post('adv_main', '');
         $cover = $request->post('cover', '');
+        $advCoverType = $request->post('adv_cover_type');
+        $sliderList = $request->post('slider_list');
 
         $data = $this->inputFilter($request->post());
         $mediaJson = [];
@@ -136,6 +156,21 @@ class AdvController extends Curd
         }
 
         $data['adv_media_json'] = json_encode($mediaJson);
+        $configJson = [];
+        // 轮播
+        if ($advCoverType == 'slider') {
+            $data['adv_href'] = '';
+            foreach ($sliderList as $slider) {
+                $configJson['sliderList'][] = [
+                    'url' => str_replace(getenv('STORAGE_DOMAIN'), '', $slider['cover']),
+                    'href' => $slider['href']
+                ];
+            }
+        } elseif ($advCoverType == 'cover') {
+            $configJson['cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $cover);
+        }
+
+        $data['adv_config_json'] = json_encode($configJson);
 
         return $data;
     }
@@ -145,12 +180,18 @@ class AdvController extends Curd
         $type = $request->post('adv_type', 0);
         $advMain = $request->post('adv_main', '');
         $cover = $request->post('cover', '');
+        $advCoverType = $request->post('adv_cover_type');
+        $sliderList = $request->post('slider_list');
 
         $primary_key = $this->model->getKeyName();
         $id = $request->post($primary_key);
         $data = $this->inputFilter($request->post());
 
         $model = $this->model->find($id);
+        $configJson = [];
+        if (!empty($model->adv_config_json)) {
+            $configJson = json_decode($model->adv_config_json, true);
+        }
 
         $mediaJson = [];
         if (!empty($model->adv_media_json)) {
@@ -172,6 +213,23 @@ class AdvController extends Curd
 
         $data['adv_media_json'] = json_encode($mediaJson);
 
+        // 轮播
+        if ($advCoverType == 'slider') {
+            $data['adv_href'] = '';
+            unset($configJson['cover']);
+            foreach ($sliderList as $slider) {
+                $configJson['sliderList'][] = [
+                    'url' => str_replace(getenv('STORAGE_DOMAIN'), '', $slider['cover']),
+                    'href' => $slider['href']
+                ];
+            }
+        } elseif ($advCoverType == 'cover') {
+            unset($configJson['sliderList']);
+            $configJson['cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $cover);
+        }
+
+        $data['adv_config_json'] = json_encode($configJson);
+
         if (!$model) {
             throw new BusinessException('记录不存在', 2);
         }

+ 1 - 1
app/admin/controller/sys_manage/CategoryController.php

@@ -41,7 +41,7 @@ class CategoryController extends Curd
         $format = 'tree';
         $order = $request->get('order', 'desc');
         $field = $field ?? 'category_sort';
-        $where['category_status'] = 'ACTIVED';
+        $where['category_status'] = ['in',['ACTIVED','UNSHOW']];
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, 1000);
     }

+ 86 - 0
app/admin/service/coupon/CouponDetailService.php

@@ -4,6 +4,7 @@ namespace app\admin\service\coupon;
 
 use app\model\Coupon;
 use app\model\CouponDetail;
+use app\model\Member;
 use app\model\SysSerial;
 use support\Db;
 use support\exception\BusinessException;
@@ -287,4 +288,89 @@ class CouponDetailService
 
         return $params;
     }
+
+    public static function customSendService($chooseCoupons, $couponUseMember, $memberList, $condition)
+    {
+        if ($couponUseMember == 'condition') {
+            if ($condition == 'is_employ') {
+                $memberList = Member::where('member_classify', 'EMPLOY')->pluck('member_id')->toArray();
+            } elseif ($condition == 'is_member') {
+                $memberList = Member::where('member_classify', 'MEMBER')->pluck('member_id')->toArray();
+            } elseif ($condition == 'is_vip') {
+                $memberList = Member::where('member_is_vip', 'Y')->pluck('member_id')->toArray();
+            }
+        }
+
+        $couponNbr = [];
+        Db::beginTransaction();
+        try {
+            $couponIds = array_column($chooseCoupons, 'id');
+            $coupons = Coupon::whereIn('coupon_id', $couponIds)->get()->toArray();
+            foreach ($coupons as $coupon) {
+                foreach ($chooseCoupons as $chooseCoupon) {
+                    if ($chooseCoupon['id'] == $coupon['coupon_id']) {
+                        if (empty($chooseCoupon['gain_datetime'])) {
+                            $chooseCoupon['gain_datetime'] = date('Y-m-d H:i:s');
+                        }
+                        $params['coupon_id'] = $coupon['coupon_id'];
+                        $params['coupon_detail_gain_datetime'] = date('Y-m-d H:i:s', strtotime($chooseCoupon['gain_datetime']));
+                        if (($coupon['coupon_validdate_day'] == 0 || $coupon['coupon_validdate_day'] == '') && !empty($coupon['coupon_validdate_end'])) {
+                            $params['coupon_detail_deadline_datetime'] = $coupon['coupon_validdate_end'];
+                        } elseif ($coupon['coupon_validdate_day'] > 0) {
+                            $endUnix = strtotime($chooseCoupon['gain_datetime']);
+                            $params['coupon_detail_deadline_datetime'] = date('Y-m-d H:i:s', $endUnix + ($coupon['coupon_validdate_day'] * 24 * 3600) - 1);
+                        }
+                        foreach ($memberList as $item) {
+                            $params['member_id'] = $item;
+                            if ($coupon['coupon_is_period'] == 'Y') {
+//                                if (CouponDetail::where('join_coupon_detail_member_id', $item)->where('join_detail_coupon_id', $coupon['coupon_id'])->exists()) {
+//                                    throw new BusinessException("请勿重复发放周期券");
+//                                }
+                                $params['coupon_detail_period_num'] = 1;
+                                $periodJson = json_decode($coupon['coupon_period_json'], true);
+//                                for ($i=0;$i<$periodJson['nbr'];$i++){
+                                CouponDetailService::sendPeriodCoupon($params);
+//                                }
+
+                                continue;
+                            }
+                            if ($chooseCoupon['nbr'] > 0) {
+                                // 有发行数量
+                                if ($coupon['coupon_number'] != 0) {
+                                    // 查询还有多少张没领的
+                                    $count = CouponDetail::where('join_detail_coupon_id', $coupon['coupon_id'])
+                                        ->whereIn('coupon_detail_status', ['INIT', 'PENDING'])
+                                        ->count();
+                                    if (!isset($couponNbr[$coupon['coupon_id']])) {
+                                        $couponNbr[$coupon['coupon_id']] = $count;
+                                    }
+                                    if ($couponNbr[$coupon['coupon_id']] - $chooseCoupon['nbr'] < 0) {
+                                        throw new BusinessException($coupon['coupon_name'] . "超出发行数量");
+                                    }
+                                    $couponNbr[$coupon['coupon_id']] = $couponNbr[$coupon['coupon_id']] - $chooseCoupon['nbr'];
+                                    $params['chooseCouponNbr'] = $chooseCoupon['nbr'];
+                                    // 匹配已发行的优惠券
+                                    CouponDetailService::customSendCouponHave($params);
+                                } else {
+                                    for ($i = 0; $i < $chooseCoupon['nbr']; $i++) {
+                                        CouponDetailService::customSendCoupon($params);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            Db::commit();
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            Log::error('优惠券发放失败',['msg'=>$e->getMessage()]);
+            throw new BusinessException($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            Log::error('优惠券发放失败',['msg'=>$e->getMessage()]);
+            throw new BusinessException('优惠券发放失败');
+        }
+    }
 }

+ 14 - 15
app/admin/service/goods/GoodsService.php

@@ -567,7 +567,7 @@ class GoodsService
         $categorys = [];
         if (!empty($categoryIds)) {
             $categorys = SysCategory::whereIn('category_id', $categoryIds)
-                ->where('category_status', 'ACTIVED')
+                ->whereIn('category_status', ['ACTIVED','UNSHOW'])
                 ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path')
                 ->orderBy('category_sort', 'DESC')
                 ->get()
@@ -575,7 +575,7 @@ class GoodsService
             $data = array_merge($data, $categorys);
         } else if (!empty($categorySuperId)) {
             $categorys = SysCategory::where('category_super_id', $categorySuperId)
-                ->where('category_status', 'ACTIVED')
+                ->whereIn('category_status', ['ACTIVED','UNSHOW'])
                 ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path')
                 ->orderBy('category_sort', 'DESC')
                 ->get()
@@ -588,7 +588,7 @@ class GoodsService
             $category['category_super_path'] = '#' . $category['id'] . '#';
             // }
             $subCategory = SysCategory::where('category_super_path', 'like', '%' . $category['category_super_path'] . '%')
-                ->where('category_status', 'ACTIVED')
+                ->whereIn('category_status', ['ACTIVED','UNSHOW'])
                 ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path')
                 ->orderBy('category_sort', 'DESC')
                 ->get()
@@ -628,6 +628,7 @@ class GoodsService
             ->orderBy('goods_addtimes', 'DESC')
             ->get()
             ->toArray();
+
         foreach ($goods as &$good) {
             $good['goods_cover'] = getenv('STORAGE_DOMAIN') . $good['goods_cover'];
             $good['goods_running_storage'] = intval($good['goods_running_storage']);
@@ -1310,13 +1311,15 @@ class GoodsService
                 }
                 $data['goods_detail_slider_json'] = rtrim($slider, ',');
             }
-            $extendJson = [];
             if (!empty($data['goods_attribute_json'])) {
-                $extendJson = json_decode($data['goods_attribute_json'], true);
-                $data['goods_attribute_json'] = $extendJson;
-                if (isset($extendJson['premisses'])) {
-                    $data['goods_premisses'] = $extendJson['premisses'];
-                    $data['goods_premisses_str'] = SysDept::whereIn('dept_id', $extendJson['premisses'])->pluck('dept_name');
+                $goodsAttributeJson = json_decode($data['goods_attribute_json'], true);
+                $data['goods_attribute_json'] = $goodsAttributeJson;
+                if (isset($goodsAttributeJson['premisses'])) {
+                    $data['goods_premisses'] = $goodsAttributeJson['premisses'];
+                    $data['goods_premisses_str'] = SysDept::whereIn('dept_id', $goodsAttributeJson['premisses'])->pluck('dept_name');
+                }
+                if (!empty($goodsAttributeJson['coupon'])) {
+                    $data['coupon_list'] = $goodsAttributeJson['coupon'];
                 }
             }
 
@@ -1488,11 +1491,7 @@ class GoodsService
                 $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
             }
             Db::commit();
-        } catch (\PDOException $e) {
-            Db::rollBack();
-            dump($e->getMessage());
-            return json_fail('数据写入失败~');
-        } catch (BusinessException $e) {
+        }  catch (BusinessException $e) {
             Db::rollBack();
             dump($e->getMessage());
             return json_fail($e->getMessage());
@@ -1563,7 +1562,7 @@ class GoodsService
             // 产品运行控制信息表
             self::goodsRunningUpdate($params);
             // sku表
-            self::goodsSkuSet($params, 'update');
+//            self::goodsSkuSet($params, 'update');
 
             Db::commit();
         } catch (BusinessException $e) {

+ 5 - 3
app/admin/service/order/OrderService.php

@@ -644,7 +644,7 @@ class OrderService
                         continue;
                     }
                     Redis::sAdd($cacheKey, $couponId);
-                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                    if ($couponDetail->coupon_category == 'PIECE' || $couponDetail->coupon_category == 'PROMOTION' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
                         $zhekouAmount = round($countAndAmount['amount'] * (100 - $couponDetail->coupon_value) / 100, 2);
                         $payAmount = $payAmount - $zhekouAmount;
                         // json记录
@@ -809,7 +809,7 @@ class OrderService
                         continue;
                     }
                     Redis::sAdd($cacheKey, $couponId);
-                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                    if ($couponDetail->coupon_category == 'PIECE' || $couponDetail->coupon_category == 'PROMOTION' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
                         $zhekouAmount = round($countAndAmount['amount'] * (100 - $couponDetail->coupon_value) / 100, 2);
                         $payAmount = $payAmount - $zhekouAmount;
                     }
@@ -882,17 +882,19 @@ class OrderService
                 ->toArray();
             $count = 0;
             $amount = 0;
+            $goodsIds = [];
             foreach ($couponGoods as $couponGood) {
                 foreach ($goods as $good) {
 //                    if ($good['goods_id'] == $couponGood['join_coupon_goods_id'] && $good['sku_id'] == $couponGood['join_coupon_goods_sku_id']) {
                     if ($good['goods_id'] == $couponGood['join_coupon_goods_id']) {
                         $count += $good['nbr'];
                         $amount += $good['goods_sales_price'] * $good['nbr'];
+                        $goodsIds[] = $good['goods_id'];
                     }
                 }
             }
 
-            return compact('count', 'amount');
+            return compact('count', 'amount','goodsIds');
         } catch (\Exception $e) {
             dump($e->getTrace());
         }

+ 11 - 0
app/event/order/PackageEvent.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace app\event\order;
+
+class PackageEvent
+{
+    public function grant()
+    {
+
+    }
+}

+ 1 - 0
route/admin.php

@@ -1012,6 +1012,7 @@ Route::group('/admin', function () {
             Route::get('/info', [\app\admin\controller\coupon\CouponDetailController::class, 'info']);
             Route::post('/updateStatus', [\app\admin\controller\coupon\CouponDetailController::class, 'updateStatus']);
             Route::get('/myCouponGrouping', [\app\admin\controller\coupon\CouponDetailController::class, 'myCouponGrouping']);
+            Route::get('/promotionCoupon', [\app\admin\controller\coupon\CouponDetailController::class, 'promotionCoupon']);
             Route::get('/export', [\app\admin\controller\coupon\CouponDetailController::class, 'export']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class