test
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

304 lines
15 KiB

<?php
defined('IN_IA') or exit('Access Denied');
class WlsignModuleUniapp extends Uniapp {
/**
* Comment: 签到信息初始化
* Author: zzw
* Date: 2019/8/15 14:55
*/
public function getSignInfo(){
global $_W,$_GPC;
$settings = $_W['wlsetting']['wlsign'];
$jifentext = $_W['wlsetting']['trade']['credittext']? $_W['wlsetting']['trade']['credittext'] : '积分';
if($settings['signstatus'] == 0 || empty($settings['signstatus'])) {
$this->renderError('签到系统已关闭!',['url'=>h5_url('pages/mainPages/index/index')]);
}
#1、获取基本设置信息
//幻灯片列表
$data['adv_list'] = $settings['adv'];
if(is_array($data['adv_list'])){
foreach ($data['adv_list'] as $key => &$val) {
$val = [
'link' => $val['data_url'],
'thumb' => tomedia($val['data_img'])
];
}
}
//是否开启自动签到
$data['is_auto'] = $settings['autosign'];//1=开启自动签到;0=关闭自动签到
//连续签到奖励列表
if(is_array($settings['totalreward']) && count($settings['totalreward']) > 0){
$timesTotal = array_column($settings['totalreward'] , 'total');//连续签到天数
$timesTotalKeys = array_flip($timesTotal);//连续签到天数数组 键&值互换后的数组
$timesReward = array_column($settings['totalreward'] , 'reward');//连续签到奖励
}
//获取特殊奖励列表
if(is_array($settings['specialreward']) && count($settings['specialreward']) > 0){
foreach ($settings['specialreward'] as $reK => $reV){
$specialReward[$reK]['date'] = date("Ymd" , $reV['signtime']);
$specialReward[$reK]['reward'] = $reV['special'];
$specialReward[$reK]['title'] = $reV['signtitle'];
}
$specialDate = array_column($specialReward , 'date');//特殊奖励日期
$specialDateKeys = array_flip($specialDate);//特殊奖励日期数组 键&值互换后的数组
}
#2、获取用户签到信息
$data['member'] = Wlsign::querySignmember('id,mid,nickname,avatar,times');
$data['member']['avatar'] = tomedia($data['member']['avatar']);
$data['member']['totaltimes'] = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename(PDO_NAME."signrecord")." WHERE mid = {$_W['mid']} AND uniacid = {$_W['uniacid']} ");
//判断用户昨天是否签到 正常签到连续签到记录有效 未签到连续签到归零
$Yesterday = Wlsign::queryRecord('*',date("Ymd",strtotime("-1 Day")));
$dayDate = date("Ymd");
$have = Wlsign::queryRecord('*',$dayDate);//判断今天是否签到
$day = date("j");
if(!($Yesterday || ($day == 1 && $settings['cycletype'] == 2)) && !$have) {
//前一天未签到 或者签到周期为自然月并且当前为1号
$data['member']['times'] = 0;//累计天数归零
}
#3、查看今天是否签到
$dates = date("Ymd");
$daySign = Wlsign::queryRecord('*',$dates);
$data['is_sign'] = $daySign ? 1 : 0 ;
#4、获取签到总数
$todayTime = date("Ymd");
$yesterdayTime = date("Ymd" , strtotime("-1 Day"));
$today = Wlsign::getTotal(" date = '{$todayTime}' ");//今日签到总数
$yesterday = Wlsign::getTotal(" date = '{$yesterdayTime}' ");//昨日签到总数
$data['today'] = ( $today ? $today : 0 ) + ( $settings['signnum'] ? $settings['signnum'] : 0 );//今日签到总人数 = 实际签到人数 + 虚拟签到人数
$data['yesterday'] = ( $yesterday ? $yesterday : 0 ) + ( $settings['signnum'] ? $settings['signnum'] : 0 );//昨日签到总人数 = 实际签到人数 + 虚拟签到人数
#5、获取本月签到记录
$stertTime = strtotime(date("Y-m",time())."-1 00:00:00");
$endTime = strtotime(date("Y-m-t",time())." 23:59:59");
$where = " WHERE uniacid = {$_W['uniacid']} AND mid = {$_W['mid']} AND createtime > {$stertTime} AND createtime < {$endTime}";
$signMonth = pdo_fetchall("SELECT FROM_UNIXTIME(createtime,'%d') as date_time FROM " . tablename(PDO_NAME."signrecord") .$where." ORDER BY createtime ASC");
$signList = array_column($signMonth,'date_time');
#6、获取活动规则
$data['detail'] = empty($settings['detail']) ? '<p>暂无规则!</p>' : htmlspecialchars_decode($settings['detail']);
#7、处理签到信息
$t = date("t");
$d = date("d");
$signInfo = [];
//获取用户签到信息 判断获取用户连续签到天数
$member = Wlsign::querySignmember('times');
$times = $member['times'] ? : 0;
$Yesterday = Wlsign::queryRecord('*',date("Ymd",strtotime("-1 Day")));
if(!$Yesterday) $times = 0;//累计天数归零
for($i=1;$i<=$t;$i++){
//当天信息初始化
$signInfo[$i] = [
'date' => $i,
'is_sign' => 0 ,//是否签到:0=未签到(已过期【灰色背景】),1=已签到【黄色背景】;2=未签到(未过期【白色背景】)
'times' => '' ,//连续签到信息
'reward' => '' ,//特殊奖励信息
];
//判断当天是否签到
if (in_array($i,$signList)) $signInfo[$i]['is_sign'] = 1;
//判断是否过期
if($i > $d) $signInfo[$i]['is_sign'] = 2;
//判断额外奖励信息
if($i >= $d){
//连续签到奖励信息
if(is_array($timesTotal) && count($timesTotal) > 0){
$times++;
//判断今天是否签到,判断当天是否存在连续签到奖励
if($data['is_sign'] && $Yesterday){
//今天已经签到
$newTimes = $times - 1;
if(in_array($newTimes,$timesTotal) && $i != $d) {
$signInfo[$i]['times'] = '连续签到'.$newTimes.'天'.','.$jifentext.'奖励'.$timesReward[$timesTotalKeys[$newTimes]];
}
}else{
//今天未签到
if(in_array($times,$timesTotal)) {
$signInfo[$i]['times'] = '连续签到'.$times.'天'.','.$jifentext.'奖励'.$timesReward[$timesTotalKeys[$times]];
}
}
}
//判断特殊奖励信息
if(is_array($specialDate) && count($specialDate) > 0){
$day = date("Ymd",strtotime(date("Y-m-".$i)));
if(in_array($day,$specialDate)){
$dayKey = $specialDateKeys[$day];
$signInfo[$i]['reward'] = $specialReward[$dayKey]['title'].',额外奖励'.$specialReward[$dayKey]['reward'];
}
}
}
}
#8、签到信息补丁 在签到信息数组中添加前置空位
//获取当月一号的星期时间
$w = date("w",$stertTime);
$null = [];
if($w > 0){
for($i=0;$i<$w;$i++){
$null[$i] = [
'date' => '',
'is_sign' => 3 ,//是否签到:0=未签到(已过期【灰色背景】),1=已签到【黄色背景】;2=未签到(未过期【白色背景】);3=空位
'times' => '' ,//连续签到信息
'reward' => '' ,//特殊奖励信息
];
}
}
$signInfo = array_merge($null,$signInfo);
$data['sign_info'] = $signInfo;
$this->renderSuccess('签到信息初始化',$data);
}
/**
* Comment: 进行签到
* Author: zzw
* Date: 2019/8/16 9:28
*/
public function signIn(){
global $_W,$_GPC;
#1、基本参数信息获取
$jifentext = $_W['wlsetting']['trade']['credittext']? $_W['wlsetting']['trade']['credittext'] : '积分';
$dayDate = date("Ymd");
$settings = $_W['wlsetting']['wlsign'];
#2、判断是否已经签到
$have = Wlsign::queryRecord('*',$dayDate);
if($have) $this->renderError("今天已经签到了哟");
#3、获取用户签到信息
$member = Wlsign::querySignmember('*');
//判断用户昨天是否签到 正常签到连续签到记录有效 未签到连续签到归零
$Yesterday = Wlsign::queryRecord('*',date("Ymd",strtotime("-1 Day")));
$day = date("j");
if(!$Yesterday || ($day == 1 && $settings['cycletype'] == 2)) {
//前一天未签到 或者签到周期为自然月并且当前为1号
$member['times'] = 0;
}//累计天数归零
$member['times']++;//累计天数加一
#4、判断是否为首次签到 不是首次签到判断是否存在连续签到奖励 不存在则是日常签到奖励
$is_first = pdo_getcolumn(PDO_NAME."signrecord",['uniacid'=>$_W['uniacid'],'mid'=>$_W['mid']],'id');
if(!$is_first){
//当前签到是首次签到
$integral = $settings['first'];
$title = '首次签到奖励';
}else{
//当前签到不是首次签到 判断是否存在连续签到奖励 不存在则是日常签到奖励
$keyList = array_column($settings['totalreward'],'total');//键值
$rewardList = array_combine($keyList,$settings['totalreward']);
$continuity = $rewardList[$member['times']];
if(is_array($continuity)){
//连续签到奖励
$integral = $continuity['reward'];
$title = $continuity['total'].'次连续签到奖励';
}else{
//日常奖励
$integral = $settings['daily'];
$title = '日常奖励';
}
}
#5、判断是否存在特殊奖励
$festivalReward = $settings['specialreward'];
if(is_array($festivalReward) && count($festivalReward) > 0){
$timeList = array_column($festivalReward,'signtime');
$todayTime = strtotime(date("Y-m-d")." 00:00:00");
$festivalList = array_combine($timeList,$festivalReward);
$festivalRewardInfo = $festivalList[$todayTime];//特殊奖励信息
if($festivalRewardInfo){
$integral += $festivalRewardInfo['special'];
$title .= '+'.$festivalRewardInfo['signtitle'].'奖励';
}
}
MysqlFunction::setTrans(4);
MysqlFunction::startTrans();
#6、添加签到记录数据
$data = [
'uniacid' => $_W['uniacid'] ,
'mid' => $_W['mid'] ,
'date' => $dayDate ,
'createtime' => time() ,
'reward' => $integral ,
'sign_class' => $title
];
$res = pdo_insert(PDO_NAME.'signrecord',$data);
if(!$res){
MysqlFunction::rollback();
$this->renderError('签到失败,请刷新重试!');
}
#6、修改用户签到统计信息记录表
$updateData['times'] = $member['times'] ? : 0;//累计(连续)签到天数
$updateData['integral'] = ($member['integral'] + $integral) ? : 0;//积分总数
$updateData['totaltimes'] = ($member['totaltimes'] + 1) ? : 0;//总共签到天数
$where['uniacid'] = $_W['uniacid'];
$res = Wlsign::updateSignmember($updateData,$where);
if(!$res){
MysqlFunction::rollback();
$this->renderError('签到失败,请刷新重试!');
}
MysqlFunction::commit();
#6、更新积分信息
Member::credit_update_credit1($_W['mid'],$integral,'签到:'.$title);
#7、积分签到模板消息通知
$url = h5_url('pages/subPages/signdesk/record/record');
$modelData = [
'first' => '签到通知' ,
'user_name' => $member['nickname'] ,//用户名
'total' => $updateData['totaltimes'] ,//累计签到次数
'remark' => '签到成功,获得'.$jifentext.':'.$integral,
'sign_time' => date("Y-m-d H:i:s",$data['createtime']),
];
TempModel::sendInit('sign',$_W['mid'],$modelData,$_W['source'],$url);
#8、获取返回的数据信息 第多少签到 获取的积分
$dayNum = Wlsign::getTotal(" date = '{$dayDate}' ");//今日签到总数
$returnData['orders'] = ($dayNum?$dayNum:0) + ($_W['wlsetting']['wlsign']['signnum']?$_W['wlsetting']['wlsign']['signnum']:0);
$returnData['integral'] = $integral;
$this->renderSuccess('签到成功',$returnData);
}
/**
* Comment: 获取签到排行榜信息
* Author: zzw
* Date: 2019/8/16 11:37
*/
public function rankingList(){
global $_W,$_GPC;
#1、参数获取
$type = $_GPC['type'] ? $_GPC['type'] : 1;//排行方式:1=连续签到排行(最执着);2=总签到排行(签到狂);3=签到积分排行(最富有)
#2、获取信息列表
switch ($type){
case 1:$data = Wlsign::getRankingList('times');break;//连续签到排行
case 2:$data = Wlsign::getRankingList('totaltimes');break;//总签到排行
case 3:$data = Wlsign::getRankingList('integral');break;//签到积分排行
default:
$this->renderError("错误的排行方式");
break;
}
#3、获取设置信息
$data['set'] = [
'integral' => $_W['wlsetting']['trade']['credittext'],
];
$this->renderSuccess('签到排行信息',$data);
}
/**
* Comment: 获取签到记录
* Author: zzw
* Date: 2019/8/26 10:34
*/
public function recordList(){
global $_W,$_GPC;
#1、参数获取
$page = $_GPC['page'] ? : 1;
$pageIndex = $_GPC['page_index'] ? : 10;
$pageStart = $page * $pageIndex - $pageIndex;
$table = tablename(PDO_NAME."signrecord");
$where = " WHERE mid = {$_W['mid']} AND uniacid = {$_W['uniacid']} ";
#2、获取统计信息
$data['info'] = pdo_fetch("SELECT COUNT(*) as total,SUM(reward) as integral FROM ".$table.$where);
$data['total'] = ceil($data['info']['total'] / $pageIndex);
#3、获取记录列表
$data['list'] = pdo_fetchall("SELECT FROM_UNIXTIME(createtime,'%Y-%m-%d %H:%i:%S') as createtime,reward,sign_class FROM "
.$table.$where." ORDER BY createtime DESC LIMIT {$pageStart},{$pageIndex} ");
$this->renderSuccess('签到记录',$data);
}
}