// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model; use app\api\service\user\Avatar; use app\common\enum\coupon\CouponType; use app\common\library\helper; use app\common\model\Coupon as CouponModel; // use app\common\model\CouponRefuse as CouponRefuseModel; use app\store\model\CouponGood as CouponGoodModel; use app\store\model\CouponRefuse as CouponRefuseModel; use app\store\model\member\MemberCardsAction; /** * 优惠券模型 * Class Coupon * @package app\store\model */ class Coupon extends CouponModel { /** * 获取器:格式化折扣率 * @param $value * @return mixed */ public function getDiscountAttr($value) { return $value / 10; } /** * 修改器:格式化折扣率 * @param $value * @return mixed */ public function setDiscountAttr($value) { return $value * 10; } /** * 获取列表记录 * @param array $param * @return \think\Paginator * @throws \think\db\exception\DbException */ public function getCouponGroupBuyLbPagelist(array $param = []){ $f[] = ['status','=',1]; $f[] = ['audit_status','=',10]; $f[] = ['activity_type','=',2]; // 查询列表数据 $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'])->paginate(15); } // /** // * 获取列表记录 // * @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(); // } /** * 获取列表记录 * @param array $param * @return \think\Paginator * @throws \think\db\exception\DbException */ public function getList(array $param = []) { // 检索查询条件 $filter = $this->getFilter($param); // 查询列表数据 $query = $this->with(['refuse','qrcode'])->where($filter); if(isset($param['open_status'])){ //有效 $now = Date("Y-m-d H:i:s",time()); if($param['open_status']==1){ // $query->where('IF ( `limit_total_type` = 10,`receive_num` <= `total_num`, `total_num`=0 )'); //固定时间 // expire_type 20 固定截止时间 10 顺延固定天数过期 $query->where('IF ( `expire_type` = 20,`expire_time` > "'.$now.'", `end_time`>"'.$now.'" )'); $f[] = ['status','=',1]; $query->where($f); } //失效 if($param['open_status']==2){ // $query->whereOr('status','=',0); // $query->whereOr('IF ( `expire_type` = 20,`expire_time` < "'.$now.'", `end_time`<"'.$now.'" )'); $query->where(function($query)use($now){ $query->whereOr('status','=',0); $query->whereOr('IF ( `expire_type` = 20,`expire_time` < "'.$now.'", `end_time`<"'.$now.'" )'); }); } } return $query->where('is_delete', '=', 0) ->order(['coupon_id' => 'desc']) ->paginate(15); } public function getMemTypeList($params){ //$now = Date("Y-m-d H:i:s",time()); $filter[] = ['is_delete','=',0]; $filter[] = ['end_time','>',date('Y-m-d H:i:s')]; $filter[] = ['start_time','<',date('Y-m-d H:i:s')]; $filter[] = ['audit_status','=',10]; if (!empty($params['couponId'])){ $filter[] = ['coupon_id','=',$params['couponId']]; } if (!empty($params['name'])){ $filter[] = ['name','like','%'.$params['name'].'%']; } return $this->where('coupon_type',self::MEMBER_COUPON) ->where('expire_type', '=',10) ->where($filter) ->where('status',1) ->where('receive_type',10) ->field('coupon_id,name,coupon_type,reduce_price,min_price,expire_type,expire_day,start_time,end_time,total_num,limit_receive_cnt,audit_status,status,limit_total_type,limit_receive_type') ->order(['coupon_id' => 'desc']) ->paginate(15); } /** * 启用 禁用 * @param array $data * @return bool */ public function status(array $data): bool { $this->transaction(function () use ($data) { $coupon_id = (int)$this['coupon_id']; $this->save($data); }); return true; } /** * 审核 * @param array $data * @return bool */ public function audit(array $data): bool { if ($data['audit_status'] == 20) { $data['status'] =-1; } $memberAction = false; if(isset($data['coupon_type'])){ if ($data['coupon_type'] == self::MEMBER_COUPON || $data['coupon_type'] == self::MEMBER_BIRTH_COUPON){ $memberAction = true; } } $this->transaction(function () use ($data,$memberAction) { $coupon_id = (int)$this['coupon_id']; $this->save($data); if($data['audit_status'] == 20){ $refuse['coupon_id'] = $coupon_id; $refuse['refuse_desc'] = $data['refuse_desc']; $refuse['audit_time'] = Date("Y-m-d H:i:s",time()); $refuse['audit_user'] = $data['audit_user']; $refuseModel = new CouponRefuseModel; $refuseModel->save($refuse); } if ($memberAction){ $acts['audit_user'] = $data['audit_user']?:''; $acts['audit_admin_id'] = $data['audit_admin_id']; $acts['audit_status'] = $data['audit_status']==10?1:2; $acts['audit_reason'] = $data['refuse_desc']??''; $acts['target_type'] = 6; (new MemberCardsAction())->add($this->coupon_id, $acts); } }); return true; } /** * 检索查询条件 * @param array $param * @return array */ private function getFilter(array $param = []): array { // 默认查询条件 $param = $this->setQueryDefaultValue($param, ['audit_status'=>-1,'status'=>-1,'coupon_type'=>0,'coupon_id'=>0,'send_type'=>0]); // 检索查询条件 $filter = []; if(isset($param['show_type']) && $param['show_type'] == 2){ $filter[] = ['coupon_type','>=',self::MEMBER_COUPON]; if (!empty($param['name'])){ $filter[] = ['name|coupon_id','like','%'.$param['name'].'%']; } }else{ $filter[] = ['coupon_type','<',self::MEMBER_COUPON]; !empty($param['name']) && $filter[] = ['name', 'like', "%{$param['name']}%"]; } //!empty($param['name']) && $filter[] = ['name', 'like', "%{$param['name']}%"]; if($param['status']>-1){ $filter[] = ['status','=',$param['status']]; } if($param['audit_status']>-1){ $filter[] = ['audit_status','=',$param['audit_status']]; } !empty($param['create_user']) && $filter[] = ['create_user', 'like', "%{$param['create_user']}%"]; if($param['coupon_type']>0){ $filter[] = ['coupon_type','=',$param['coupon_type']]; } if($param['coupon_id']>0){ $filter[] = ['coupon_id','=',$param['coupon_id']]; } if(!empty($param['audit_start_time'])) { $audit_start_time = str2time_date($param['audit_start_time']); $filter[] = ['audit_time', '>=', $audit_start_time]; } if(!empty($param['audit_end_time'])) { $audit_end_time = str2time_date($param['audit_end_time']); $filter[] = ['audit_time', '<', $audit_end_time]; } if(!empty($param['create_start_time'])) { $create_start_time = str2time_date($param['create_start_time']); $filter[] = ['create_time', '>=', $create_start_time]; } if(!empty($param['create_end_time'])) { $create_end_time = str2time_date($param['create_end_time']); $filter[] = ['create_time', '<', $create_end_time]; } // 审核时间 if (!empty($param['auditTime'])) { $times = between_time($param['auditTime']); //$filter[] = ['audit_time', '>=', $times['start_time']]; $filter[] = ['audit_time', '>=', date('Y-m-d 00:00:00', $times['start_time'])]; //$filter[] = ['audit_time', '<', $times['end_time'] + 86400]; $filter[] = ['audit_time', '<', date('Y-m-d 00:00:00', $times['end_time']+86400)]; } // 创建时间 if (!empty($param['createTime'])) { $times = between_time($param['createTime']); $filter[] = ['create_time', '>=', $times['start_time']]; $filter[] = ['create_time', '<', $times['end_time'] + 86400]; } if($param['send_type']>0){ $filter[] = ['send_type','=',$param['send_type']]; } //活动来源 if(isset($param['activity_type'])&&$param['activity_type']>0){ $filter[] = ['activity_type','=',$param['activity_type']]; } //活动ID if(isset($param['activity_id'])&&$param['activity_id']>0){ $filter[] = ['activity_id','=',$param['activity_id']]; } //是否允许叠加其他优惠 if (isset($param['overlay_discount']) && $param['overlay_discount'] > 0) { $filter[] = ['exp', "FIND_IN_SET({$param['overlay_discount']}, 'overlay_discount')"]; } return $filter; } /** * 新增记录 * @param array $data * @return bool */ public function addOne(array $data) { $memberAction = false; if ($data['coupon_type'] == self::MEMBER_COUPON){ $data['start_time'] = date('Y-m-d H:i:s',strtotime($data['start_time'])); $nextM = mktime(0,0,0,date('m',strtotime($data['end_time'])) +1,1,intval(date('Y',strtotime($data['end_time'])))); $data['end_time'] = date('Y-m-d H:i:s',$nextM - 1 ); //$data['end_time'] = date('Y-m-d H:i:s',strtotime($data['end_time'])); $memberAction = true; } if ($data['coupon_type'] == self::MEMBER_BIRTH_COUPON){ $data['start_time'] = $data['start_time'].'-01-01 00:00:00'; $data['end_time'] = $data['end_time'].'-12-31 23:59:59'; $memberAction = true; } if ($data['coupon_type'] == self::ManJian || $data['coupon_type'] == self::DISCOUNT){ if ($data['role'] == 1){ $data['status'] = 1; $data['audit_time'] = Date("Y-m-d H:i:s",time()); $data['audit_user'] = $data['create_user']; $data['audit_admin_id'] = $data['audit_admin_id']?:''; $data['audit_status'] = 10; } } $this->transaction(function () use ($data,$memberAction) { // 新增记录 $data['overlay_discount'] = $data['overlay_discount'] ?? []; $data['avaiable_num'] = $data['total_num'] ?? 0; $data['max_discount_price'] = $data['max_discount_price'] ?? 0; // $data['start_time'] = Date("Y-m-d H:i:s",str2time_date($data['start_time'])); // $data['end_time'] = Date("Y-m-d H:i:s",str2time_date($data['end_time'])); if(isset($data['expire_time'])){ // $data['expire_time'] = Date("Y-m-d H:i:s",str2time_date($data['expire_time'])); } $data['is_limit_hour'] = 0; if(!empty($data['start_hour'])&&!empty($data['end_hour'])){ $data['is_limit_hour'] = 1;//有限时间段 }else{ $data['is_limit_hour'] = 0;//有限时间段 } $this->save($data); // 优惠券 除外商品-满减券 $couponGoodModel = new CouponGoodModel(); $couponGoodModel->add($this->coupon_id, CouponGoodModel::EXCEPT_YES, $data['coupon_goods_expect']??[]); if ($memberAction){ $acts['audit_user'] = $data['create_user']?:''; $acts['audit_admin_id'] = $data['audit_admin_id']; $acts['audit_status'] = 0; $acts['target_type'] = 6; (new MemberCardsAction())->add($this->coupon_id, $acts); } // 生成优惠券小程序码 $qrcodeId = $this->genQrcode($this->coupon_id); $this->where('coupon_id',$this->coupon_id)->update(['qrcode_id' => $qrcodeId]); }); return true; } /** * 新增记录 * @param array $data * @return bool */ public function updateOne(array $data) { //会员卡行为 $memberAction = false; if ($data['coupon_type'] == self::MEMBER_COUPON){ $data['start_time'] = date('Y-m-d H:i:s',strtotime($data['start_time'])); $data['end_time'] = date('Y-m-d H:i:s',strtotime($data['end_time'])); $memberAction = true; } if ($data['coupon_type'] == self::MEMBER_BIRTH_COUPON){ $data['start_time'] = date('Y-01-01 00:00:00',strtotime($data['start_time'])); $data['end_time'] = date('Y-12-31 23:59:59',strtotime($data['end_time'])); $memberAction = true; } $this->transaction(function () use ($data,$memberAction) { // 新增记录 // $data['start_time'] = Date("Y-m-d H:i:s",str2time_date($data['start_time'])); // $data['end_time'] = Date("Y-m-d H:i:s",str2time_date($data['end_time'])); if(isset($data['expire_time'])){ // $data['expire_time'] = Date("Y-m-d H:i:s",str2time_date($data['expire_time'])); } $coupon_id = $data['coupon_id']; // unset($data['coupon_id']); $coupon_goods_expect = $data['coupon_goods_expect']??[]; $data['status'] =-1; $data['audit_status'] =0; $data['create_time'] = time(); unset($data['coupon_goods_expect']); if(!empty($data['start_hour'])&&!empty($data['end_hour'])){ $data['is_limit_hour'] = 1;//有限时间段 } $data['max_discount_price'] = $data['max_discount_price'] ?? 0; // if (!empty($data['overlay_discount'])) { // $data['overlay_discount'] = implode(',', $data['overlay_discount']); // } else { // $data['overlay_discount'] = ''; // } $this->save($data); // 优惠券 除外商品-满减券 $couponGoodModel = new CouponGoodModel(); $couponGoodModel->add($coupon_id, CouponGoodModel::EXCEPT_YES, $coupon_goods_expect); if ($memberAction){ $acts['audit_user'] = $data['audit_user']?:''; $acts['audit_admin_id'] = $data['audit_admin_id']; $acts['audit_status'] = 0; $acts['target_type'] = 6; (new MemberCardsAction())->add($this->coupon_id, $acts); } }); return true; } /** * 添加新记录 * @param array $data * @return false|int */ public function add(array $data) { $data['store_id'] = self::$storeId; return $this->save($this->createData($data)); } /** * 更新记录 * @param array $data * @return bool|int */ public function edit(array $data) { return $this->save($this->createData($data)) !== false; } /** * 创建数据 * @param array $data * @return array */ private function createData(array $data): array { // 折扣券记录有效期 // 领取后生效 if ($data['expire_type'] == ExpireTypeEnum::RECEIVE) { $data['start_time'] = $data['end_time'] = 0; } // 固定时间 elseif ($data['expire_type'] == ExpireTypeEnum::FIXED_TIME) { $times = between_time($data['betweenTime']); $data['start_time'] = $times['start_time']; $data['end_time'] = $times['end_time']; $data['expire_day'] = 0; } // 适用范围 if ($data['apply_range'] == ApplyRangeEnum::ALL) { $data['apply_range_config'] = []; } return $data; } /** * 删除记录 (软删除) * @return bool|int */ public function setDelete() { return $this->save(['is_delete' => 1]) !== false; } public function getStatisticList($params){ $where = $this->getStatisticFilter($params); //dd($where); $list = $this->where('is_delete',0); if (count($where)){ $list = $list->where($where); } //券状态 if (isset($params['open_status']) && $params['open_status'] >= 0){ if($params['open_status'] == 1){ $list = $list->where('status',1)->whereRaw('expire_type=10 or (expire_type =20 and unix_timestamp(expire_time) > unix_timestamp(NOW()))'); }else{ $list = $list->whereRaw('status=0 or (expire_type =20 and unix_timestamp(expire_time) < unix_timestamp(NOW()))'); } } $list = $list->field('coupon_id,name,coupon_type,reduce_price,min_price,expire_day,status,expire_time,expire_type,total_num,receive_num,start_time,end_time,audit_status, discount_type,max_discount_price,overlay_discount,discount') ->order('coupon_id','desc') ->paginate(15)->each(function($item){ $item->open_status_o = 0;//券状态 if ($item->status == 1){ if ($item->expire_type == 10){//到期类型(10领取后生效 20固定时间) $item->open_status_o = 1; }elseif ($item->expire_type == 20 && strtotime($item->expire_time) > time()){// $item->open_status_o = 1; }else{ $item->open_status_o = 0; } } $item->real_draw = UserCoupon::countACouponUser($item->coupon_id); $item->real_used = UserCoupon::countACouponUser($item->coupon_id,['is_use'=>1]); $item->coupon_use_money = UserCoupon::countMoneyCouponUser($item->coupon_id,['is_use'=>1]); $item->use_rate = $item->real_draw>0? helper::bcdiv($item->real_used*100,$item->real_draw) : '0.00'; $filter[] = ['is_use', '=', 0]; $filter[] = ['expire_time', '<', date('Y-m-d H:i:s')]; $item->expire_count = UserCoupon::countACouponUser($item->coupon_id,$filter); })->toArray(); return $list; } public function getMemberStatisticList($params){ $where = []; //券名称.券ID if (isset($params['name']) && $params['name']){ $where[] = ['name|coupon_id', 'like', '%'.$params['name'].'%']; } //券类型 if (isset($params['coupon_type']) && in_array($params['coupon_type'],[90,100])){ $where[] = ['coupon_type', '=', $params['coupon_type']]; }else{ $where[] = ['coupon_type', '>=', 90]; } $list = $this->where('is_delete',0); if (count($where)){ $list = $list->where($where); } //券状态 if (isset($params['open_status']) && $params['open_status'] >= 0){ if($params['open_status'] == 1){ $list = $list->where('status',1)->whereRaw('expire_type=10 or (expire_type =20 and unix_timestamp(expire_time) > unix_timestamp(NOW()))'); }else{ $list = $list->whereRaw('status=0 or (expire_type =20 and unix_timestamp(expire_time) < unix_timestamp(NOW()))'); } } $list = $list->field('coupon_id,name,coupon_type,reduce_price,min_price,expire_day,status,expire_time, expire_type,receive_num,audit_status,status,start_time,end_time,discount_type,discount') ->order('coupon_id','desc') ->paginate(15)->each(function($item){ $item->open_status_o = 0;//券状态 if ($item->status == 1){ if ($item->expire_type == 10){//到期类型(10领取后生效 20固定时间) $item->open_status_o = 1; }elseif ($item->expire_type == 20 && strtotime($item->expire_time) > time()){// $item->open_status_o = 1; }else{ $item->open_status_o = 0; } } $item->real_draw = UserCoupon::countACouponUser($item->coupon_id); $item->real_used = UserCoupon::countACouponUser($item->coupon_id,['is_use'=>1]); $filter[] = ['is_use', '=', 0]; $filter[] = ['expire_time', '<', date('Y-m-d H:i:s')]; $item->expire_count = UserCoupon::countACouponUser($item->coupon_id,$filter); })->toArray(); return $list; } /** * 检索查询条件 * @param array $param * @return array */ private function getStatisticFilter(array $param = []): array { // 检索查询条件 $filter = []; //券名称 if (isset($param['name']) && $param['name']){ $filter[] = ['name', 'like', '%'.$param['name'].'%']; } //券ID if (isset($param['coupon_id']) && $param['coupon_id']){ $filter[] = ['coupon_id', 'like', $param['coupon_id'].'%']; } //券类型 if (isset($param['coupon_type']) && $param['coupon_type']>=0){ $filter[] = ['coupon_type', '=', $param['coupon_type']]; } return $filter; } /** * 获取优惠券落地页小程序码 * * @return string */ public static function genQrcode($couponId) { $path = "/pages/index/pages/couponShare/couponShare?id=$couponId"; // 优惠券落地页 $qrcode = request()->domain()."/api/mp_wx/qrcode?path=".urlencode($path); $qrcodeId = (new Avatar())->party($qrcode, 'qrcode'); return $qrcodeId; } }