486 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			486 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace addons\xilufitness\services;
 | 
						|
 | 
						|
use addons\xilufitness\model\AdminAccess;
 | 
						|
use addons\xilufitness\model\CardCategory;
 | 
						|
use addons\xilufitness\model\CardVerificationRecords;
 | 
						|
use addons\xilufitness\model\TimesCardShare;
 | 
						|
use addons\xilufitness\model\UserCard;
 | 
						|
use PDOStatement;
 | 
						|
use think\Collection;
 | 
						|
use think\Db;
 | 
						|
use think\db\exception\DataNotFoundException;
 | 
						|
use think\db\exception\ModelNotFoundException;
 | 
						|
use think\exception\DbException;
 | 
						|
use think\Log;
 | 
						|
use think\Session;
 | 
						|
 | 
						|
class CardService extends BaseService
 | 
						|
{
 | 
						|
    protected $model = null;
 | 
						|
 | 
						|
    protected function __initialize()
 | 
						|
    {
 | 
						|
        $this->model = new UserCard();
 | 
						|
    }
 | 
						|
 | 
						|
    public function getUserCardList($card_type)
 | 
						|
    {
 | 
						|
        $result = array();
 | 
						|
        $where['user_card.brand_id'] = $this->brand_id;
 | 
						|
        $where['user_card.user_id'] = $this->getUserId();
 | 
						|
        if(empty($card_type) || $card_type==1){
 | 
						|
            $times_list= $this->model
 | 
						|
                ->field(['id as user_card_id','user_id','brand_id','card_no','card_type','left_times_count','open_card_time','effective_date','expire_time','already_share_times','left_share_times','status'])
 | 
						|
                ->with(['category' => function($query){
 | 
						|
                    $query->withField(['cardname', 'cardtype', 'cardtypename', 'card_avatar', 'card_desc', 'timescardquota', 'sharetimes', 'cardprice', 'expiretimes', 'expiretype', 'shop_name', 'apply_shop', 'apply_course', 'use_limits']);
 | 
						|
                }])
 | 
						|
                ->where($where)
 | 
						|
                ->where('category.cardtype',1)
 | 
						|
                ->order('user_card.id', 'desc')
 | 
						|
                ->select();
 | 
						|
            $result['times_card'] = $times_list;
 | 
						|
        }
 | 
						|
 | 
						|
        if(empty($card_type) || $card_type==2){
 | 
						|
            $term_list= $this->model
 | 
						|
                ->field(['id as user_card_id','user_id','brand_id','card_no','card_type','open_card_time','effective_date','expire_time','status'])
 | 
						|
                ->with(['category' => function($query){
 | 
						|
                    $query->withField(['cardname', 'cardtype', 'cardtypename', 'card_avatar', 'card_desc', 'cardprice', 'expiretimes', 'expiretype', 'shop_name', 'apply_shop', 'apply_course', 'use_limits']);
 | 
						|
                }])
 | 
						|
                ->where($where)
 | 
						|
                ->where('category.cardtype',2)
 | 
						|
                ->order('user_card.id', 'desc')
 | 
						|
                ->select();
 | 
						|
            $result['term_card'] = $term_list;
 | 
						|
        }
 | 
						|
 | 
						|
        if(empty($card_type) || $card_type==3){
 | 
						|
            $times_card_share = new TimesCardShare();
 | 
						|
            Log::log($this->getUserId());
 | 
						|
            $wh['to_user_id'] = $this->getUserId();
 | 
						|
            $once_card = $times_card_share
 | 
						|
                ->field(['id as share_id','user_card_id','card_category_id','from_user_id','to_user_id','share_time','receive_time','share_expire_time','status'])
 | 
						|
                ->where($wh)
 | 
						|
                ->whereIn('times_card_share.status',[1,3])
 | 
						|
                ->with(['fromUser' => function($query){
 | 
						|
                    $query->withField(['nickname','avatar']);
 | 
						|
                },'category' => function($query){
 | 
						|
                    $query->withField(['cardname', 'cardtype', 'cardtypename', 'card_avatar', 'card_desc', 'cardprice', 'expiretimes', 'expiretype', 'shop_name', 'apply_shop', 'apply_course', 'use_limits']);
 | 
						|
                }])
 | 
						|
                ->select();
 | 
						|
            foreach ($once_card as $k => $v) {
 | 
						|
                $v->cardname = "单次卡";
 | 
						|
                switch ($v->status) {
 | 
						|
                    case '1':
 | 
						|
                        $v->status_name = "未使用";
 | 
						|
                        break;
 | 
						|
                    case '3':
 | 
						|
                        $v->status_name = "已使用";
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            $result['once_card'] = $once_card;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    public function buyUserCard($card_category_id)
 | 
						|
    {
 | 
						|
        $params['brand_id'] = $this->brand_id;
 | 
						|
        $params['user_id'] = $this->getUserId();
 | 
						|
        $params['card_category_id'] = $card_category_id;
 | 
						|
        $params['open_card_time'] = date('Y-m-d H:i:s');
 | 
						|
        $params['createtime'] = time();
 | 
						|
        $params['effective_date']= date('Y-m-d');
 | 
						|
        try {
 | 
						|
            Db::startTrans();
 | 
						|
            //获取会员卡种类
 | 
						|
            $category = CardCategory::get($card_category_id);
 | 
						|
            $params['left_times_count']=$category->timescardquota;
 | 
						|
            $params['card_type']=$category->cardtype;
 | 
						|
            if ($category->cardtype == 1) {
 | 
						|
                $params['share_times']=$category->sharetimes;
 | 
						|
                $params['already_share_times']= 0;
 | 
						|
                $params['left_share_times']=$category->sharetimes;
 | 
						|
            }
 | 
						|
 | 
						|
            //有效时长
 | 
						|
            $expire_times = $category->expiretimes;
 | 
						|
            //有效期类型
 | 
						|
            $expire_type = $category->expiretype;
 | 
						|
            //计算会员卡到期时间
 | 
						|
            $expire_date = null;
 | 
						|
            switch ($expire_type) {
 | 
						|
                case '1':
 | 
						|
                    //天
 | 
						|
                    $expire_date = date('Y-m-d', strtotime("+$expire_times day", strtotime($params['effective_date'])));
 | 
						|
                    break;
 | 
						|
                case '2':
 | 
						|
                    //周
 | 
						|
                    $expire_date = date('Y-m-d', strtotime("+$expire_times week", strtotime($params['effective_date'])));
 | 
						|
                    break;
 | 
						|
                case '3':
 | 
						|
                    //月
 | 
						|
                    $expire_date = date('Y-m-d', strtotime("+$expire_times month", strtotime($params['effective_date'])));
 | 
						|
                    break;
 | 
						|
                case '4':
 | 
						|
                    //年
 | 
						|
                    $expire_date = date('Y-m-d', strtotime("+$expire_times year", strtotime($params['effective_date'])));
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
            $params['expire_time'] = $expire_date;
 | 
						|
 | 
						|
            // 插入数据并获取自增ID
 | 
						|
            $insertId = $this->model->insertGetId($params);
 | 
						|
            //生成会员卡卡号
 | 
						|
            $card_no=10000000+$insertId;
 | 
						|
            $up_info['card_no'] = $card_no;
 | 
						|
            $row = $this->model->get($insertId);
 | 
						|
            $result = $row->save($up_info);
 | 
						|
            Db::commit();
 | 
						|
        } catch (\Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            $this->resultError($e->getMessage());
 | 
						|
        }
 | 
						|
        return ['code' => false !== $result ? 1 : 0, 'msg' => false !== $result ? '提交成功' : '提交失败'];
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取会员卡种类列表
 | 
						|
     * @param string $card_type 会员卡种类
 | 
						|
     * @return array
 | 
						|
     * @throws DataNotFoundException
 | 
						|
     * @throws ModelNotFoundException
 | 
						|
     * @throws DbException
 | 
						|
     */
 | 
						|
    public function getCardTypeList(string $card_type)
 | 
						|
    {
 | 
						|
        $where['brand_id'] = $this->brand_id;
 | 
						|
        $where['status'] = 1;
 | 
						|
        $CardCategory = new CardCategory();
 | 
						|
        if(empty($card_type) || $card_type==1){
 | 
						|
            $where['cardtype'] = 1;
 | 
						|
            $times_card = $CardCategory
 | 
						|
                ->where($where)
 | 
						|
                ->field(['id as card_category_id', 'cardname', 'cardtype', 'cardtypename','card_avatar','timescardquota','sharetimes', 'cardprice', 'expiretimes', 'expiretype'])
 | 
						|
                ->order("sort desc")
 | 
						|
                ->select();
 | 
						|
 | 
						|
            foreach ($times_card as $k => $v) {
 | 
						|
                switch ($v->expiretype) {
 | 
						|
                    case '1':
 | 
						|
                        $time = "天";
 | 
						|
                        break;
 | 
						|
                    case '2':
 | 
						|
                        $time = "周";
 | 
						|
                        break;
 | 
						|
                    case '3':
 | 
						|
                        $time = "个月";
 | 
						|
                        break;
 | 
						|
                    case '4':
 | 
						|
                        $time = "年";
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
                $v->expiretimes = "$v->expiretimes$time";
 | 
						|
                unset($v->expiretype);
 | 
						|
            }
 | 
						|
            $result['times_card'] = $times_card;
 | 
						|
        }
 | 
						|
 | 
						|
        if(empty($card_type) || $card_type==2){
 | 
						|
            $where['cardtype'] = 2;
 | 
						|
            $term_card = $CardCategory
 | 
						|
                ->where($where)
 | 
						|
                ->field(['id as card_category_id', 'cardname', 'cardtype', 'cardtypename','card_avatar','timescardquota','sharetimes', 'cardprice', 'expiretimes', 'expiretype'])
 | 
						|
                ->order("sort desc")
 | 
						|
                ->select();
 | 
						|
            foreach ($term_card as $k => $v) {
 | 
						|
                switch ($v->expiretype) {
 | 
						|
                    case '1':
 | 
						|
                        $time = "天";
 | 
						|
                        break;
 | 
						|
                    case '2':
 | 
						|
                        $time = "周";
 | 
						|
                        break;
 | 
						|
                    case '3':
 | 
						|
                        $time = "个月";
 | 
						|
                        break;
 | 
						|
                    case '4':
 | 
						|
                        $time = "年";
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
                $v->expiretimes = "$v->expiretimes$time";
 | 
						|
                unset($v->expiretype);
 | 
						|
            }
 | 
						|
            $result['term_card'] = $term_card;
 | 
						|
        }
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    public function getCardTypeInfo($card_category_id)
 | 
						|
    {
 | 
						|
        $where['brand_id'] = $this->brand_id;
 | 
						|
        $where['status'] = 1;
 | 
						|
        $where['id'] = $card_category_id;
 | 
						|
        $CardCategory = new CardCategory();
 | 
						|
        $card_info = $CardCategory
 | 
						|
            ->where($where)
 | 
						|
            ->field(['id as card_category_id', 'cardname', 'cardtype', 'cardtypename','card_avatar','card_desc','timescardquota','sharetimes', 'cardprice', 'expiretimes', 'expiretype','shop_name','apply_shop','apply_course','use_limits'])
 | 
						|
            ->find();
 | 
						|
        if (!$card_info) {
 | 
						|
            $this->resultError(__('会员卡类型不存在!'));
 | 
						|
        }
 | 
						|
        switch ($card_info->expiretype) {
 | 
						|
            case '1':
 | 
						|
                $time = "天";
 | 
						|
                break;
 | 
						|
            case '2':
 | 
						|
                $time = "周";
 | 
						|
                break;
 | 
						|
            case '3':
 | 
						|
                $time = "个月";
 | 
						|
                break;
 | 
						|
            case '4':
 | 
						|
                $time = "年";
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        $card_info->expiretimes = "$card_info->expiretimes$time";
 | 
						|
        unset($card_info->expiretype);
 | 
						|
        if($card_info->cardtype==2){
 | 
						|
            unset($card_info->timescardquota);
 | 
						|
            unset($card_info->sharetimes);
 | 
						|
        }
 | 
						|
        return $card_info;
 | 
						|
    }
 | 
						|
 | 
						|
    public function timesCardShare($user_card_id)
 | 
						|
    {
 | 
						|
        $params['user_card_id'] = $user_card_id;
 | 
						|
        $user_card = $this->model->get($user_card_id);
 | 
						|
        if ($user_card->share_times<=0){
 | 
						|
            $this->resultError('分享失败-次卡卡种不允许分享!');
 | 
						|
        }
 | 
						|
        if ($user_card->left_share_times<=0){
 | 
						|
            $this->resultError('分享失败-剩余分享次数不足!');
 | 
						|
        }
 | 
						|
        if($user_card->left_times_count<=0){
 | 
						|
            $this->resultError('分享失败-次卡剩余次数不足!');
 | 
						|
        }
 | 
						|
        $params['card_category_id'] = $user_card->card_category_id;
 | 
						|
        $params['from_user_id'] = $this->getUserId();
 | 
						|
        $params['share_time'] = date('Y-m-d H:i:s');
 | 
						|
        //增加24小时
 | 
						|
        $params['share_expire_time'] = date('Y-m-d H:i:s', strtotime("+1 day", strtotime($params['share_time'])));
 | 
						|
        $params['card_effective_date'] = $user_card->effective_date;
 | 
						|
        $params['card_expire_time'] = $user_card->expire_time;
 | 
						|
        $params['status'] = 0;
 | 
						|
        $result = [];
 | 
						|
        try {
 | 
						|
            Db::startTrans();
 | 
						|
            $db = Db::name('xilufitness_times_card_share');
 | 
						|
            // 插入数据并获取自增ID
 | 
						|
            $insertId = $db->insertGetId($params);
 | 
						|
            $result['share_id'] = $insertId;
 | 
						|
            Log::log($result);
 | 
						|
            //剩余额度-1
 | 
						|
            $user_card['left_times_count'] = $user_card['left_times_count'] - 1;
 | 
						|
            //分享次数+1
 | 
						|
            $user_card['already_share_times'] = $user_card['already_share_times'] + 1;
 | 
						|
            //剩余分享次数-1
 | 
						|
            $user_card['left_share_times'] = $user_card['left_share_times'] - 1;
 | 
						|
            $user_card->save();
 | 
						|
            Db::commit();
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            Log::log($e);
 | 
						|
            Db::rollback();
 | 
						|
            $this->resultError(__('次卡分享失败'));
 | 
						|
        }
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
    public function userCardVerification($user_card_id,$user_id)
 | 
						|
    {
 | 
						|
        $user_card = $this->model->get($user_card_id);
 | 
						|
        $admin_access = new AdminAccess();
 | 
						|
        $admin = $admin_access->where(['brand_id' => $this->brand_id,'admin_id' => $this->getUserId()])->find();
 | 
						|
        if (empty($admin)){
 | 
						|
            $this->resultError('核销失败-暂无权限核销!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($user_card->effective_date > date('Y-m-d')){
 | 
						|
            $this->resultError('核销失败-会员卡未生效!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($user_card->expire_time < date('Y-m-d')){
 | 
						|
            $this->resultError('核销失败-会员卡已过期!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($user_card->card_type==1){
 | 
						|
            if ($user_card->left_times_count <= 0) {
 | 
						|
                $this->resultError('核销失败-会员卡剩余次数不足!');
 | 
						|
            }
 | 
						|
            //剩余额度-1
 | 
						|
            $user_card['left_times_count'] = $user_card['left_times_count'] - 1;
 | 
						|
            $user_card['updatetime'] = time();
 | 
						|
            $user_card->save();
 | 
						|
        }
 | 
						|
 | 
						|
        //保存核销记录
 | 
						|
        $params['brand_id'] = $this->brand_id;
 | 
						|
        $params['user_card_id'] = $user_card_id;
 | 
						|
        $params['card_category_id'] = $user_card->card_category_id;
 | 
						|
        $params['shop_id'] = $admin-> shop_id;
 | 
						|
        $params['user_id'] = $user_id;
 | 
						|
        $params['admin_user_id'] = $this->getUserId();
 | 
						|
        $params['check_time'] = date('Y-m-d H:i:s');
 | 
						|
        $params['check_type'] = 1;
 | 
						|
        $params['createtime'] = time();
 | 
						|
        $params['status'] = 1;
 | 
						|
        $records = new CardVerificationRecords();
 | 
						|
        $records->save($params);
 | 
						|
        $this->resultSuccess('核销成功');
 | 
						|
    }
 | 
						|
 | 
						|
    public function onceCardVerification($share_id,$user_id)
 | 
						|
    {
 | 
						|
        $admin_access = new AdminAccess();
 | 
						|
        $admin = $admin_access->where(['brand_id' => $this->brand_id,'admin_id' => $this->getUserId()])->find();
 | 
						|
        if (empty($admin)){
 | 
						|
            $this->resultError('核销失败-暂无权限核销!');
 | 
						|
        }
 | 
						|
        $times_card_share = new TimesCardShare();
 | 
						|
        $share_info = $times_card_share->get($share_id);
 | 
						|
        if($share_info->status == 3){
 | 
						|
            $this->resultError('核销失败-单次卡不可重复使用!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share_info->card_effective_date > date('Y-m-d')){
 | 
						|
            $this->resultError('核销失败-单次卡未生效!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share_info->card_expire_time < date('Y-m-d')){
 | 
						|
            $this->resultError('核销失败-单次卡已过期!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share_info->status == 1){
 | 
						|
            $share['status'] = '3';
 | 
						|
            $share['use_time'] = date('Y-m-d H:i:s');
 | 
						|
            $share_info->save($share);
 | 
						|
            //保存核销记录
 | 
						|
            $params['brand_id'] = $this->brand_id;
 | 
						|
            $params['user_card_id'] = $share_info -> user_card_id;
 | 
						|
            $params['card_category_id'] = $share_info -> card_category_id;
 | 
						|
            $params['share_id'] = $share_id;
 | 
						|
            $params['shop_id'] = $admin-> shop_id;
 | 
						|
            $params['user_id'] = $user_id;
 | 
						|
            $params['admin_user_id'] = $this->getUserId();
 | 
						|
            $params['check_time'] = date('Y-m-d H:i:s');
 | 
						|
            $params['check_type'] = 1;
 | 
						|
            $params['createtime'] = time();
 | 
						|
            $params['status'] = 1;
 | 
						|
            $records = new CardVerificationRecords();
 | 
						|
            $records->save($params);
 | 
						|
            $this->resultSuccess('核销成功');
 | 
						|
        }else{
 | 
						|
            $this->resultError('核销失败-单次卡状态无效');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * @throws DataNotFoundException
 | 
						|
     * @throws DbException
 | 
						|
     * @throws ModelNotFoundException
 | 
						|
     */
 | 
						|
    public function getCardVerificationRecords($user_card_id,$page_index,$page_size)
 | 
						|
    {
 | 
						|
        $user_info = $this->userInfo;
 | 
						|
        $mobile = $user_info->getData('mobile');
 | 
						|
        $coachModel = new \addons\xilufitness\model\Coach;
 | 
						|
        $coachInfo = $coachModel
 | 
						|
            ->where(['coach_mobile' => $mobile ])
 | 
						|
            ->field(['id','coach_name'])
 | 
						|
            ->find();
 | 
						|
        if (!empty($coachInfo)) {
 | 
						|
            $where['admin_user_id'] = $this->getUserId();
 | 
						|
        }else{
 | 
						|
            $where['card_verification_records.user_id'] = $this->getUserId();
 | 
						|
        }
 | 
						|
        if (!empty($user_card_id)) {
 | 
						|
            $where['user_card_id'] = $user_card_id;
 | 
						|
        }
 | 
						|
        $where['card_verification_records.brand_id'] = $this->brand_id;
 | 
						|
 | 
						|
        $records = new CardVerificationRecords();
 | 
						|
        $list= $records
 | 
						|
            ->field(['user_card_id','share_id','shop_id','user_id','admin_user_id','check_time','status'])
 | 
						|
            ->where($where)
 | 
						|
            ->with(['user' => function($query){
 | 
						|
                return $query->withField(['nickname','avatar']);
 | 
						|
            },'adminUser' => function($query){
 | 
						|
                return $query->withField(['nickname','avatar']);
 | 
						|
            },'card' => function($query){
 | 
						|
                return $query->withField(['card_no', 'card_type']);
 | 
						|
            },'shop' => function($query){
 | 
						|
                return $query->withField(['shop_name','address']);
 | 
						|
            },'category' => function($query){
 | 
						|
                return $query->withField(['cardname', 'cardtype', 'cardtypename']);
 | 
						|
            }])
 | 
						|
            ->order('check_time desc')
 | 
						|
            ->paginate($page_size, false, ['page' => $page_index]);
 | 
						|
        return $list;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getTimesCardShare($user_card_id)
 | 
						|
    {
 | 
						|
        $where['user_card_id'] = $user_card_id;
 | 
						|
        $times_card_share = new TimesCardShare();
 | 
						|
 | 
						|
        $list = $times_card_share
 | 
						|
            ->field(['id as share_id','user_card_id','from_user_id','to_user_id','share_time','receive_time','share_expire_time','status'])
 | 
						|
            ->where(['user_card_id' => $user_card_id])
 | 
						|
            ->select();
 | 
						|
        return $list;
 | 
						|
    }
 | 
						|
 | 
						|
    public function receiveTimesCardShare($share_id)
 | 
						|
    {
 | 
						|
        $times_card_share = new TimesCardShare();
 | 
						|
        $share = $times_card_share->get($share_id);
 | 
						|
        if($share->status == 2){
 | 
						|
            $this->resultError('领取失败-次卡分享已失效!');
 | 
						|
        }
 | 
						|
 | 
						|
        if(date('Y-m-d H:i:s') > $share->share_expire_time){
 | 
						|
            $this->resultError('领取失败-次卡分享已失效!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share->status == 1){
 | 
						|
            $this->resultError('领取失败-不允许重复领取!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share->from_user_id == $this->getUserId()){
 | 
						|
            $this->resultError('领取失败-不允许领取自己的分享!');
 | 
						|
        }
 | 
						|
 | 
						|
        if($share->status == 0){
 | 
						|
            $params['to_user_id'] = $this->getUserId();
 | 
						|
            $params['receive_time'] = date('Y-m-d H:i:s');
 | 
						|
            $params['status'] = 1;
 | 
						|
            $share->save($params);
 | 
						|
            $this->resultSuccess('领取成功');
 | 
						|
        } else {
 | 
						|
            $this->resultError('领取失败');
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
} |