gorden il y a 6 mois
Parent
commit
ba72a26ef4

+ 244 - 25
app/admin/controller/coupon/CouponController.php

@@ -8,11 +8,13 @@ use app\controller\Curd;
 use app\model\Coupon;
 use app\model\CouponGoods;
 use app\model\Device;
+use app\model\Member;
 use app\model\SysSerial;
 use support\Db;
 use support\exception\BusinessException;
 use support\Request;
 use support\Response;
+use Tinywan\Jwt\JwtToken;
 
 class CouponController extends Curd
 {
@@ -41,6 +43,48 @@ class CouponController extends Curd
         return $this->doFormat($query, $format, $limit);
     }
 
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'category' => function ($query) {
+                $query->select('category_id', 'category_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
     protected function afterQuery($items)
     {
         foreach ($items as &$item) {
@@ -50,8 +94,7 @@ class CouponController extends Curd
                     if (isset($couponJson['member']['list']) && !empty($couponJson['member']['list'])) {
                         $item['coupon_use_member'] = 'member';
                         $item['memberList'] = $couponJson['member']['list'];
-                    }
-                    if (isset($couponJson['member']['where']) && !empty($couponJson['member']['where'])) {
+                    } else if (isset($couponJson['member']['where']) && !empty($couponJson['member']['where'])) {
                         if (trim($couponJson['member']['where']) == '1') {
                             $item['coupon_use_member'] = 'all';
                         } else {
@@ -59,13 +102,12 @@ class CouponController extends Curd
                             $where = str_replace('`', '', urldecode($couponJson['member']['where']));
                             $whereArr = explode('=', $where);
 //                            dump($whereArr);
-//                            dump($whereArr[1]);
-                            if (isset($whereArr[1]) && trim($whereArr[1]) == 'member_is_vip') {
+                            if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_is_vip') {
                                 $item['condition'] = 'is_vip';
-                            } else if (isset($whereArr[1]) && trim($whereArr[1]) == 'member_classify') {
-                                if (isset($whereArr[1]) && trim($whereArr[1]) == 'MEMBER') {
+                            } else if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_classify') {
+                                if (isset($whereArr[1]) && str_replace("'", '', trim($whereArr[1])) == 'MEMBER') {
                                     $item['condition'] = 'is_member';
-                                } else if (isset($whereArr[1]) && trim($whereArr[1]) == 'EMPLOY') {
+                                } else if (isset($whereArr[1]) && str_replace("'", '', trim($whereArr[1])) == 'EMPLOY') {
                                     $item['condition'] = 'is_employ';
                                 }
                             }
@@ -103,6 +145,14 @@ class CouponController extends Curd
 //        return $items;
 //    }
 
+    /**
+     * @Desc 添加优惠券
+     * @Author Gorden
+     * @Date 2024/8/14 15:16
+     *
+     * @param Request $request
+     * @return Response
+     */
     public function insert(Request $request): Response
     {
         if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) {
@@ -116,7 +166,7 @@ class CouponController extends Curd
         Db::beginTransaction();
         try {
             $data = $this->insertInput($request);
-            dump($data);
+            $data['coupon_creator_user_id'] = JwtToken::getCurrentId();
             $this->doInsert($data);
             // 关联优惠券和商品、规格
             $this->insertCouponGoods($goods, $data['coupon_id']);
@@ -200,17 +250,129 @@ class CouponController extends Curd
         return $data;
     }
 
+    /**
+     * @Desc 修改优惠券
+     * @Author Gorden
+     * @Date 2024/8/14 15:48
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('update')->check($request->post())) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        Db::beginTransaction();
+        try {
+            [$id, $data] = $this->updateInput($request);
+            $this->updateCouponGoods($request->post('goodsContentList'),$id);
+            $this->doUpdate($id, $data);
+            Db::commit();
+
+            return json_success('success');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail('数据更新失败');
+        }
+
+    }
+
+    public function updateCouponGoods($goods, $couponId)
+    {
+        try{
+            $couponGoodsIds = CouponGoods::where('join_goods_coupon_id',$couponId)->pluck('join_coupon_goods_id')->toArray();
+            $goodsIds = array_column($goods,'goods_id');
+            // 新的差集
+            $goodsDiff = array_diff($goodsIds,$couponGoodsIds);
+            // 旧的差集
+            $couponDiff = array_diff($couponGoodsIds,$goodsIds);
+            foreach ($goods as $good) {
+                // 更新两个中都有的
+                if (in_array($good['goods_id'], $couponGoodsIds)) {
+                    CouponGoods::where('join_goods_coupon_id', $couponId)->where('join_coupon_goods_id', $good['goods_id'])->update(['join_coupon_goods_sku_id' => $good['sku_id']]);
+                } elseif (in_array($good['goods_id'], $goodsDiff)) {       // 新加的
+                    CouponGoods::insert([
+                        'join_goods_coupon_id' => $couponId,
+                        'join_coupon_goods_id' => $good['goods_id'],
+                        'join_coupon_goods_sku_id' => $good['sku_id'],
+                        'coupon_goods_json' => '[]',
+                        'coupon_goods_extend_json' => '[]',
+                        'coupon_goods_addtimes' => time()
+                    ]);
+                }
+            }
+            if (!empty($couponDiff)){   // 去掉的
+                foreach ($couponDiff as $item){
+                    CouponGoods::where('join_goods_coupon_id', $couponId)->where('join_coupon_goods_id', $item)->delete();
+                }
+            }
+        }catch (\Exception $e){
+            throw new BusinessException('关联产品更新失败');
+        }
+    }
+
     protected function updateInput(Request $request): array
     {
+        $params = $request->post();
         $primary_key = $this->model->getKeyName();
         $id = $request->post($primary_key);
-        $data = $this->inputFilter($request->post());
-        $data['coupon_begindate'] = date("Y-m-d H:i:s", strtotime($data['coupon_begindate']));
-        $data['coupon_enddate'] = date("Y-m-d H:i:s", strtotime($data['coupon_enddate']));
+        $data = $this->inputFilter($params);
+        $data['coupon_validdate_begin'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_begin']));
+        $data['coupon_validdate_end'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_end']));
         $model = $this->model->find($id);
         if (!$model) {
             throw new BusinessException('记录不存在', 2);
         }
+        $couponJson = [];
+        if (!empty($model->coupon_json)) {
+            $couponJson = json_decode($model->coupon_json, true);
+        }
+        if ($params['coupon_use_member'] == 'member' && isset($params['member_list'])) {
+            $couponJson['member']['list'] = $params['member_list'];
+            if (isset($couponJson['member']['range'])){
+                $couponJson['member']['range'] = '';
+            }
+            if (isset($couponJson['member']['where'])){
+                $couponJson['member']['where'] = '';
+            }
+        } else if ($params['coupon_use_member'] == 'condition') {
+            if (isset($params['condition']) && $params['condition'] == 'is_vip') {
+                $couponJson['member']['range'] = 'VIP会员';
+                $couponJson['member']['where'] = urlencode(" `member_is_vip` = 'Y'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_employ') {
+                $couponJson['member']['range'] = '公司员工';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'EMPLOY'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_member') {
+                $couponJson['member']['range'] = '会员';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'MEMBER'");
+            }
+            if (isset($couponJson['member']['list'])){
+                $couponJson['member']['list'] = [];
+            }
+        } else if ($params['coupon_use_member'] == 'all') {
+            $couponJson['member']['range'] = '不限';
+            $couponJson['member']['where'] = urlencode(" 1");
+
+            if (isset($couponJson['member']['list'])){
+                $couponJson['member']['list'] = [];
+            }
+        }
+
+        if (!empty($params['premises_range']) && $params['premises_range'] == 'all') {
+            $couponJson['premises_range'] = '所有门店可用';
+        } elseif (!empty($params['premises_range']) && $params['premises_range'] == 'part') {
+            $couponJson['premises'] = $params['premises'];
+            $couponJson['premises_range'] = '部分门店可用';
+        }
+
+        $data['coupon_json'] = json_encode($couponJson, JSON_UNESCAPED_UNICODE);
+
         unset($data[$primary_key]);
         return [$id, $data];
     }
@@ -240,10 +402,6 @@ class CouponController extends Curd
             ->toArray();
         $goodsIds = [];
         $goodsContent = [];
-        /**
-         * ({goods_id:itemSub3.goods_id,sku_id:sku_id,sku_name:sku_name,goods_name:itemSub3.name,goods_classify:goods_classify,
-         * goods_sales_price:goods_sales_price,nbr:1,skus:itemSub3.sku})
-         */
         foreach ($couponGoods as $couponGood) {
             $goodsIds[] = $couponGood['join_coupon_goods_id'];
             $content = [
@@ -255,20 +413,21 @@ class CouponController extends Curd
                 $content['goods_classify'] = $couponGood['goods']['goods_classify'];
             }
             if (isset($couponGood['sku']) && isset($couponGood['sku']['goods_sku_specs_json'])) {
-                $skuSpecsJson = json_decode($couponGood['sku']['goods_sku_specs_json'], true);
-                $skuName = '';
-                foreach ($skuSpecsJson as $item) {
-                    if (is_array($item)) {
-                        $item = implode('', $item);
-                    }
-                    $skuName .= $item . ',';
-                }
-                $content['sku_name'] = rtrim($skuName, ',');
+//                $skuSpecsJson = json_decode($couponGood['sku']['goods_sku_specs_json'], true);
+//                $skuName = '';
+//                foreach ($skuSpecsJson as $item) {
+//                    if (is_array($item)) {
+//                        $item = implode('', $item);
+//                    }
+//                    $skuName .= $item . ',';
+//                }
+//                $content['sku_name'] = rtrim($skuName, ',');
                 $content['goods_sales_price'] = $couponGood['sku']['goods_sku_sales_price'];
             }
             if (isset($couponGood['skus'])) {
                 foreach ($couponGood['skus'] as $key => $skus) {
                     if (!empty($skus['goods_sku_specs_json'])) {
+                        $skuSpecsJson = json_decode($skus['goods_sku_specs_json'], true);
                         $skuName = '';
                         foreach ($skuSpecsJson as $item) {
                             if (is_array($item)) {
@@ -283,12 +442,72 @@ class CouponController extends Curd
             }
             $goodsContent[] = $content;
         }
+        // 选中的会员
+        $memberLists = [];
+        if (!empty($coupon->coupon_json)) {
+            $couponJson = json_decode($coupon->coupon_json, true);
+            if (isset($couponJson['member']) && isset($couponJson['member']['list']) && !empty($couponJson['member']['list'])) {
+                $res = Db::table('member')
+                    ->leftjoin('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
+                    ->leftjoin('member_info', 'member.member_id', '=', 'member_info.join_info_member_id')
+                    ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name', 'member_info.member_info_nickname')
+                    ->where('member_status', 'ACTIVED')
+                    ->whereIn('member_id', $couponJson['member']['list'])
+                    ->get();
+                $memberLists = [];
+                foreach ($res as $item) {
+                    $name = '';
+                    if (!empty($item->member_cert_name)) {
+                        $name = $item->member_cert_name;
+                    } else if (!empty($item->member_info_nickname)) {
+                        $name = $item->member_info_nickname;
+                    }
+                    $value = !empty($name) ? $name . '-' : '';
+                    if ($item->member_mobile != '0000') {
+                        $value .= $item->member_mobile;
+                    }
+                    if (empty($value)) {
+                        $value = $item->member_mobile;
+                    }
+                    $value = rtrim($value, '-');
+                    $memberLists[] = [
+                        'key' => $item->member_id,
+                        'value' => $value,
+                    ];
+                }
+            }
+        }
 
         $data = [
             'goods_ids' => $goodsIds,
-            'goods_content' => $goodsContent
+            'goods_content' => $goodsContent,
+            'member_lists' => $memberLists
         ];
 
         return json_success('', $data);
     }
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function delete(Request $request): Response
+    {
+        $ids = $this->deleteInput($request);
+        Db::beginTransaction();
+        try {
+            // 删除优惠券关联的产品
+            foreach ($ids as $id){
+                CouponGoods::where('join_goods_coupon_id',$id)->delete();
+            }
+            $this->doDelete($ids);
+            Db::commit();
+            return json_success('success');
+        }catch (\Exception $e){
+            Db::rollBack();
+            return json_fail('删除失败');
+        }
+    }
 }

+ 1 - 1
app/admin/controller/order/WholeController.php

@@ -2023,7 +2023,7 @@ class WholeController extends Curd
             }
 
             Db::commit();
-            
+
             // 打小票
             if (!empty($premises)){
                 if($premises->dept_category != '餐厅'){

+ 3 - 3
app/admin/validate/coupon/CouponValidate.php

@@ -12,7 +12,7 @@ class CouponValidate extends Validate
      */
     protected $rule = [
         'coupon_id' => 'require|alphaDash',
-        'coupon_status|优惠券状态' => 'require|in:ACTIVED,DISABLED',
+//        'coupon_status|优惠券状态' => 'require|in:ACTIVED,DISABLED',
         'coupon_category|分类' => 'max:32',
         'coupon_name|名称' => 'require|max:32',
         'coupon_validdate_begin|启用日期' => 'require',
@@ -24,7 +24,7 @@ class CouponValidate extends Validate
      * @var array[]
      */
     protected $scene = [
-        'add' => ['coupon_status', 'coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
-        'update' => ['coupon_id', 'coupon_status', 'coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
+        'add' => ['coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
+        'update' => ['coupon_id', 'coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
     ];
 }

+ 4 - 0
app/model/Coupon.php

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