| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- <?php
- namespace addons\Seckill\common\models;
- use addons\Seckill\common\enums\SeckillEnum;
- use addons\Seckill\common\logic\ActivityLogic;
- use common\enums\AddonsEnum;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\logic\common\GoodsLogic;
- use common\models\goods\Goods;
- use common\models\goods\GoodsAttr;
- use common\models\goods\GoodsMarketing;
- use Yii;
- /**
- * This is the model class for table "{{%addons_seckill_activity}}".
- *
- * @property int $id
- * @property int $mall_id
- * @property string $title 活动标题
- * @property int $goods_id 商品ID
- * @property int $attr_id 商品规格ID
- * @property int $begin_time 开始时间
- * @property int $end_time 结束时间
- * @property int $hot_time 预热开始时间
- * @property int $stock 库存
- * @property int $sale_nums 已售数量
- * @property float $price 秒杀售价
- * @property int $activity_status 1未开始;2进行中;3已结束
- * @property int $status 状态[-1:删除;0:禁用;1启用]
- * @property int $created_at
- * @property int $updated_at
- */
- class SeckillActivity extends \common\models\base\BaseActiveRecord
- {
- //活动状态
- const ACTIVITY_STATUS_WAIT = 1;
- const ACTIVITY_STATUS_ING = 2;
- const ACTIVITY_STATUS_END = 3;
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%addons_seckill_activity}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'goods_id', 'begin_time', 'end_time', 'hot_time', 'stock', 'sale_nums', 'activity_status', 'status', 'created_at', 'updated_at','attr_id', 'limit_nums'], 'integer'],
- [['price'], 'number'],
- [['title'], 'string', 'max' => 128],
- ];
- }
- /**
- * {@inheritdoc}
- */
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'mall_id' => 'Mall ID',
- 'title' => 'Title',
- 'goods_id' => 'Goods ID',
- 'goods_code' => 'Goods Code',
- 'begin_time' => 'Begin Time',
- 'end_time' => 'End Time',
- 'hot_time' => 'Hot Time',
- 'stock' => 'Stock',
- 'sale_nums' => 'Sale Nums',
- 'limit_nums' => '每人限购数',
- 'price' => 'Price',
- 'activity_status' => 'Activity Status',
- 'status' => 'Status',
- 'created_at' => 'Created At',
- 'updated_at' => 'Updated At',
- ];
- }
- /**
- * 活动状态
- * @param $status
- * @return array|mixed
- */
- public static function getActivityStatusMap(int $status=null)
- {
- $map = [
- self::ACTIVITY_STATUS_WAIT => '未开始',
- self::ACTIVITY_STATUS_ING => '进行中',
- self::ACTIVITY_STATUS_END => '已结束',
- ];
- if (null !== $status) {
- $map = $map[$status];
- }
- return $map;
- }
- public static function setData(int $mall_id, array $data)
- {
- $update_stock = false;
- if (!empty($data['id'])) {
- $model = self::findOne(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $data['id']]);
- if (empty($model)) {
- self::$static_error = '活动数据异常';
- return false;
- }
- if($model->activity_status != self::ACTIVITY_STATUS_WAIT && $model->stock != $data['stock']){
- //活动
- self::$static_error = '活动已开始|结束,不允许修改库存';
- return false;
- }
- if($model->stock != $data['stock']){
- $update_stock = true;
- }
- } else {
- $model = new self();
- $model->loadDefaultValues();
- $model->status = StatusEnum::ENABLED;
- $model->activity_status = self::checkActivityStatus($data['begin_time'],$data['end_time']);
- $model->mall_id = $mall_id;
- unset($data['id']);
- $update_stock = true;
- }
- $goods = Goods::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'id' => $data['goods_id']]);
- if(!$goods){
- self::$static_error = '商品不存在';
- return false;
- }
- //查询规格信息
- $attrData = GoodsAttr::findOne([
- 'id' => $data['attr_id'],
- 'goods_id' => $data['goods_id'],
- 'status' => StatusEnum::ENABLED,
- ]);
- if(empty($attrData)){
- throw new \ErrorException('商品不存在或已删除');
- }
- $oldGoodsId = $model->goods_id;
- foreach ($data as $key => $val) {
- $model->$key = $val;
- }
- if (!$model->save()) {
- self::$static_error = '保存数据失败:' . $model->getErrorMessage();
- return false;
- }
- self::delCache($model['id']);
- // 如果旧商品ID不为空且与新商品ID不同,则更新商品营销信息
- $goodsMarketing = GoodsMarketing::findOne([
- 'goods_id' => $oldGoodsId,
- 'mall_id' => $mall_id,
- 'marketing_id' => $model->id,
- 'marketing_type' => SeckillEnum::ADDONS_NAME,
- 'status' => StatusEnum::ENABLED,
- ]);
- if (!empty($oldGoodsId) && $oldGoodsId != $data['goods_id'] && !empty($goodsMarketing)) {
- $goodsMarketing->goods_id = $data['goods_id'];
- $goodsMarketing->save();
- } else {
- // 新增商品营销信息
- $param = [
- 'goods_id' => $data['goods_id'],
- 'mall_id' => $mall_id,
- 'marketing_id' => $model->id,
- 'marketing_type' => SeckillEnum::ADDONS_NAME,
- ];
- GoodsMarketing::setData($param);
- }
- if($update_stock){
- ActivityLogic::setStock($model->id,$model->stock,true);
- }
- return $model;
- }
- public static function getCacheKey($activity_id)
- {
- $cache_key = RedisKeyEnum::suffix(RedisKeyEnum::SECKILL_ACTIVITY, $activity_id, true);
- return $cache_key;
- }
- public static function delCache($activity_id)
- {
- $cache = Yii::$app->cache;
- $cache_key = self::getCacheKey($activity_id);
- $cache->delete($cache_key);
- }
- /**
- * 获取活动信息
- * @param $activity_id
- * @return array|mixed|null|\yii\db\ActiveRecord
- */
- public static function getActivityByCache($activity_id)
- {
- //活动时间一到,需要修改此处缓存
- $cache = Yii::$app->cache;
- $cache_key = self::getCacheKey($activity_id);
- $activity = $cache->get($cache_key);
- if(!$activity){
- $activity = self::find()->where(['id' => $activity_id,'status' => StatusEnum::ENABLED])->asArray()->one();
- if(!$activity){
- $activity = null;
- }else{
- //获取商品信息
- $goods = GoodsLogic::GetDetail($activity['mall_id'], ['goods_id' => $activity['goods_id']], []);
- $goods['goods_source'] = SeckillEnum::ADDONS_NAME;
- foreach ($goods['attr'] as $sku){
- if($sku['id']==$activity['attr_id']){
- $goods['original_price'] = $sku['original_price'];
- break;
- }
- }
- $attrs = array_column($goods['attr'],null,'id');
- unset($goods['attr']);
- $my_attr = $attrs[$activity['attr_id']];
- $goods['price'] = $my_attr['price'] > 0 ? $my_attr['price'] : $goods['price'];
- $goods['seckill_price'] = $activity['price'];
- //修改规格信息
- $my_attr['stock'] = ($activity['stock'] - $activity['sale_nums']) > 0 ? $activity['stock'] - $activity['sale_nums'] : 0;
- $goods['stock'] = $my_attr['stock'];
- $my_attr['price'] = $activity['price'];
- $goods['attr'][] = $my_attr;
- $sign_ids = explode(':',$my_attr['sign_id']);
- if($goods['attr_groups']){
- $attr_groups = json_decode($goods['attr_groups'],true);
- foreach($attr_groups as $key => $val){
- foreach($val['attr_list'] as $k => $v){
- if(!in_array($v['attr_id'],$sign_ids)){
- unset($val['attr_list'][$k]);
- }
- }
- $val['attr_list'] = array_values($val['attr_list']);
- $attr_groups[$key] = $val;
- }
- $goods['attr_groups'] = json_encode(array_values($attr_groups));
- }
- $activity['goods'] = $goods;
- $activity['activity_status'] = self::checkActivityStatus($activity['begin_time'],$activity['end_time']);
- }
- $cache->set($cache_key,$activity,600);
- }
- return $activity;
- }
- public static function checkActivityStatus($begin_time,$end_time)
- {
- $now = time();
- if($now < $begin_time){
- //未开始
- $activity_status = self::ACTIVITY_STATUS_WAIT;
- }elseif($now >=$begin_time && $now <= $end_time){
- //进行中
- $activity_status = self::ACTIVITY_STATUS_ING;
- }else{
- //结束
- $activity_status = self::ACTIVITY_STATUS_END;
- }
- return $activity_status;
- }
- public static function getActiveListByDiy($mall_id,$post){
- $time = time();
- $where[] = ['mall_id' => $mall_id];
- $where[] = ['status' => StatusEnum::ENABLED];
- $where[] = ['>=','end_time' ,$time];
- if (!empty($post['keyword'])) {
- $goods_list = Goods::lists(['where' => [['mall_id' => $mall_id], ['like', 'goods_name', trim($post['keyword'])], ['status' => StatusEnum::ENABLED]],
- 'select' => 'id,cover_pic,goods_name,sales_num,virtual_sales,,price,original_price,subtitle','index'=>'id']);
- $goods_id_arr = array_column($goods_list, 'id');
- $where[] = ['goods_id' => $goods_id_arr];
- }
- $params['where'] = $where;
- $params['order'] = 'id DESC';
- $params['limit'] = 10;
- $params['select']='id,goods_id,created_at';
- $list = SeckillActivity::listPage($params,false,true);
- if(!empty($list['list'])){
- if(!isset($goods_list)){
- $goods_ids = array_column($list['list'],'goods_id');
- $goods_list = Goods::lists(['where' => [['mall_id' => $mall_id], ['id'=>$goods_ids], ['status' => StatusEnum::ENABLED]],
- 'select' => 'id,cover_pic,goods_name,sales_num,virtual_sales,price,original_price,subtitle','index'=>'id']);
- }
- foreach ($list['list'] as &$item){
- $item['more_params'] = '?proId='.$item['goods_id'].'&marketing_type=Seckill¶ms={"activity_id":'.$item['id'].'}';
- $item['activity_id'] = $item['id'];
- $item['id'] = $item['goods_id'];
- $item['img'] = '';
- $item['title'] = '';
- $item['sales_num'] = 0;
- $item['price'] = '';
- $item['original_price'] = '';
- $item['subtitle'] = '';
- if(isset($goods_list)&&isset($goods_list[$item['goods_id']])){
- $item['img'] = $goods_list[$item['goods_id']]['cover_pic'];
- $item['title'] = $goods_list[$item['goods_id']]['goods_name'];
- $item['price'] = $goods_list[$item['goods_id']]['price'];
- $item['original_price'] = $goods_list[$item['goods_id']]['original_price'];
- $item['subtitle'] = $goods_list[$item['goods_id']]['subtitle'];
- $item['sales_num'] = $goods_list[$item['goods_id']]['sales_num']+$goods_list[$item['goods_id']]['virtual_sales'];
- }
- // unset($item['goods_id']);
- }
- }
- return $list;
- }
- }
|