347 lines
14 KiB
PHP
347 lines
14 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Any
|
|
* @description KISS
|
|
* @date 2020-12-2
|
|
* @version 1.0.0
|
|
*
|
|
* _____LOG_____
|
|
*
|
|
*/
|
|
|
|
namespace app\modules\api\models;
|
|
|
|
use app\models\BallCart;
|
|
use app\models\Coupon;
|
|
use app\models\User;
|
|
use app\models\UserCoupon;
|
|
use app\models\UserInformation;
|
|
use yii\db\Expression;
|
|
use function AlibabaCloud\Client\value;
|
|
use yii\data\Pagination;
|
|
class CouponForm extends ApiModel
|
|
{
|
|
public $page;
|
|
public $limit;
|
|
public $user_id;
|
|
public $coupon_id;
|
|
public $user_coupon_id;
|
|
public $store_id;
|
|
public $ball_number;
|
|
|
|
public function rules()
|
|
{
|
|
return [
|
|
[['page'], 'default', 'value' => 1],
|
|
[['limit'], 'default', 'value' => 10],
|
|
[['ball_number'], 'string'],
|
|
[['user_id', 'page', 'user_id', 'coupon_id','store_id'], 'integer'],
|
|
[['user_id'], 'required', 'on' => 'user_coupon'],
|
|
[['user_id', 'coupon_id'], 'required', 'on' => 'get_coupon'],
|
|
[['user_id', 'user_coupon_id'], 'required', 'on' => 'check_user_coupon'],
|
|
[['user_id'], 'required', 'on' => 'check_run_coupon'],
|
|
[['user_id','ball_number'], 'required', 'on' => 'check_use_coupon'],
|
|
];
|
|
}
|
|
|
|
public function attributeLabels()
|
|
{
|
|
return [
|
|
'user_id' => 'ID',
|
|
'coupon_id' => '卡券ID',
|
|
'user_coupon_id' => '我的卡券ID',
|
|
'store_id' => '球车所属门店',
|
|
];
|
|
}
|
|
|
|
//卡券中心
|
|
public function search()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
|
|
$query = Coupon::find()
|
|
->select('id,title,price,end_time,num,get_num,user_get_num')
|
|
->where(['is_delete' => 0])
|
|
->andWhere(['<=', 'get_start_time', time()])
|
|
->andWhere(['>', 'get_end_time', time()])
|
|
->andWhere(['<>', 'num', 0]);
|
|
|
|
$count = $query->count();
|
|
$pagination = new Pagination(['pageSize' => $this->limit, 'totalCount' => $count, 'page' => $this->page - 1]);
|
|
$list = $query->offset($pagination->offset)->limit($pagination->limit)->orderBy(['price' => SORT_DESC])->asArray()->all();
|
|
foreach ($list as $index => &$item) {
|
|
$item['date_cn'] = date('Y/m/d', $item['end_time']);
|
|
$item['subhead'] = $item['date_cn'] . '前可用';
|
|
$item['plan'] = '无限';
|
|
$item['status'] = false;
|
|
if ($item['num'] != '-1') {
|
|
$item['plan'] = ($item['get_num'] / $item['num']) * 100;
|
|
}
|
|
if(!empty($this->user_id)){
|
|
$count_c = UserCoupon::find()->where(['user_id' => $this->user_id, 'coupon_id' => $item['id'], 'is_admin_send' => 0])->count();
|
|
$count_c = empty($count_c) ? 0 : $count_c;
|
|
if ($count_c >= $item['user_get_num'] && !empty($item['user_get_num'])) {
|
|
$item['status'] = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
//是否已经全部加载
|
|
$end_flag = $this->page >= $pagination->pageCount ? true : false;
|
|
return [
|
|
'code' => 0,
|
|
'msg' => 'ok',
|
|
'data' => $list,
|
|
'count' => $count,
|
|
'page_size' => $this->limit,
|
|
'page_count' => $pagination->pageCount,
|
|
'page_no' => $this->page,
|
|
'end_flag' => $end_flag
|
|
];
|
|
|
|
}
|
|
|
|
//我的卡包
|
|
public function userCoupon()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
|
|
$query = UserCoupon::find()->alias('uc')
|
|
->select('uc.id,uc.coupon_id,c.title,c.price,c.start_time,c.end_time,c.type,c.store_ids as store_ids')
|
|
->leftJoin(['c' => Coupon::tableName()], 'uc.coupon_id=c.id')
|
|
->where(['uc.is_delete' => 0, 'uc.status' => 0, 'uc.user_id' => $this->user_id]);
|
|
|
|
if(!empty($this->store_id)){
|
|
$query->andWhere([
|
|
'OR',
|
|
['c.store_ids' => ''],
|
|
new Expression("FIND_IN_SET(:store_ids, store_ids)",[":store_ids"=>$this->store_id])
|
|
]);
|
|
}
|
|
|
|
|
|
$count = $query->count();
|
|
$pagination = new Pagination(['pageSize' => $this->limit, 'totalCount' => $count, 'page' => $this->page - 1]);
|
|
$list = $query->offset($pagination->offset)->limit($pagination->limit)->orderBy(['uc.id' => SORT_DESC])->asArray()->all();
|
|
foreach ($list as $index => &$item) {
|
|
$item['date_cn'] = date('Y/m/d', $item['start_time']) . ' - ' . date('Y/m/d', $item['end_time']);
|
|
$item['subhead'] = '';
|
|
if(!empty($item['type'])){
|
|
$item['subhead'] = '立减' . $item['price'] . '元';
|
|
}
|
|
}
|
|
//是否已经全部加载
|
|
$end_flag = $this->page >= $pagination->pageCount ? true : false;
|
|
return [
|
|
'code' => 0,
|
|
'msg' => 'ok',
|
|
'data' => $list,
|
|
'count' => $count,
|
|
'page_size' => $this->limit,
|
|
'page_count' => $pagination->pageCount,
|
|
'page_no' => $this->page,
|
|
'end_flag' => $end_flag
|
|
];
|
|
}
|
|
|
|
//领取卡券
|
|
public function getCoupon()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
|
|
// $user_info = UserInformation::findOne(['user_id' => $this->user_id]);
|
|
// if($user_info == null){
|
|
// return $this->apiReturnError('需完善会员资料', [], 4);//跳转会员注册页面
|
|
// }
|
|
|
|
$coupon = Coupon::findOne(['id' => $this->coupon_id, 'is_delete' => 0]);
|
|
if ($coupon == null) {
|
|
return $this->apiReturnError('卡券已被下架', ['status' => 0,'msg'=>'卡券已被下架'], 2);//刷新
|
|
}
|
|
|
|
$count = UserCoupon::find()->where(['user_id' => $this->user_id, 'coupon_id' => $this->coupon_id, 'is_admin_send' => 0])->count();
|
|
if ($count >= $coupon->user_get_num) {
|
|
return $this->apiReturnError('您已领完此卡券,不能再次领取', ['status' => 0,'msg'=>'您已领完此卡券,不能再次领取']);//不刷新,只弹框提示
|
|
}
|
|
|
|
if (time() < $coupon->get_start_time) {
|
|
return $this->apiReturnError('还未到此卡券领取日期', ['status' => 0,'msg'=>'还未到此卡券领取日期']);//不刷新,只弹框提示
|
|
}
|
|
if (time() >= $coupon->get_end_time) {
|
|
return $this->apiReturnError('此卡券领取时间已过期,无法领取', ['status' => 0,'msg'=>'此卡券领取时间已过期,无法领取'], 2); //刷新
|
|
}
|
|
|
|
if ($coupon->num != '-1' && $coupon->get_num >= $coupon->num) {
|
|
return $this->apiReturnError('卡券已被抢完!', ['status' => 0,'msg'=>'卡券已被抢完'], 3);//不刷新,按钮切换为已领完
|
|
}
|
|
|
|
$transaction = \Yii::$app->db->beginTransaction();
|
|
$model = new UserCoupon();
|
|
$model->user_id = $this->user_id;
|
|
$model->coupon_id = $coupon->id;
|
|
$model->status = 0;
|
|
$model->created_at = time();
|
|
$model->updated_at = 0;
|
|
$model->is_delete = 0;
|
|
$model->deleted_at = 0;
|
|
$model->is_admin_send = 0;
|
|
if (!$model->save()) {
|
|
$transaction->rollBack();
|
|
$error = $this->getModelError($model);
|
|
return $this->apiReturnError($error['msg'], ['status' => 0,'msg'=>$error['msg']], 1);//不刷新,提示
|
|
}
|
|
$coupon->get_num += 1;
|
|
$coupon->updated_at = time();
|
|
if (!$coupon->save()) {
|
|
$transaction->rollBack();
|
|
$error = $this->getModelError($coupon);
|
|
return $this->apiReturnError($error['msg'], ['status' => 0,'msg'=>$error['msg']], 1);//不刷新,提示
|
|
}
|
|
$transaction->commit();
|
|
if ($coupon->num != '-1' && $coupon->get_num >= $coupon->num) {
|
|
return $this->apiReturnError('领取成功', ['status' => 1,'msg'=>'领取成功'], 3);//不刷新,按钮切换为已领完
|
|
}
|
|
if ($count+1 >= $coupon->user_get_num) {
|
|
return $this->apiReturnError('您已领完此卡券,不能再次领取', ['status' => 1,'msg'=>'领取成功'],5);//不刷新,按钮改为已领取
|
|
}
|
|
return $this->apiReturnSuccess('领取成功', ['status' => 1,'msg'=>'领取成功']);
|
|
}
|
|
|
|
//校验用户卡券是否可使用
|
|
public function checkUserCoupon()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
$userCoupon = UserCoupon::findOne(['id' => $this->user_coupon_id, 'user_id' => $this->user_id, 'status' => 0, 'is_delete' => 0]);
|
|
if ($userCoupon == null) {
|
|
return $this->apiReturnError('卡券不存在或已被使用', [], 2);//刷新页面
|
|
}
|
|
$coupon = Coupon::findOne(['id' => $userCoupon->coupon_id, 'is_delete' => 0]);
|
|
if ($coupon == null) {
|
|
$userCoupon->is_delete = 1;
|
|
$userCoupon->deleted_at = time();
|
|
if (!$userCoupon->save()) {
|
|
return $this->getModelError('卡券异常!');//弹框提示
|
|
}
|
|
return $this->apiReturnError('卡券已被下架', [], 2);//刷新页面
|
|
}
|
|
if (time() < $coupon->start_time) {
|
|
return $this->apiReturnError('此卡券未到使用日期');//弹框提示
|
|
}
|
|
if (time() >= $coupon->end_time) {
|
|
$userCoupon->is_delete = 1;
|
|
$userCoupon->deleted_at = time();
|
|
if (!$userCoupon->save()) {
|
|
return $this->getModelError('卡券异常!');//弹框提示
|
|
}
|
|
return $this->apiReturnError('此卡券已过期', [], 2);//弹框提示,刷新页面
|
|
}
|
|
return $this->apiReturnSuccess('可使用');
|
|
}
|
|
|
|
|
|
/**
|
|
*获取用户优惠券信息
|
|
*/
|
|
public function getUserCoupon()
|
|
{
|
|
$userCoupon = UserCoupon::findOne(['id' => $this->user_coupon_id, 'user_id' => $this->user_id, 'status' => 0, 'is_delete' => 0]);
|
|
$coupon_id = $userCoupon['coupon_id'];
|
|
$couponArr = Coupon::findOne(['id' => $coupon_id]);
|
|
if ($couponArr == null) {
|
|
return $this->apiReturnError('优惠券错误');//弹框提示
|
|
}
|
|
return $couponArr;
|
|
}
|
|
|
|
public function checkRunCoupon()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
$redis_name = "api:cxaibc:coupon:check:run".$this->user_id;
|
|
$redis = \Yii::$app->redis;
|
|
if($redis->get($redis_name)){
|
|
return $this->apiReturnSuccess('ok');
|
|
}
|
|
$list = Coupon::find()
|
|
->select('id,title,price,end_time,num,get_num,user_get_num')
|
|
->where(['is_delete' => 0])
|
|
->andWhere(['<=', 'get_start_time', time()])
|
|
->andWhere(['>', 'get_end_time', time()])
|
|
->orderBy(['type' => SORT_ASC,'price' => SORT_DESC])
|
|
->asArray()
|
|
->all();
|
|
|
|
foreach ($list as $index => &$item) {
|
|
$item['date_cn'] = date('Y/m/d', $item['end_time']);
|
|
$item['subhead'] = $item['date_cn'] . '前可用';
|
|
$item['plan'] = '无限';
|
|
$item['status'] = false;
|
|
$item['price'] = floor($item['price']);
|
|
if ($item['num'] != '-1') {
|
|
if($item['num'] == 0){
|
|
$item['plan'] = 100;
|
|
}else{
|
|
$item['plan'] = ($item['get_num'] / $item['num']) * 100;
|
|
}
|
|
}
|
|
$count_c = UserCoupon::find()->where(['user_id' => $this->user_id, 'coupon_id' => $item['id'], 'is_admin_send' => 0])->count();
|
|
$count_c = empty($count_c) ? 0 : $count_c;
|
|
if ($count_c >= $item['user_get_num'] && !empty($item['user_get_num'])) {
|
|
unset($list[$index]);
|
|
}
|
|
if($item['num'] != '-1' && $item['num'] == $item['get_num']){
|
|
unset($list[$index]);
|
|
}
|
|
}
|
|
if(!empty($list)){
|
|
$redis->setex($redis_name,600,$this->user_id);
|
|
}
|
|
$list = array_values($list);
|
|
return $this->apiReturnSuccess('ok',$list);
|
|
}
|
|
|
|
|
|
public function checkUseCoupon()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
|
|
$ball = BallCart::findOne(['ball_number' => $this->ball_number,'is_delete' => 0]);
|
|
if($ball == null){
|
|
return $this->apiReturnSuccess();
|
|
}
|
|
$this->store_id = $ball->store_id;
|
|
$data = UserCoupon::find()->alias('uc')
|
|
->select('uc.id,c.title,c.store_ids,c.type,c.price')
|
|
->leftJoin(['c' => Coupon::tableName()], 'uc.coupon_id=c.id')
|
|
->where(['uc.is_delete' => 0, 'uc.status' => 0, 'uc.user_id' => $this->user_id,'c.is_delete'=>0])
|
|
->andWhere(['<=', 'start_time', time()])
|
|
->andWhere(['>', 'end_time', time()])
|
|
->andWhere([
|
|
'OR',
|
|
['c.store_ids' => ''],
|
|
new Expression("FIND_IN_SET(:store_ids, store_ids)",[":store_ids"=>$this->store_id])
|
|
])
|
|
->orderBy(['c.type' => SORT_ASC,'c.price' => SORT_DESC])
|
|
->asArray()
|
|
->one();
|
|
|
|
if(empty($data)){
|
|
return $this->apiReturnSuccess();
|
|
}
|
|
unset($data['store_ids']);
|
|
return $this->apiReturnSuccess('ok',$data);
|
|
}
|
|
}
|