// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\common\model; use app\common\library\helper; use app\common\model\CouponRefuse; /** * 优惠券模型 * Class Coupon * @package app\common\model */ class Coupon extends BaseModel { // 定义表名 protected $name = 'coupon'; // 定义主键 protected $pk = 'coupon_id'; // 允许叠加其他优惠 const OVERLAY_DISCOUNT = [ 1 => '分销员商品折扣', ]; /** * 追加字段 * @var array */ protected $append = ['state','fmt_expire_time','open_status','overlay_discount_text']; //满减券 const ManJian = 20; //折扣券 const DISCOUNT = 50; //会员专享优惠券 const MEMBER_COUPON = 90; //会员生日礼券 const MEMBER_BIRTH_COUPON = 100; /** * 允许叠加其他优惠 * * @param $value * @param $data * @return string */ public function getOverlayDiscountTextAttr($value, $data) { $overlay_discount = !empty($data['overlay_discount']) ? explode(',', $data['overlay_discount']) : []; if (empty($overlay_discount)) { return '无'; } $res = []; foreach ($overlay_discount as $item) { if (isset(self::OVERLAY_DISCOUNT[$item])) { $res[] = self::OVERLAY_DISCOUNT[$item]; } } return implode(',', $res); } public function getOverlayDiscountAttr($value) { return $value ? explode(',', $value) : []; } public function setOverlayDiscountAttr($value) { return $value ? implode(',', $value) : ''; } //有效状态 public function getOpenStatusAttr($value,$data){ $now = Date("Y-m-d H:i:s",time()); if(!isset($data['status'])||!isset($data['end_time'])){ return ['text'=>'失效','value'=>2]; } if(isset($data['audit_status'])&&$data['audit_status']!=10){ return ['text'=>'失效','value'=>2]; } //到期类型(20固定时间) if($data['expire_type']==20){ if(isset($data['audit_status'])&&$data['status']&&$data['status']==1&&$data['expire_time']>$now){ return ['text'=>'有效','value'=>1]; } if(isset($data['status'])&&isset($data['expire_time'])&&$data['status']==0||$data['expire_time']<$now){ return ['text'=>'失效','value'=>2]; } } //到期类型(10领取后生效) if($data['expire_type']==10){ //未到开始时间的失效 if(isset($data['audit_status'])&&$data['status']&&$data['status']==1&&strtotime($data['start_time'])>time()){ return ['text'=>'失效','value'=>2]; } if(isset($data['audit_status'])&&$data['status']&&$data['status']==1&&$data['end_time']>$now){ return ['text'=>'有效','value'=>1]; } if(isset($data['status'])&&isset($data['end_time'])&&$data['status']==0||$data['end_time']<$now){ return ['text'=>'失效','value'=>2]; } } return ['text'=>'失效','value'=>2]; } public function getFmtExpireTimeAttr($value,$data){ if(isset($data['expire_type'])&&$data['expire_type']==10){ if($data['expire_day']>1){ $d = $data['expire_day'] -1; $expire_time = date('Y-m-d',strtotime('+'.$d.' day')). ' 23:59:59' ; }else{ $expire_time = date("Y-m-d",time()).' 23:59:59'; } return $expire_time; } return $data['expire_time']??''; } // /** // * 优惠券状态 (是否可领取) // * @param $value // * @param $data // * @return array // */ // public function getStateAttr($value, $data) // { // if (isset($data['is_receive']) && $data['is_receive']) { // return ['text' => '已领取', 'value' => 0]; // } // if (isset($data['limit_total_type'])&&$data['limit_total_type']==10&&isset($data['total_num'])&&$data['total_num'] > -1 && $data['receive_num'] >= $data['total_num']) { // return ['text' => '领完啦', 'value' => -1]; // } // return ['text' => '正常', 'value' => 1]; // } /** * 获取器:格式化折扣率 * @param $value * @return mixed */ // public function getDiscountAttr($value) // { // return $value / 10; // } /** * 获取器:开始时间 * @param $value * @return string */ public function getStartTimeAttr($value) { return $value; // return date('Y/m/d', $value); } /** * 获取器:结束时间 * @param $value * @return string */ public function getEndTimeAttr($value) { return $value; // return date('Y/m/d', $value); } /** * 获取器:适用范围配置 * @param $value * @return mixed */ public function getApplyRangeConfigAttr($value) { return $value ? helper::jsonDecode($value) : []; } /** * 修改器:格式化折扣率 * @param $value * @return mixed */ // public function setDiscountAttr($value) // { // return $value * 10; // } /** * 修改器:适用范围配置 * @param $array * @return mixed */ public function setApplyRangeConfigAttr($array) { return helper::jsonEncode($array); } /** * 优惠券详情 * @param int $couponId * @return null|static */ public static function detail(int $couponId,$with =[]) { return self::get($couponId,$with); } /** * 关联小程序码 * @return \think\model\relation\HasOne */ public function qrcode() { return $this->hasOne(UploadFile::class, 'file_id', 'qrcode_id'); } /** * 一对多关联 优惠券除外商品表 */ public function goodsExcept() { return $this->hasMany('CouponGood', 'coupon_id')->where('is_except', CouponGood::EXCEPT_YES) ->order('id', 'desc'); } /** * 一对多关联 拒绝原因 */ public function refuse(){ return $this->hasMany('CouponRefuse', 'coupon_id') ->order('id', 'desc'); } /** * 获取列表记录 * @param array $param * @return \think\Paginator * @throws \think\db\exception\DbException */ public function getCouponGroupBuyLblist(array $param = []){ $f[] = ['status','=',1]; $f[] = ['audit_status','=',10]; $f[] = ['activity_type','=',2]; $f = array_merge($f,$param); // 查询列表数据 $query = $this->with([])->where($f); //有效 $now = Date("Y-m-d H:i:s",time()); $query->where('IF ( `expire_type` = 20,`expire_time` > "'.$now.'", `end_time`>"'.$now.'" )'); return $query->where('is_delete', '=', 0) ->order(['coupon_id' => 'desc']) ->select(); } }