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; } }