161 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			161 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | namespace app\shop\validate; | ||
|  | 
 | ||
|  | use app\common\model\bargain\Bargain; | ||
|  | use app\common\model\team\TeamActivity; | ||
|  | use think\Validate; | ||
|  | use app\common\model\seckill\SeckillTime; | ||
|  | use app\common\model\seckill\SeckillGoods; | ||
|  | use app\common\model\goods\Goods; | ||
|  | use app\common\model\goods\GoodsItem; | ||
|  | 
 | ||
|  | class SeckillGoodsValidate extends Validate | ||
|  | { | ||
|  |     protected $rule = [ | ||
|  |         'start_end'        => 'require', | ||
|  |         'seckill_id'        => 'require|checkSeckill', | ||
|  |         'item'              => 'require|checkActivity' | ||
|  |     ]; | ||
|  |     protected $message = [ | ||
|  |         'start_end.require'    => '请选择日期', | ||
|  |         'seckill_id.require'    => '请选择秒杀时段', | ||
|  |         'item.require'          => '请选择秒杀商品', | ||
|  |     ]; | ||
|  | 
 | ||
|  |     public function checkSeckill($value,$rule,$data){ | ||
|  |         $seckill = SeckillTime::where(['del'=>0,'id'=>$value])->findOrEmpty(); | ||
|  |         if($seckill->isEmpty()){ | ||
|  |             return '秒杀时间段已被调整,请重新选择时间段'; | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function sceneAdd(){ | ||
|  |         $this->append('item','checkAddGoods'); | ||
|  | 
 | ||
|  |     } | ||
|  |     public function sceneEdit(){ | ||
|  |         $this->append('item','checkEditGoods'); | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     public function checkAddGoods($value,$rule,$data){ | ||
|  |         $goods_ids = array_unique(array_column($value,'goods_id')); | ||
|  |         $goods = Goods::where(['del'=>0, 'shop_id'=>$data['shop_id']])->column('id'); | ||
|  |         $goods_item = GoodsItem::where(['goods_id'=>$goods_ids])->column('price,spec_value_str','id'); | ||
|  |         $seckill_goods = SeckillGoods::where(['seckill_id'=>$data['seckill_id'],'del'=>0])->column('item_id'); | ||
|  |         // 参与时期
 | ||
|  |         $start_end_arr = explode('~', $data['start_end']); | ||
|  |         $start_date = strtotime(trim($start_end_arr[0])); | ||
|  |         $end_date = strtotime(trim($start_end_arr[1])); | ||
|  |         // 同一日期同一时间段内不允许重复添加活动商品
 | ||
|  |         foreach($value as $item) { | ||
|  |             if(!in_array($item['goods_id'],$goods)){ | ||
|  |                 return '商品ID:'.$item['goods_id'].'已下架'; | ||
|  |             } | ||
|  | 
 | ||
|  |             $goods_price = $goods_item[$item['item_id']]['price'] ?? 0; | ||
|  |             //验证商品价格
 | ||
|  |             if($item['price'] > $goods_price){ | ||
|  |                 return '商品规格:'.$goods_item[$item['item_id']]['spec_value_str'] .'的秒杀价格高于原价'; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 获取当前商品参与过哪些日期及哪些时段的秒杀
 | ||
|  |             $joinDateTime = SeckillGoods::where(['del'=>0, 'goods_id'=>$item['goods_id']]) | ||
|  |                 ->field('seckill_id,goods_id,start_date,end_date') | ||
|  |                 ->group('seckill_id,goods_id,start_date,end_date') | ||
|  |                 ->select() | ||
|  |                 ->toArray(); | ||
|  | 
 | ||
|  |             foreach($joinDateTime as $subItem) { | ||
|  |                 if($data['seckill_id'] == $subItem['seckill_id'] && $start_date < strtotime($subItem['start_date']) && $end_date < strtotime($subItem['start_date'])) { | ||
|  |                     // 时间段相同,新增日期不在已存在的日期范围,允许添加
 | ||
|  |                     continue; | ||
|  |                 }else if($data['seckill_id'] == $subItem['seckill_id'] && $start_date > strtotime($subItem['end_date']) && $end_date > strtotime($subItem['end_date'])) { | ||
|  |                     // 时间段相同,新增日期不在已存在的日期范围,允许添加
 | ||
|  |                     continue; | ||
|  |                 }else if($data['seckill_id'] != $subItem['seckill_id']) { | ||
|  |                     // 时间段不同,允许新增
 | ||
|  |                     continue; | ||
|  |                 }else{ | ||
|  |                     return '商品已在活动中,请勿重新添加'; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function checkEditGoods($value,$rule,$data){ | ||
|  |         $goods_ids = array_unique(array_column($value,'goods_id')); | ||
|  |         $seckill_ids = array_column($value,'id'); | ||
|  | 
 | ||
|  |         $seckill_goods = SeckillGoods::where(['goods_id'=>$goods_ids,'seckill_id'=>$data['seckill_id']]) | ||
|  |             ->where('id','not in',$seckill_ids) | ||
|  |             ->find(); | ||
|  | 
 | ||
|  |         $goods = Goods::where(['del'=>0])->column('id'); | ||
|  |         $goods_item = GoodsItem::where(['goods_id'=>$goods_ids])->column('price,spec_value_str','id'); | ||
|  | 
 | ||
|  |         // 参与时期
 | ||
|  |         $start_end_arr = explode('~', $data['start_end']); | ||
|  |         $start_date = strtotime(trim($start_end_arr[0])); | ||
|  |         $end_date = strtotime(trim($start_end_arr[1])); | ||
|  |         // 同一日期同一时间段内不允许重复添加活动商品
 | ||
|  |         foreach ($value as $item){ | ||
|  |             if(!in_array($item['goods_id'],$goods)){ | ||
|  |                 return '商品ID:'.$item['goods_id'].'已下架'; | ||
|  |             } | ||
|  | 
 | ||
|  |             $goods_price = $goods_item[$item['item_id']]['price'] ?? 0; | ||
|  | 
 | ||
|  |             //验证商品价格
 | ||
|  |             if($item['price'] > $goods_price){ | ||
|  |                 return '商品规格:'.$goods_item[$item['item_id']]['spec_value_str'] .'的秒杀价格高于原价'; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 获取当前商品参与过哪些日期及哪些时段的秒杀
 | ||
|  |             $joinDateTime = SeckillGoods::where([ | ||
|  |                 ['del', '=', 0], | ||
|  |                 ['goods_id', '=', $item['goods_id']], | ||
|  |                 ['id', 'not in', $seckill_ids] | ||
|  |             ]) | ||
|  |                 ->field('seckill_id,goods_id,start_date,end_date') | ||
|  |                 ->group('seckill_id,goods_id,start_date,end_date') | ||
|  |                 ->select() | ||
|  |                 ->toArray(); | ||
|  | 
 | ||
|  |             foreach($joinDateTime as $subItem) { | ||
|  |                 if($data['seckill_id'] == $subItem['seckill_id'] && $start_date < strtotime($subItem['start_date']) && $end_date < strtotime($subItem['start_date'])) { | ||
|  |                     // 时间段相同,新增日期不在已存在的日期范围,允许添加
 | ||
|  |                     continue; | ||
|  |                 }else if($data['seckill_id'] == $subItem['seckill_id'] && $start_date > strtotime($subItem['end_date']) && $end_date > strtotime($subItem['end_date'])) { | ||
|  |                     // 时间段相同,新增日期不在已存在的日期范围,允许添加
 | ||
|  |                     continue; | ||
|  |                 }else if($data['seckill_id'] != $subItem['seckill_id']) { | ||
|  |                     // 时间段不同,允许新增
 | ||
|  |                     continue; | ||
|  |                 }else{ | ||
|  |                     return '商品已在活动中,请勿重新添加'; | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function checkActivity($item, $rule, $data) | ||
|  |     { | ||
|  |         foreach($item as $v) { | ||
|  |             $team = TeamActivity::where(['del' => 0, 'goods_id' => $v['goods_id']])->select()->toArray(); | ||
|  |             if($team) { | ||
|  |                 return '商品正在参加拼团活动,不能再参与限时秒杀!'; | ||
|  |             } | ||
|  |             $bargain = Bargain::where(['del' => 0, 'goods_id' => $v['goods_id']])->select()->toArray(); | ||
|  |             if($bargain) { | ||
|  |                 return '商品正在参加砍价活动,不能再参与限时秒杀!'; | ||
|  |             } | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  | } |