Browse Source

Merge branch 'gorden'

gorden 6 months ago
parent
commit
2b8e3f3056

+ 109 - 17
app/admin/controller/coupon/CouponController.php

@@ -133,15 +133,17 @@ class CouponController extends Curd
             } elseif ($item['coupon_validdate_day']) {
                 $item['coupon_use_time'] = 'day';
             }
-            $item['member_count'] = $item['pending_count'] = $item['used_count'] = 0;
+            $item['member_count'] = 0;
+            $item['pending_count'] = 0;
+            $item['used_count'] = 0;
             if (!empty($item['detail'])) {
                 foreach ($item['detail'] as $detail) {
-                    if (!empty($detail['join_coupon_detail_member_id'])){
+                    if (!empty($detail['join_coupon_detail_member_id'])) {
                         $item['member_count'] += 1;
                     }
-                    if ($detail['coupon_detail_status'] == 'PENDING'){
+                    if ($detail['coupon_detail_status'] == 'PENDING') {
                         $item['pending_count'] += 1;
-                    }elseif ($detail['coupon_detail_status'] == 'USED'){
+                    } elseif ($detail['coupon_detail_status'] == 'USED') {
                         $item['used_count'] += 1;
                     }
                 }
@@ -197,7 +199,7 @@ class CouponController extends Curd
             // 关联优惠券和商品、规格
             $this->insertCouponGoods($goods, $data['coupon_id']);
             if ($data['coupon_number'] > 0) {
-                $this->generateCouponDetail($data['coupon_id'], $data['coupon_number']);
+                $this->generateCouponDetail($data['coupon_id'], $data['coupon_status'], $data['coupon_number']);
             }
             Db::commit();
 
@@ -247,12 +249,12 @@ class CouponController extends Curd
         $data = $this->inputFilter($params);
         $data['coupon_id'] = "CU" . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up');
         if (!empty($params['coupon_use_time']) && $params['coupon_use_time'] == 'date') {
-            $data['coupon_validdate_day'] = null;
+            $data['coupon_validdate_day'] = 0;
             $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']));
         } elseif (!empty($params['coupon_use_time']) && $params['coupon_use_time'] == 'day') {
-            $data['coupon_validdate_begin'] = null;
-            $data['coupon_validdate_end'] = null;
+            $data['coupon_validdate_begin'] = '';
+            $data['coupon_validdate_end'] = '';
         }
         $couponJson = [];
         if ($params['coupon_use_member'] == 'member' && isset($params['member_list'])) {
@@ -303,27 +305,47 @@ class CouponController extends Curd
             return json_fail($this->validateClass->getError());
         }
 
+        $params = $request->post();
+
         Db::beginTransaction();
         try {
             [$id, $data] = $this->updateInput($request);
             $originCouponNumber = $data['origin_coupon_number'];
-            unset($data['origin_coupon_number']);
+            $originCouponValiddateDay = $data['origin_coupon_validdate_day'];
+            $originCouponValiddateEnd = $data['origin_coupon_validdate_end'];
+            unset($data['origin_coupon_number'], $data['origin_coupon_validdate_day'], $data['origin_coupon_validdate_end']);
             $this->updateCouponGoods($request->post('goodsContentList'), $id);
-            $this->doUpdate($id, $data);
             if ($originCouponNumber == 0 && $data['coupon_number'] != 0) {
                 // 查已领取多少了
                 $detailCount = CouponDetail::where('join_detail_coupon_id', $id)->count();
                 if ($detailCount < $data['coupon_number']) {
-                    $this->generateCouponDetail($id, $data['coupon_number'] - $detailCount);
+                    $this->generateCouponDetail($id, $data['coupon_status'], $data['coupon_number'] - $detailCount);
                 }
             } else if ($originCouponNumber < $data['coupon_number']) {
-                $this->generateCouponDetail($id, $data['coupon_number'] - $originCouponNumber);
+                $this->generateCouponDetail($id, $data['coupon_status'], $data['coupon_number'] - $originCouponNumber);
             } else if ($originCouponNumber > $data['coupon_number']) {
                 CouponDetail::where('join_detail_coupon_id', $id)
                     ->where('join_coupon_detail_member_id', '')
                     ->limit($originCouponNumber - $data['coupon_number'])
                     ->delete();
             }
+            // 修改时间了
+            if ($params['coupon_use_time'] == 'day' && $originCouponValiddateDay != $data['coupon_validdate_day']) {
+                $this->updateDetailTimeForDay($id, $data['coupon_validdate_day']);
+            } elseif ($params['coupon_use_time'] == 'date' && $originCouponValiddateEnd != $data['coupon_validdate_end']) {
+                $this->updateDetailTimeForDate($id, $data['coupon_validdate_end']);
+            }
+
+
+            // 激活状态,初始改为待领取
+            if ($data['coupon_status'] == 'ACTIVED') {
+                CouponDetail::where('join_detail_coupon_id', $id)->where('coupon_detail_status', 'INIT')->update(['coupon_detail_status' => 'PENDING']);
+            } elseif ($data['coupon_status'] == 'DISABLED') {   // 禁用状态,未领取未使用的都是禁用
+                CouponDetail::where('join_detail_coupon_id', $id)->where('coupon_detail_status', '<>', 'USED')->update(['coupon_detail_status' => 'DISABLED']);
+            }
+
+            $this->doUpdate($id, $data);
+
             Db::commit();
 
             return json_success('success');
@@ -338,6 +360,49 @@ class CouponController extends Curd
 
     }
 
+    public function updateDetailTimeForDay($couponId, $day)
+    {
+        $details = CouponDetail::where('join_detail_coupon_id', $couponId)
+            ->where('coupon_detail_status', '<>', 'USED')
+            ->where('coupon_detail_deadline_datetime', '<>', '')
+            ->get()
+            ->toArray();
+
+        try {
+            foreach ($details as $detail) {
+                $couponDetailGainDatetime = strtotime($detail['coupon_detail_gain_datetime']);
+                CouponDetail::where('coupon_detail_id', $detail['coupon_detail_id'])
+                    ->update([
+                        'coupon_detail_deadline_datetime' => date('Y-m-d H:i:s', $couponDetailGainDatetime + ($day * 24 * 3600))
+                    ]);
+            }
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            throw new BusinessException("优惠券更新失败");
+        }
+    }
+
+    public function updateDetailTimeForDate($couponId, $endDate)
+    {
+        $details = CouponDetail::where('join_detail_coupon_id', $couponId)
+            ->where('coupon_detail_status', '<>', 'USED')
+            ->where('coupon_detail_deadline_datetime', '<>', '')
+            ->get()
+            ->toArray();
+
+        try {
+            foreach ($details as $detail) {
+                CouponDetail::where('coupon_detail_id', $detail['coupon_detail_id'])
+                    ->update([
+                        'coupon_detail_deadline_datetime' => $endDate
+                    ]);
+            }
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            throw new BusinessException("优惠券更新失败");
+        }
+    }
+
     public function updateCouponGoods($goods, $couponId)
     {
         try {
@@ -379,16 +444,20 @@ class CouponController extends Curd
         $id = $request->post($primary_key);
         $data = $this->inputFilter($params);
         if (!empty($params['coupon_use_time']) && $params['coupon_use_time'] == 'date') {
-            $data['coupon_validdate_day'] = null;
+            $data['coupon_validdate_day'] = 0;
             $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']));
         } elseif (!empty($params['coupon_use_time']) && $params['coupon_use_time'] == 'day') {
-            $data['coupon_validdate_begin'] = null;
-            $data['coupon_validdate_end'] = null;
+            $data['coupon_validdate_begin'] = '';
+            $data['coupon_validdate_end'] = '';
         }
         $model = $this->model->find($id);
         // 原数量
         $data['origin_coupon_number'] = $model->coupon_number;
+        // 原优惠天数
+        $data['origin_coupon_validdate_day'] = $model->coupon_validdate_day;
+        // 原结束时间
+        $data['origin_coupon_validdate_end'] = $model->coupon_validdate_end;
         if (!$model) {
             throw new BusinessException('记录不存在', 2);
         }
@@ -435,6 +504,9 @@ class CouponController extends Curd
             $couponJson['premises'] = $params['premises'];
             $couponJson['premises_range'] = '部分门店可用';
         }
+        if (empty($data['coupon_validdate_day'])) {
+            $data['coupon_validdate_day'] = 0;
+        }
 
         $data['coupon_json'] = json_encode($couponJson, JSON_UNESCAPED_UNICODE);
 
@@ -575,24 +647,44 @@ class CouponController extends Curd
         try {
             // 删除优惠券关联的产品
             foreach ($ids as $id) {
+                $couponDetail = CouponDetail::with([
+                    'coupon' => function ($query) {
+                        $query->select('coupon_id', 'coupon_name');
+                    }
+                ])->where('join_detail_coupon_id', $id)
+                    ->where('join_coupon_detail_member_id', '<>', '')
+                    ->first();
+                if (!empty($couponDetail)) {
+                    Db::rollBack();
+
+                    return json_fail($couponDetail->coupon && $couponDetail->coupon->coupon_name ? $couponDetail->coupon->coupon_name . "已被领取,无法删除,请禁用" : "删除的优惠券中有已被领取的,无法删除,请禁用");
+                }
                 CouponGoods::where('join_goods_coupon_id', $id)->delete();
+
+//                CouponDetail::where('join_detail_coupon_id', $id)
+//                    ->whereIn('coupon_detail_status',['INIT','PENDING','ACTIVED'])
+//                    ->delete();
+//                CouponDetail::where('join_detail_coupon_id', $id)
+//                    ->where('coupon_detail_status','WAITING')
+//                    ->update(['coupon_detail_status'=>'DISABLED']);
             }
             $this->doDelete($ids);
             Db::commit();
             return json_success('success');
         } catch (\Exception $e) {
+            dump($e->getMessage());
             Db::rollBack();
             return json_fail('删除失败');
         }
     }
 
-    private function generateCouponDetail($couponId, $nbr)
+    private function generateCouponDetail($couponId, $couponStatus, $nbr)
     {
         for ($i = 0; $i < intval($nbr); $i++) {
             CouponDetail::insert([
                 'coupon_detail_id' => 'CUDT' . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up'),
                 'join_detail_coupon_id' => $couponId,
-                'coupon_detail_status' => 'INIT',
+                'coupon_detail_status' => $couponStatus == 'ACTIVED' ? 'PENDING' : 'INIT',
                 'coupon_detail_addtimes' => time()
             ]);
         }

+ 83 - 4
app/admin/controller/coupon/CouponDetailController.php

@@ -4,6 +4,7 @@ namespace app\admin\controller\coupon;
 
 use app\admin\service\member\MemberService;
 use app\controller\Curd;
+use app\model\Coupon;
 use app\model\CouponDetail;
 use support\Request;
 use support\Response;
@@ -18,9 +19,26 @@ class CouponDetailController extends Curd
     public function select(Request $request): Response
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
-        $where['join_coupon_detail_member_id'] = ['<>', ''];
+//        $where['join_coupon_detail_member_id'] = ['<>', ''];
         $order = $request->get('order', 'desc');
         $field = $field ?? 'coupon_detail_addtimes';
+
+        $couponName = $request->get('coupon_name', '');
+        if (!empty($couponName)) {
+            $couponIds = Coupon::where('coupon_name', 'like', '%' . $couponName . '%')->pluck('coupon_id')->toArray();
+            if (empty($couponIds)) {
+                $couponIds = ['default'];
+            }
+            $where['join_detail_coupon_id'] = ['in', $couponIds];
+        }
+        $addTimes = $request->get('coupon_detail_addtimes', []);
+        if (!empty($addTimes)) {
+            $addTimes[0] = isset($addTimes[0]) ? strtotime($addTimes[0]) : time();
+            $addTimes[1] = isset($addTimes[1]) ? strtotime($addTimes[1]) : time();
+
+            $where['coupon_detail_addtimes'] = $addTimes;
+        }
+
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
@@ -29,7 +47,7 @@ class CouponDetailController extends Curd
     {
         $model = $this->model->with([
             'detail' => function ($query) {
-                $query->select('join_detail_coupon_id', 'coupon_detail_status','coupon_detail_gain_datetime','coupon_detail_used_datetime','coupon_detail_remark');
+                $query->select('join_detail_coupon_id', 'coupon_detail_status', 'coupon_detail_gain_datetime', 'coupon_detail_used_datetime', 'coupon_detail_remark');
             },
             'coupon',
             'member' => function ($query) {
@@ -96,16 +114,77 @@ class CouponDetailController extends Curd
 
             $item['member_used'] = 0;
             foreach ($item['detail'] as $detail) {
-                if ($detail['coupon_detail_status'] == 'USED'){
+                if ($detail['coupon_detail_status'] == 'USED') {
                     $item['member_used'] += 1;
                 }
             }
+            if (!empty($item['coupon_detail_extend_json'])) {
+                $couponDetailExtendJson = json_decode($item['coupon_detail_extend_json'], true);
+                if (isset($couponDetailExtendJson['gettype'])){
+                    $item['gettype'] = $couponDetailExtendJson['gettype'];
+                }
+            }
         }
 
         return $items;
     }
 
-    public function updateStatus(){
+    /**
+     * @Desc 修改状态
+     * @Author Gorden
+     * @Date 2024/8/22 8:44
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function updateStatus(Request $request)
+    {
+        $detailId = $request->post('coupon_detail_id', '');
+        $status = $request->post('status', '');
+
+        $detail = CouponDetail::where('coupon_detail_id', $detailId)->first();
+        if (!$detail) {
+            return json_fail('数据不存在');
+        }
+        //状态 INIT|PENDING=等待领取|ACTIVED=可用|WAITING=已占用(待完成)|USED=已使用|DISABLED|CANCEL|EXPIRED
+        if (!in_array($status, ['INIT', 'PENDING', 'ACTIVED', 'WAITING', 'USED', 'DISABLED', 'CANCEL', 'EXPIRED'])) {
+            return json_fail("状态异常");
+        }
+        try {
+            CouponDetail::where('coupon_detail_id', $detailId)->update(['coupon_detail_status' => $status]);
+
+            return json_success('success');
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('数据修改失败');
+        }
+    }
+
+    /**
+     * @Desc 详情
+     * @Author Gorden
+     * @Date 2024/8/22 11:46
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request): Response
+    {
+        $detailId = $request->get('detail_id','');
+        if (empty($detailId)){
+            return json_fail('参数异常');
+        }
+
+        $detail = CouponDetail::where('coupon_detail_id',$detailId)
+            ->select('coupon_detail_id','coupon_detail_extend_json')
+            ->first();
+        if (!empty($detail->coupon_detail_extend_json)){
+            $couponDetailExtendJson = json_decode($detail->coupon_detail_extend_json,true);
+            if (isset($couponDetailExtendJson['from'])){
+                $detail['from'] = MemberService::getMemberNameByMemberId($couponDetailExtendJson['from']);
+            }
+        }
 
+        return json_success('',$detail);
     }
 }

+ 53 - 5
app/admin/service/member/MemberService.php

@@ -163,6 +163,7 @@ class MemberService
 
             $row['source'] = "APP";
             $row['belong'] = [];
+            $row['referee'] = [];
             if (!empty($row['member_extend_json'])) {
                 $extendJson = json_decode($row['member_extend_json'], true);
                 if (isset($extendJson['come_from'])) {
@@ -177,6 +178,14 @@ class MemberService
                     }
                     $row['belong']['deptName'] = SysDept::where('dept_id', $extendJson['belong']['premises'])->value('dept_name');
                 }
+                if (isset($extendJson['referee'])){
+                    foreach ($extendJson['referee'] as $key => $referee){
+                        $row['referee'][] = [
+                            'name'=>$referee,
+                            'time'=>$key
+                        ];
+                    }
+                }
             }
         }
 
@@ -327,6 +336,7 @@ class MemberService
 
         $member['source'] = "APP";
         $member['belong'] = [];
+        $member['referee'] = [];
         if (!empty($member['member_extend_json'])) {
             $extendJson = json_decode($member['member_extend_json'], true);
             if (isset($extendJson['come_from'])) {
@@ -341,6 +351,14 @@ class MemberService
                 }
                 $member['belong']['deptName'] = SysDept::where('dept_id', $extendJson['belong']['premises'])->value('dept_name');
             }
+            if (isset($extendJson['referee'])){
+                foreach ($extendJson['referee'] as $key => $referee){
+                    $member['referee'][] = [
+                        'name'=>$referee,
+                        'time'=>$key
+                    ];
+                }
+            }
         }
 
         return json_success('', $member);
@@ -1153,17 +1171,47 @@ class MemberService
     public static function getMemberName($mobile, $certName, $nickname)
     {
         $name = '';
-        if (!empty($certName)){
+        if (!empty($certName)) {
             $name = $certName;
-        }elseif (!empty($nickname)){
+        } elseif (!empty($nickname)) {
             $name = $nickname;
         }
-        if (!empty($name) && !empty($mobile)){
-            $name .= '-'.$mobile;
-        }elseif (!empty($mobile)){
+        if (!empty($name) && !empty($mobile)) {
+            $name .= '-' . $mobile;
+        } elseif (!empty($mobile)) {
             $name = $mobile;
         }
 
         return $name;
     }
+
+    public static function getMemberNameByMemberId($memberId)
+    {
+        $member = Member::with([
+                'cert' => function ($query) {
+                    $query->select('join_cert_member_id', 'member_cert_name');
+                },
+                'info' => function ($query) {
+                    $query->select('join_info_member_id', 'member_info_nickname');
+                },
+            ]
+        )->where('member_id', $memberId)
+            ->first();
+        if (empty($member)) {
+            return;
+        }
+        $member = $member->toArray();
+        $mobile = $certName = $nickname = '';
+        if (!empty($member['member_mobile'])) {
+            $mobile = $member['member_mobile'];
+        }
+        if (!empty($member['cert']) && !empty($member['cert']['member_cert_name'])) {
+            $certName = $member['cert']['member_cert_name'];
+        }
+        if (!empty($member['info']) && !empty($member['info']['member_info_nickname'])) {
+            $nickname = $member['info']['member_info_nickname'];
+        }
+
+        return self::getMemberName($mobile, $certName, $nickname);
+    }
 }

+ 1 - 0
route/admin.php

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