From 5e9d0351298b928a1ce2d12773cb4912e04c6278 Mon Sep 17 00:00:00 2001 From: xucong <850806214@qq.com> Date: Thu, 8 May 2025 14:38:40 +0800 Subject: [PATCH] =?UTF-8?q?1.=E7=BC=BA=E5=A4=B1=E4=BF=A1=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/controller/UserAddressController.php | 4 +- app/api/controller/signController.php | 93 ++++++ app/api/logic/SignLogic.php | 313 ++++++++++++++++++ .../topthink/think-helper/src/helper/Time.php | 203 ++++++++++++ 4 files changed, 611 insertions(+), 2 deletions(-) create mode 100644 app/api/controller/signController.php create mode 100644 app/api/logic/SignLogic.php create mode 100644 vendor/topthink/think-helper/src/helper/Time.php diff --git a/app/api/controller/UserAddressController.php b/app/api/controller/UserAddressController.php index da92704..219bbde 100644 --- a/app/api/controller/UserAddressController.php +++ b/app/api/controller/UserAddressController.php @@ -31,7 +31,7 @@ class UserAddressController extends BaseApiController //获取地址列表 public function lists() { - $user_id = $this->user_id; + $user_id = $this->userId; $result = UserAddressLogic::infoUserAddress($user_id); $this->_success('获取成功', $result); } @@ -47,7 +47,7 @@ class UserAddressController extends BaseApiController $user_id = $this->user_id; $result = UserAddressLogic::getOneAddress($user_id, $get); if ($result) { - $this->_success('获取成功', $result); + $this->success('获取成功', $result); } $result = '获取失败'; } diff --git a/app/api/controller/signController.php b/app/api/controller/signController.php new file mode 100644 index 0000000..8a4d6d7 --- /dev/null +++ b/app/api/controller/signController.php @@ -0,0 +1,93 @@ +userId); + $this->success('获取成功',$sign); + } + + /** + * showdoc + * @catalog 接口/签到 + * @title 签到 + * @description 签到 + * @method get + * @url /sign/sign + * @return {"code":1,"msg":"获取成功","data":{"integral":"22","growth":"552","day":1},"show":0,"time":"0.201775","debug":{"request":{"get":[],"post":[],"header":{"connection":"keep-alive","accept-encoding":"gzip, deflate, br","host":"www.likeb2b2c.com:20002","postman-token":"1c4ef02d-b268-4ba7-a5df-c5b6a5f3d630","accept":"*\/*","user-agent":"PostmanRuntime\/7.26.2","token":"ff0c66fe0c89fe1e9be591d82d551521","content-type":"","content-length":""}}}} + * @return_param integral int 获得积分值 + * @return_param growth int 获得成长值 + * @return_param days int 连续天数 + * @remark + * @number 1 + */ + public function sign(){ + $result = $this->validate(['user_id'=>$this->userId],'app\api\validate\Sign'); + if($result === true){ + $result = SignLogic::sign($this->userId); + if(is_array($result)){ + $this->success('签到成功',$result); + } + } + $this->fail($result); + + + + + } + + /** + * showdoc + * @catalog 接口/签到 + * @title 获取签到规则 + * @description 获取签到规则 + * @method get + * @url /sign/rule + * @return {"code":1,"msg":"获取成功","data":"1.每天签到可以获得每天签到奖励;\n2.每日最多可签到1次,断签则会重新计算连签天数,达到连续天数后即可获得连续奖励;\n3.活动以及奖励最终解释权归商家所有。\n","show":0,"time":"0.173280","debug":{"request":{"get":[],"post":[],"header":{"connection":"keep-alive","accept-encoding":"gzip, deflate, br","host":"www.likeb2b2c.com:20002","postman-token":"e8617112-b05d-4bea-a8d8-424a674f1c84","accept":"*\/*","user-agent":"PostmanRuntime\/7.26.2","token":"ff0c66fe0c89fe1e9be591d82d551521","content-type":"","content-length":""}}}} + * @return_param * text 规则 + * @remark + * @number 1 + */ + public function rule(){ + $rule = ConfigServer::get('sign_rule','instructions',''); + $this->_success('获取成功',$rule); + } +} \ No newline at end of file diff --git a/app/api/logic/SignLogic.php b/app/api/logic/SignLogic.php new file mode 100644 index 0000000..690181d --- /dev/null +++ b/app/api/logic/SignLogic.php @@ -0,0 +1,313 @@ +where(['id'=>$user_id]) + ->field('id,nickname,avatar,user_integral') + ->find(); + + $user['avatar'] = UrlServer::getFileUrl($user['avatar']); + $user['today_sign'] = 0; + $today_sign = Db::name('user_sign') + ->where(['del'=>0 , 'user_id'=>$user_id]) + ->where("state",1) + ->whereTime('sign_time', 'today') + ->find(); + + list($today_start,$today_end) = Time::today(); + //今天是否已签到 + $today_sign && $user['today_sign'] = 1; + //今天签到赠送的积分 + $today_sign_integral = 0; + //昨天是否签到 + $yester_sign = Db::name('user_sign') + ->where(['del'=>0 , 'user_id'=>$user_id]) + ->where("state",1) + ->whereTime('sign_time', 'yesterday') + ->find(); + //昨天没签到,则签到中断重新计算连续天数 + if(!$yester_sign){ + Db::name('user_sign') + ->where(['del'=>0,'user_id'=>$user_id]) + ->where("state",1) + ->where('sign_time','<',$today_start) + ->update(['del'=> 1,'update_time'=>time()]); + } + + //签到规则 + $sign_list = Db::name('sign_daily') + ->where(['del'=>0]) + ->order('type asc,days asc') + ->column('*','days'); + $sign_total_days = ''; + $days_list = []; + if($sign_list){ + $start_sign = current($sign_list); //第一次签到规则 + $end_sign = end($sign_list); //最后一次签到规则 + //每天赠送的积分 + $everyday_send_integral = 0; + $start_sign['integral_status'] && $everyday_send_integral = $start_sign['integral']; + //累计签到的总天数 + $sign_total_days = Db::name('user_sign') + ->where(['del'=>0,'user_id'=>$user_id]) + ->where("state",1) + ->order('id desc') + ->value('days'); + + + for($days = 1; $days <= $end_sign['days'] ;$days++){ + $send_integral = $everyday_send_integral; + //连接签到赠送的积分 + if(isset($sign_list[$days]) && $sign_list[$days]['integral_status'] ){ + $send_integral = $everyday_send_integral + $sign_list[$days]['integral']; + } + //合并数据 + $days_list[$days] = [ + 'days' => $days, + 'status' => 0, + 'integral' => $send_integral, + 'growth' => 0, + ]; + $total_sin_days = $end_sign['days']; //可连续签到的最大天数 + //更新签到天数之前的签到状态 + if($days === $sign_total_days){ + $today_sign_integral = $send_integral;//今天签到获得的积分 + for ($sign_day = $days;$sign_day >= 1;$sign_day--){ + $days_list[$sign_day]['status'] = 1; + } + } + //如果连续签到天数大于总天数,则全部标记为已签到状态 + if($sign_total_days > $total_sin_days){ + $days_list[$days]['status'] = 1; + } + } + + } + $user['days'] = $sign_total_days ?: 0; + + //赚积分 + $make_inegral = []; + $make_inegral[] = [ + 'name' => '每日签到', + 'status' => $user['today_sign'], + 'integral' => $today_sign_integral, + 'type' => 1,//类型,主要用前端显示图标 + ]; + + + $order_award_integral = ConfigServer::get('marketing','order_award_integral',0); + $invited_award_integral = ConfigServer::get('marketing','invited_award_integral',0); + //下单奖励 + if($order_award_integral > 0){ + + $today_order_award = Db::name('account_log') + ->where(['user_id'=>$user_id,'source_type'=>AccountLog::order_add_integral]) + ->whereTime('create_time',[$today_start,$today_end]) + ->find(); + $make_inegral[] = [ + 'name' => '下单任意商品', + 'status' => $today_order_award ? 1 : 0, + 'integral' => $order_award_integral, + 'type' => 2, + ]; + } + //邀请奖励 + if($invited_award_integral > 0){ + $total_invited_award = Db::name('account_log') + ->where(['user_id'=>$user_id,'source_type'=>AccountLog::invite_add_integral]) + ->whereTime('create_time',[$today_start,$today_end]) + ->find(); + $make_inegral[] = [ + 'name' => '成功邀请1位好友', + 'status' => $total_invited_award ? 1 : 0, + 'integral' => $invited_award_integral, + 'type' => 3, + ]; + } + + return [ + 'user' => $user, + 'sign_list' => array_values($days_list), + 'make_inegral' => $make_inegral, + ]; + } + //签到接口 + public static function sign($user_id){ + try{ + Db::startTrans(); + $sign_list = Db::name('sign_daily') + ->where(['del'=>0,'type'=>2]) + ->order('type asc,days asc') + ->column('*','days'); + //签到记录 + $last_sign = Db::name('user_sign') + ->where(['del'=>0,'user_id'=>$user_id]) + ->order('id desc') + ->find(); + $now = time(); + $total_integral = 0; //签到赠送的积分 + $total_growth = 0; //签到赠送的成长值 + $continuous_integral = 0; //连续签到积分 + $continuous_growth = 0; //连续签到成长值 + + $sign_day = 1; //累计签到天数 + //每天签到的奖励 + $everyday_sign = Db::name('sign_daily') + ->where(['del'=>0,'type'=>1]) + ->find(); + + //有签到记录,说明之前有签到 + if($last_sign){ + + $sign_day = $last_sign['days'] + 1; + $sign = $sign_list[$sign_day] ?? []; + //累计签到天数,额外奖励 + if($sign){ + if($sign['integral_status'] && $sign['integral'] > 0){ + $total_integral+=$sign['integral']; + $continuous_integral = $sign['integral']; + } + if($sign['growth_status'] && $sign['growth'] > 0){ + $total_growth+=$sign['growth']; + $continuous_growth =$sign['growth']; + } + } + //每天签到奖励 + if($everyday_sign){ + if($everyday_sign['integral_status'] && $everyday_sign['integral'] > 0){ + $total_integral+=$everyday_sign['integral']; + } + if($everyday_sign && $everyday_sign['growth_status'] && $everyday_sign['growth'] > 0){ + $total_growth+=$everyday_sign['growth']; + } + } + $sign_add = [ + 'user_id' => $user_id, + 'days' => $sign_day, + 'integral' => $everyday_sign['integral'], + 'growth' => $everyday_sign['growth'], + 'continuous_integral' => $continuous_integral, + 'continuous_growth' => $continuous_growth, + 'sign_time' => $now, + 'create_time' => $now, + ]; + + }else{ + + //连续一天的奖励 + $one_day_sign = $sign_list['1'] ?? []; + if($one_day_sign){ + if($one_day_sign['integral_status'] && $one_day_sign['integral'] > 0){ + $total_integral+=$one_day_sign['integral']; + $continuous_integral = $one_day_sign['integral']; + } + if($one_day_sign && $one_day_sign['growth_status'] && $one_day_sign['growth'] > 0){ + $total_growth+=$one_day_sign['growth']; + $continuous_growth = $one_day_sign['growth']; + } + } + + if($everyday_sign){ + if($everyday_sign['integral_status'] && $everyday_sign['integral'] > 0){ + $total_integral+=$everyday_sign['integral']; + } + if($everyday_sign['growth_status'] && $everyday_sign['growth'] > 0){ + $total_growth+=$everyday_sign['growth']; + } + } + $sign_add = [ + 'user_id' => $user_id, + 'days' => $sign_day, + 'integral' => $everyday_sign['integral_status'] ? $everyday_sign['integral'] : 0, + 'continuous_integral' => $continuous_integral, + 'growth' => $everyday_sign['growth_status'] ? $everyday_sign['growth'] : 0, + 'continuous_growth' => $continuous_growth, + 'sign_time' => $now, + 'create_time' => $now, + ]; + } + if($last_sign == null){ + $sign_add['qi_num'] = 1; + }else{ + $last_sign_num = Db::name('user_sign') + ->where(['del'=>0,'user_id'=>$user_id]) + ->where("state",1) + ->where('qi_num',$last_sign['qi_num']) + ->count(); + if($last_sign_num+1 == 7){ + $sign_add['qi_num'] = $last_sign['qi_num']; + $sign_add['state'] = 2; + Db::name('user_sign') + ->where(['del'=>0,'user_id'=>$user_id]) + ->where('qi_num',$last_sign['qi_num']) + ->update(['state'=>2]); + }else{ + $sign_add['qi_num'] = $last_sign['qi_num']; + } + } + Db::name('user_sign')->insert($sign_add); + + if($total_integral){ + Db::name('user') + ->where(['del'=>0 , 'id'=>$user_id]) + ->setInc('user_integral',$total_integral); + AccountLogLogic::AccountRecord($user_id,$total_integral,1, AccountLog::sign_in_integral); + } + if($total_growth){ + //用户成长值 + Db::name('user') + ->where(['del'=>0 , 'id'=>$user_id]) + ->setInc('user_growth',$total_growth); + AccountLogLogic::AccountRecord($user_id,$total_growth,1,AccountLog::sign_give_growth); + + } + + Db::commit(); + return [ + 'integral' => $total_integral, + 'growth' => $total_growth, + 'days' => $sign_day, + ]; + + + }catch (Exception $e){ + Db::rollback(); + return $e->getMessage(); + + } + + + } +} \ No newline at end of file diff --git a/vendor/topthink/think-helper/src/helper/Time.php b/vendor/topthink/think-helper/src/helper/Time.php new file mode 100644 index 0000000..92c4205 --- /dev/null +++ b/vendor/topthink/think-helper/src/helper/Time.php @@ -0,0 +1,203 @@ + +// +---------------------------------------------------------------------- +namespace think\helper; + +class Time +{ + /** + * 返回今日开始和结束的时间戳 + * + * @return array + */ + public static function today() + { + list($y, $m, $d) = explode('-', date('Y-m-d')); + return [ + mktime(0, 0, 0, $m, $d, $y), + mktime(23, 59, 59, $m, $d, $y) + ]; + } + + /** + * 返回昨日开始和结束的时间戳 + * + * @return array + */ + public static function yesterday() + { + $yesterday = date('d') - 1; + return [ + mktime(0, 0, 0, date('m'), $yesterday, date('Y')), + mktime(23, 59, 59, date('m'), $yesterday, date('Y')) + ]; + } + + /** + * 返回本周开始和结束的时间戳 + * + * @return array + */ + public static function week() + { + list($y, $m, $d, $w) = explode('-', date('Y-m-d-w')); + if($w == 0) $w = 7; //修正周日的问题 + return [ + mktime(0, 0, 0, $m, $d - $w + 1, $y), mktime(23, 59, 59, $m, $d - $w + 7, $y) + ]; + } + + /** + * 返回上周开始和结束的时间戳 + * + * @return array + */ + public static function lastWeek() + { + $timestamp = time(); + return [ + strtotime(date('Y-m-d', strtotime("last week Monday", $timestamp))), + strtotime(date('Y-m-d', strtotime("last week Sunday", $timestamp))) + 24 * 3600 - 1 + ]; + } + + /** + * 返回本月开始和结束的时间戳 + * + * @return array + */ + public static function month($everyDay = false) + { + list($y, $m, $t) = explode('-', date('Y-m-t')); + return [ + mktime(0, 0, 0, $m, 1, $y), + mktime(23, 59, 59, $m, $t, $y) + ]; + } + + /** + * 返回上个月开始和结束的时间戳 + * + * @return array + */ + public static function lastMonth() + { + $y = date('Y'); + $m = date('m'); + $begin = mktime(0, 0, 0, $m - 1, 1, $y); + $end = mktime(23, 59, 59, $m - 1, date('t', $begin), $y); + + return [$begin, $end]; + } + + /** + * 返回今年开始和结束的时间戳 + * + * @return array + */ + public static function year() + { + $y = date('Y'); + return [ + mktime(0, 0, 0, 1, 1, $y), + mktime(23, 59, 59, 12, 31, $y) + ]; + } + + /** + * 返回去年开始和结束的时间戳 + * + * @return array + */ + public static function lastYear() + { + $year = date('Y') - 1; + return [ + mktime(0, 0, 0, 1, 1, $year), + mktime(23, 59, 59, 12, 31, $year) + ]; + } + + public static function dayOf() + { + + } + + /** + * 获取几天前零点到现在/昨日结束的时间戳 + * + * @param int $day 天数 + * @param bool $now 返回现在或者昨天结束时间戳 + * @return array + */ + public static function dayToNow($day = 1, $now = true) + { + $end = time(); + if (!$now) { + list($foo, $end) = self::yesterday(); + } + + return [ + mktime(0, 0, 0, date('m'), date('d') - $day, date('Y')), + $end + ]; + } + + /** + * 返回几天前的时间戳 + * + * @param int $day + * @return int + */ + public static function daysAgo($day = 1) + { + $nowTime = time(); + return $nowTime - self::daysToSecond($day); + } + + /** + * 返回几天后的时间戳 + * + * @param int $day + * @return int + */ + public static function daysAfter($day = 1) + { + $nowTime = time(); + return $nowTime + self::daysToSecond($day); + } + + /** + * 天数转换成秒数 + * + * @param int $day + * @return int + */ + public static function daysToSecond($day = 1) + { + return $day * 86400; + } + + /** + * 周数转换成秒数 + * + * @param int $week + * @return int + */ + public static function weekToSecond($week = 1) + { + return self::daysToSecond() * 7 * $week; + } + + private static function startTimeToEndTime() + { + + } +}