123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- 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;
- }
- }
|