You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
8.1 KiB
223 lines
8.1 KiB
5 years ago
|
<?php
|
||
|
namespace app\behaviors;
|
||
|
|
||
|
use app\models\LotteryReserve;
|
||
|
use app\models\LotteryGoods;
|
||
|
use app\models\LotteryLog;
|
||
|
use app\models\Goods;
|
||
|
use yii\base\Behavior;
|
||
|
use app\models\LoNoticeSender;
|
||
|
|
||
|
class LotteryBehavior extends BaseBehavior
|
||
|
{
|
||
|
protected $only_routes = [
|
||
|
'mch/store/index',
|
||
|
'mch/lottery/*',
|
||
|
'api/lottery/*'
|
||
|
];
|
||
|
|
||
|
public $store_id;
|
||
|
public $store;
|
||
|
|
||
|
public function beforeAction($event)
|
||
|
{
|
||
|
\Yii::warning('----BARGAIN BEHAVIOR----');
|
||
|
if (!empty($event->action->controller->store) && !empty($event->action->controller->store->id)) {
|
||
|
$this->store = $event->action->controller->store;
|
||
|
}
|
||
|
try {
|
||
|
$this->checkPrizeTimeout($event);
|
||
|
} catch (\Exception $e) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 处理中奖
|
||
|
* @param $event
|
||
|
*/
|
||
|
private function checkPrizeTimeout($event)
|
||
|
{
|
||
|
$cache_key = 'lottery_prize_timeout_checker';
|
||
|
if (\Yii::$app->cache->get($cache_key)) {
|
||
|
return true;
|
||
|
}
|
||
|
\Yii::$app->cache->set($cache_key, true, 30);
|
||
|
|
||
|
/** @var Wechat $wechat */
|
||
|
$wechat = isset($event->action->controller->wechat) ? $event->action->controller->wechat : null;
|
||
|
if (!$wechat) {
|
||
|
\Yii::$app->cache->set($cache_key, false);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
$lottery = LotteryGoods::find()->where([
|
||
|
'store_id' => $this->store->id,
|
||
|
'is_delete' => 0,
|
||
|
'status' => 1,
|
||
|
'type' => 0
|
||
|
])->andWhere(['<=','end_time',time()])->one();
|
||
|
|
||
|
if($lottery) {
|
||
|
try{
|
||
|
$reserve = LotteryReserve::find()->select('user_id')->where([
|
||
|
'store_id' => $this->store->id,
|
||
|
'lottery_id' => $lottery->id,
|
||
|
])->column();
|
||
|
|
||
|
$query = LotteryLog::find()->select('id,user_id')->where([
|
||
|
'store_id' => $this->store->id,
|
||
|
'lottery_id' => $lottery->id,
|
||
|
'status' => 0,
|
||
|
'child_id' => 0,
|
||
|
]);
|
||
|
$count = $query->count();//参与人数
|
||
|
|
||
|
$stock = $lottery->stock;//奖品数量
|
||
|
|
||
|
|
||
|
if($count > $stock) {
|
||
|
|
||
|
$log = $query->asArray()->all();
|
||
|
$logs = array_column($log,'user_id', 'id'); //参与详情
|
||
|
|
||
|
$same = array_intersect($logs,$reserve); //中奖名单1
|
||
|
$ids_a = array_keys($same);
|
||
|
|
||
|
//$num = $lottery->stock-count($same); //剩余数量
|
||
|
//lucky_code
|
||
|
$lucky_logs = LotteryLog::find()->select('id,user_id,child_id')->where([
|
||
|
'store_id' => $this->store->id,
|
||
|
'lottery_id' => $lottery->id,
|
||
|
'status' => 0,
|
||
|
])->andWhere(['not', ['in','child_id',$same]])->asArray()->all();
|
||
|
$lucky_log = array_column($lucky_logs,'user_id', 'id');
|
||
|
|
||
|
if(count($same) > $stock){
|
||
|
$new_ids = array_splice($ids_a,0,$stock);
|
||
|
} else if( count($same) == $stock){
|
||
|
$new_ids = $ids_a;
|
||
|
} else if( count($same)+1 == $stock){
|
||
|
//随机值
|
||
|
$new_logs = array_diff($lucky_log,$same);
|
||
|
$ids_b = array_rand($new_logs,1);
|
||
|
array_push($ids_a,$ids_b);
|
||
|
|
||
|
$new_ids = $ids_a;
|
||
|
} else {
|
||
|
$num = $stock-count($same);
|
||
|
//随机值
|
||
|
$new_logs = array_diff($lucky_log,$same);
|
||
|
|
||
|
//$ids_b = array_rand($new_logs,$num);
|
||
|
$ids_b = [];$array = [];
|
||
|
while($num>count($ids_b)) {
|
||
|
$ids = array_rand($new_logs,1);
|
||
|
$user_id = $new_logs[$ids];
|
||
|
|
||
|
if(in_array($user_id,$array)){
|
||
|
continue;
|
||
|
} else {
|
||
|
$array[] = $user_id;
|
||
|
$ids_b[] = $ids;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
$new_ids = array_merge($ids_a,$ids_b);
|
||
|
|
||
|
}
|
||
|
|
||
|
$cache_conduct = 'lottery_prize_conduct';
|
||
|
if (\Yii::$app->cache->get($cache_conduct)) {
|
||
|
return true;
|
||
|
};
|
||
|
\Yii::$app->cache->set($cache_conduct,$lottery->id,30);
|
||
|
|
||
|
|
||
|
|
||
|
$t = \Yii::$app->db->beginTransaction();
|
||
|
//批量修改
|
||
|
$idList = LotteryLog::find()->select('id')
|
||
|
->where([
|
||
|
'AND',
|
||
|
['store_id' => $this->store->id],
|
||
|
['lottery_id' => $lottery->id],
|
||
|
['status' => 0],
|
||
|
['in','id',$new_ids],
|
||
|
])->asArray()->all();
|
||
|
|
||
|
$idList = array_column($idList,'id');
|
||
|
|
||
|
LotteryLog::updateAll(['status' => 2,'obtain_time' => time(), ], [
|
||
|
'id' => $idList,
|
||
|
]);
|
||
|
|
||
|
//无获奖
|
||
|
$idList_err = LotteryLog::find()->select('id')
|
||
|
->where([
|
||
|
'AND',
|
||
|
['store_id' => $this->store->id],
|
||
|
['lottery_id' => $lottery->id],
|
||
|
['status' => 0],
|
||
|
])->asArray()->all();
|
||
|
|
||
|
$idList_err = array_column($idList_err,'id');
|
||
|
|
||
|
LotteryLog::updateAll(['status' => 1,'obtain_time' => time(), ], [
|
||
|
'id' => $idList_err,
|
||
|
]);
|
||
|
$lottery->type = 1;
|
||
|
if($lottery->save()){
|
||
|
$t->commit();
|
||
|
$notice = new LoNoticeSender($wechat, $this->store->id);
|
||
|
$notice->sendSucNotice($idList);
|
||
|
|
||
|
} else {
|
||
|
$t->rollBack();
|
||
|
}
|
||
|
} else {
|
||
|
$t = \Yii::$app->db->beginTransaction();
|
||
|
$cache_conduct = 'lottery_prize_conduct';
|
||
|
if (\Yii::$app->cache->get($cache_conduct)) {
|
||
|
return true;
|
||
|
};
|
||
|
\Yii::$app->cache->set($cache_conduct,$lottery->id,30);
|
||
|
|
||
|
|
||
|
//批量修改
|
||
|
$idList = LotteryLog::find()->select('id')
|
||
|
->where([
|
||
|
'AND',
|
||
|
['store_id' => $this->store->id],
|
||
|
['lottery_id' => $lottery->id],
|
||
|
['status' => 0],
|
||
|
['child_id' => 0],
|
||
|
])->asArray()->all();
|
||
|
|
||
|
$idList = array_column($idList,'id');
|
||
|
LotteryLog::updateAll(['status' => 2,'obtain_time' => time(), ], [
|
||
|
'id' => $idList,
|
||
|
]);
|
||
|
|
||
|
$lottery->type = 1;
|
||
|
if($lottery->save()){
|
||
|
$t->commit();
|
||
|
$notice = new LoNoticeSender($wechat, $this->store->id);
|
||
|
$notice->sendSucNotice($idList);
|
||
|
|
||
|
} else {
|
||
|
$t->rollBack();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}catch (\Exception $e) {
|
||
|
\Yii::warning($e->getMessage());
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|