where(['day' => 7])->where('create_time', '>', $day)->order('create_time', 'acs') ->field('id') ->select() ->toArray(); $taskWCount = Db::connect(DatabaseRoute::getConnection('user_sign_record', ['user_id' => $user_id])); $taskWCount = $taskWCount ->name('user_sign_record') ->alias('sign') ->field([ 'sign.id as id', "{$wCount} - COUNT(CASE WHEN spRecord.source_id IS NOT NULL THEN 1 END) AS `day`" ]) ->leftJoin('disc_spinning_record spRecord', 'sign.id = spRecord.source_id') ->where('sign.day', 7) ->where('sign.user_id', $user_id) ->where('sign.create_time', '>', $day) ->whereIn('sign.id', $noRecordTasks) ->group('sign.id') ->order('sign.create_time', 'asc') ->select(); if($taskWCount) { $days = 0; $task_reward = []; foreach ($taskWCount as $tk => $tv) { $task_reward[][$tv['id']] = $days += $tv['day']; } return $task_reward; } return null; } public static function getWSignCount($user_id) { $user_sign_record_db = DatabaseRoute::getDb('user_sign_record', $user_id); $noRecordTasks = $user_sign_record_db->where('create_time', '>', date('Y-m-d 00:00:00', strtotime('-1 day')))->order('create_time', 'desc') ->field('day') ->find(); return $noRecordTasks?$noRecordTasks['day']:null; } public static function getUserSignCount($user_id) { $user_sign_record_db = DatabaseRoute::getDb('user_sign_record', $user_id); $noRecordTasks = $user_sign_record_db->where('sign_day', '>', date('Y-m') . '-00')->order('create_time', 'asc') ->count(); return $noRecordTasks; } public static function getTaskCenterRecordCount($user_id, $task_id, $day_date) { $data = DatabaseRoute::getDb('task_center_record', $user_id)->where(['task_id' => $task_id]); if($day_date) { $data = $data->where('create_time', '>', $day_date); } return $data->count(); } public static function getTaskCenterRecordCountUserIdAll($user_id_s, $task_id):string|int { $count = 0; foreach ($user_id_s as $k => $user_id) { $count += DatabaseRoute::getDb('task_center_record', $user_id)->where(['task_id' => $task_id])->count(); } return $count; } public static function getUserSignData($user_id, $user) { $dto = [ 'userId' => $user_id, 'username' => $user['user_name'], 'mobile' => $user['phone'], 'signDays' => 0, 'enable' => 1, 'isReceived' => 0, ]; $config = CommonInfo::where(['type' => 918])->find()->value; if(!$config) { return returnErrorData('签到活动配置不存在'); } // 活动天数 $parts = explode(',', $config); $activeDays = isset($parts[0]) ? (int)$parts[0] : 0; // 当前日期 $beginDay = date('Y-m-d'); // 签到记录 $recordList = []; // 连续签到日期 $flowDays = buildFlowDays($beginDay, $activeDays); $list = DatabaseRoute::getDb('user_sign_record', $user_id)->order('sign_day', 'asc')->order('create_time', 'asc')->order('id', 'asc')->select()->toArray(); // 第x天 $index = 1; // 连续签到天数 $signDays = 0; if(!$list) { foreach ($flowDays as $k => $day) { $recordList[] = [ 'showText' => '第' . $index . '天', 'status' => 0, 'signDay' => $day, 'signDate' => '', ]; $index ++; } $dto['recordList'] = $recordList; return returnSuccessData($dto); } $beginSignDay = $list[0]['sign_day']; $enDay = date('Y-m-d', strtotime('+' . $activeDays - 1 . 'days', strtotime(date('Y-m-d')))); $flowDays = buildFlowDaysTwo($beginSignDay, $enDay); // 需要移除的记录 $removeList = []; $signMap = []; foreach ($list as $record) { $signMap[$record['sign_day']] = $record['create_time']; } foreach ($flowDays as $k => $day) { $date = !empty($signMap[$day])?$signMap[$day]:''; if($date) { $recordList[$k] = [ 'signDay' => $day, 'status' => 1, 'signDate' => $date, 'showText' => '已签到', ]; $signDays ++; }else { $recordList[$k] = [ 'signDay' => $day, 'status' => 0, 'signDate' => '', ]; $daysBetween = daysBetween($day); if($daysBetween > 0) { $signDays = 0; $recordList[$k]['showText'] = '未签到'; }elseif($daysBetween == 0) { $recordList[$k]['showText'] = '待签到'; }else { $recordList[$k]['showText'] = '第' . $k + 1 .'天'; } } if($signDays == $activeDays) { break; } // 1. 检查记录日期是否等于结束日期 if ($day === $enDay) { // 2. 反转记录列表 $tempList = array_reverse($recordList); // 3. 计算今天且状态为"1"的记录数 $today = date('Y-m-d'); $isInclude = 0; foreach ($tempList as $item) { if ($item['signDay'] === $today && $item['status'] == 1) { $isInclude++; } } // 4. 确定要移除的记录数量 $removeSize = $signDays; if ($isInclude > 0) { $removeSize = $signDays - 1; } // 5. 添加要移除的记录到 removeList for ($i = 0; $i < $removeSize; $i++) { if (isset($tempList[$i])) { // 确保索引存在 $removeList[] = $tempList[$i]; } } break; } } // 1. 移除元素 $recordList = array_udiff($recordList, $removeList, function($a, $b) { return ($a === $b) ? 0 : 1; }); // 2. 第一次反转 $recordList = array_reverse($recordList); // 3. 截取前 activeDays 条记录 $recordList = array_slice($recordList, 0, $activeDays, true); // 4. 第二次反转 $recordList = array_reverse($recordList); $index = 1; foreach ($recordList as $k => $v) { $recordList[$k]['showText'] = sprintf($v['showText'], '第' . $index . '天'); $index ++; } $dto['recordList'] = $recordList; $dto['signDays'] = $signDays; if($signDays >= $activeDays) { $dto['enable'] = 0; } $count = DatabaseRoute::getDb('user_money_details', $user_id)->where('type', 1) ->where('classify', 7) ->where('money_type', 1) ->where('title', 'like', '[连续签到%') ->where('title', 'like', '%天]') ->count(); $dto['isReceived'] = $count > 0 ? 1 : 0; return returnSuccessData($dto); } }