webman_duanju/app/api/model/TaskCenterRecord.php

418 lines
19 KiB
PHP

<?php
namespace app\api\model;
use app\admin\model\User;
use app\common\library\DatabaseRoute;
use app\common\model\Common;
use ba\Random;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Log;
use think\Model;
class TaskCenterRecord extends Model
{
public static function selectTaskCenter($user_id, $target_user_id)
{
// 查找任务
$db = Db::connect(config('think-orm.search_library'));
$rask_arr = $db->name('task_center')->where(['shows' => 1])->order('type', 'asc')->order('sort', 'asc')->select()->toArray();
$data = [];
$day_date = date('Y-m-d 00:00:00');
foreach ($rask_arr as $k => $task) {
$task_reward_arr = $db->name('task_center_reward')->field('type,number')->where(['task_id' => $task['id']])->select()->toArray();
$todaySign = true;
$signCount = null;
// 默认值
$rask_arr[$k]['disabled'] = true;
$rask_arr[$k]['discNumber'] = 0;
if(empty($task_reward_arr)) {
continue;
}
$number = 0;
$task_reward = [];
foreach ($task_reward_arr as $tk => $tv) {
$number += $tv['number'];
$t_type = $tv['type'];
}
$task_reward[$t_type] = $number;
switch ($task['type']) {
//签到任务
case 2:
if($task['number'] == 1) {
$order_db = DatabaseRoute::getDb('orders', $user_id);
$dayOrderNum = $order_db->where(['status' => 1, 'pay_way' => 9])->where('create_time', '>', $day_date)->count();
if($dayOrderNum < 3) {
$rask_arr[$k]['discNumber'] = $dayOrderNum;
$rask_arr[$k]['number'] = 3;
$todaySign = false;
}elseif (UserSignRecord::getTaskCenterRecordCount($user_id, $task['id'], $day_date) > 0) {
$rask_arr[$k]['buttonTitle'] = '已领取';
$rask_arr[$k]['number'] = null;
}else {
$rask_arr[$k]['discNumber'] = 0;
$rask_arr[$k]['number'] = null;
$rask_arr[$k]['jumpType'] = 0;
}
}else {
// 周任务
if($task['number'] > 1 && $task['number'] < 8) {
if(!empty($task_reward[9])) {
$disc_spi_count = DatabaseRoute::getDb('disc_spinning_record', $user_id)->where(['source' => 'taskW'])->count();
if($disc_spi_count > 0) {
continue 2;
}
$isBreak = false;
// 抽奖次数
$taskWCount = UserSignRecord::getTaskWCount($user_id, $task_reward[9]);
if($taskWCount) {
foreach ($taskWCount as $taskWCount_K => $taskWCount_v) {
if($taskWCount_v > 0) {
$isBreak = true;
break;
}
}
if($isBreak) {
$rask_arr[$k]['discNumber'] = null;
$rask_arr[$k]['number'] = null;
break;
}
}
}
$wSignCount = UserSignRecord::getWSignCount($user_id);
$wSignCount_s = $todaySign ? 1 : 0;
if(!$wSignCount || ($wSignCount + $wSignCount_s) < $rask_arr[$k]['number']) {
$rask_arr[$k]['discNumber'] = !$wSignCount?0:$wSignCount;
$rask_arr[$k]['disabled'] = false;
}else {
continue 2;
}
}elseif ($task['number'] > 7 && $task['number'] < 32) {
if(!$signCount) {
$signCount = UserSignRecord::getUserSignCount($user_id);
}
if($signCount + ($todaySign ? 1 : 0) < $rask_arr[$k]['number']) {
$rask_arr[$k]['discNumber'] = $signCount;
$rask_arr[$k]['disabled'] = false;
}else {
if(!empty($task_reward[9])) {
$spinningCount = DatabaseRoute::getDb('disc_spinning_record', $user_id)->where(['source' => 'taskW', 'source_id' => $tv['id']])->count();
if ($spinningCount == null || $task_reward[9] - $spinningCount > 0) {
$rask_arr[$k]['discNumber'] = null;
$rask_arr[$k]['number'] = null;
break;
} else {
continue 2;
}
}else {
if(UserSignRecord::getTaskCenterRecordCount($user_id, $task['id'], $day_date) > 0) {
$rask_arr[$k]['buttonTitle'] = '已领取';
$rask_arr[$k]['disabled'] = false;
$rask_arr[$k]['number'] = null;
$rask_arr[$k]['discNumber'] = null;
}else {
$rask_arr[$k]['number'] = null;
$rask_arr[$k]['discNumber'] = null;
}
}
}
}
}
break;
// 一次性任务
case 3:
if($task['id'] == 1) {
// $inviteAchievement = Db::connect(DatabaseRoute::getConnection('invite_achievement', ['user_id' => $user_id]))->name('invite_achievement')
// ->where(['target_user_id' => $user_id])->find();
$inviteAchievement = DatabaseRoute::getDb('invite_achievement', $target_user_id)
->where('target_user_id', $user_id)
->find();
if($inviteAchievement && !empty($inviteAchievement['tasks'])) {
$splitTasks = explode(',', $inviteAchievement['tasks']);
$isOver = false;
foreach ($splitTasks as $tasks) {
$isEqual = trim($tasks) === '1';
if($isEqual) {
$isOver = true;
break;
}
}
if($isOver) {
unset($rask_arr[$k]);
continue 2;
}
}
$userinfo = DatabaseRoute::getDb('user_info', $user_id)->find();
if($userinfo && !empty($userinfo['cert_name']) && !empty($userinfo['cert_no'])) {
$users = UserInfo::getUsersByNameAndCertNo($userinfo['cert_name'], $userinfo['cert_no']);
if(UserSignRecord::getTaskCenterRecordCountUserIdAll($users, $task['id']) > 0) {
if($inviteAchievement) {
// Db::connect(DatabaseRoute::getConnection('invite_achievement', ['user_id' => $user_id], true))->name('invite_achievement')
// ->where(['id' => $inviteAchievement['id']])
// ->update(['tasks' => empty($inviteAchievement['tasks']) ? '1' : $inviteAchievement['tasks'] . ',1']);
DatabaseRoute::getDb('invite_achievement', $user_id, true, true)
->where(['id' => $inviteAchievement['id']])
->update(['tasks' => empty($inviteAchievement['tasks']) ? '1' : $inviteAchievement['tasks'] . ',1']);
}
unset($rask_arr[$k]);
continue 2;
}
}
if(UserSignRecord::getTaskCenterRecordCount($user_id, $task['id'], null) > 0) {
unset($rask_arr[$k]);
continue 2;
}
$sumOrderNum = 0;
if($inviteAchievement) {
$sumOrderNum = $inviteAchievement['count'];
}
if($sumOrderNum != null && $sumOrderNum < $rask_arr[$k]['number']) {
$rask_arr[$k]['discNumber'] = $sumOrderNum;
}else {
$rask_arr[$k]['discNumber'] = null;
$rask_arr[$k]['number'] = null;
$rask_arr[$k]['jumpType'] = 0;
}
}
break;
}
}
return returnSuccessData(convertToCamelCase($rask_arr));
}
public static function addBlackUser(int $userId, string $behavior)
{
Log::info("异常用户id, 异常操作: {$userId},{$behavior}");
$db = Db::connect(DatabaseRoute::getConnection('tb_user', ['user_id' => $userId], true));
$userInfo = $db->name('user_info')->where('user_id', $userId)->find();
if (!empty($userInfo) && !empty($userInfo['cert_no'])) {
Db::name('tb_user_blacklist')->insert([
'real_name' => $userInfo['cert_name'],
'id_card_no' => $userInfo['cert_no']
]);
}
$db->name('tb_user')->where('user_id', $userId)
->update([
'status' => 0,
'platform' => $behavior,
'update_time' => date('Y-m-d H:i:s')
]);
}
// 任务领取
public static function taskReceive($userId, $id, $target_id)
{
$user_id_slave_db = Db::connect(DatabaseRoute::getConnection('tb_user', ['user_id' => $userId]));
$user_id_master_db = Db::connect(DatabaseRoute::getConnection('tb_user', ['user_id' => $userId], true));
// 查询任务中心记录
$taskCenter = Db::name('task_center')->find($id);
if (empty($taskCenter) || $taskCenter['shows'] != 1) {
return ['code' => -1, 'msg' => '领取失败'];
}
// 查询邀请成就记录
$inviteAchievement = DatabaseRoute::getDb('invite_achievement', $target_id)
->where('target_user_id', $userId)
->find();
// 处理类型为2的任务
if ($taskCenter['type'] == 2) {
// 统计今日订单数量
$todayStart = date('Y-m-d') . ' 00:00:00';
$dayOrderNum = $user_id_slave_db->name('orders')
->where('user_id', $userId)
->where('create_time', '>=', $todayStart)
->count();
if ($taskCenter['number'] == 1) {
// 查询昨日签到记录
$yesterday = date('Y-m-d', strtotime('-1 day'));
$yesterdaySign = $user_id_slave_db->name('user_sign_record')
->where('user_id', $userId)
->where('sign_day', $yesterday)
->find();
// 构建今日签到记录
$signRecord = [
'user_id' => $userId,
'sign_day' => date('Y-m-d'),
'create_time' => date('Y-m-d H:i:s'),
'day' => 1 // 默认连续1天
];
// 计算连续签到天数
if (!empty($yesterdaySign) && $yesterdaySign['day'] != 7) {
$signRecord['day'] = $yesterdaySign['day'] + 1;
}
// 检查领取条件
if ($dayOrderNum < 3) {
return ['code' => -1, 'msg' => '领取失败,未达成领取条件'];
}
// 检查是否已领取
$recordCount = $user_id_slave_db->name('task_center_record')
->where('user_id', $userId)
->where('task_id', $taskCenter['id'])
->where('create_time', '>=', $todayStart)
->count();
if ($recordCount > 0) {
return ['code' => -1, 'msg' => '不可重复领取'];
}
// 保存签到记录
$user_id_master_db->name('user_sign_record')->insert($signRecord);
} else {
return ['code' => -1, 'msg' => '异常领取,已记录'];
}
}
// 处理类型为3且id=1的任务
elseif ($taskCenter['type'] == 3 && $taskCenter['id'] == 1) {
$sumOrderNum = 0;
// 检查是否已领取过该任务
if (!empty($inviteAchievement) && !empty($inviteAchievement['tasks'])) {
$tasks = explode(',', $inviteAchievement['tasks']);
if (in_array('1', array_map('trim', $tasks))) {
return ['code' => -1, 'msg' => '不可重复领取'];
}
}
// 获取订单总数
if (!empty($inviteAchievement)) {
$sumOrderNum = $inviteAchievement['count'];
}
// 检查订单数量是否达标
if ($sumOrderNum !== null && $sumOrderNum < $taskCenter['number']) {
return ['code' => -1, 'msg' => '领取失败,未达成领取条件'];
} else {
// 检查用户实名信息
$userInfo = $user_id_slave_db->name('user_info')
->where('user_id', $userId)
->find();
if (empty($userInfo) || empty($userInfo['cert_no']) || empty($userInfo['cert_name'])) {
return ['code' => -1, 'msg' => '请实名后领取'];
}
// 检查同一实名是否已领取
$users = $user_id_slave_db->name('user_info')
->where('cert_name', $userInfo['cert_name'])
->where('cert_no', $userInfo['cert_no'])
->select()
->toArray();
$courseIds = array_column($users, 'user_id');
$recordCount = $user_id_slave_db->name('task_center_record')
->whereIn('user_id', $courseIds)
->where('task_id', $taskCenter['id'])
->count();
if ($recordCount > 0) {
return ['code' => -1, 'msg' => '同一实名算一个新用户,不可重复领取'];
}
}
} else {
return ['code' => -1, 'msg' => '异常领取,已记录'];
}
// 处理奖励发放
$records = [];
$targetId = null;
// 查询任务奖励列表
$rewards = Db::name('task_center_reward')
->where('task_id', $id)
->select()
->toArray();
foreach ($rewards as $reward) {
switch ($reward['type']) {
// 金币奖励
case 1:
$moneyDetail = [
'user_id' => $userId,
'title' => '[任务中心]',
'classify' => 7,
'type' => 1,
'state' => 2,
'money' => $reward['number'],
'content' => $taskCenter['title'] . "任务完成,金币奖励" . $reward['number'],
'money_type' => 2,
'source_id' => $reward['task_id'],
'create_time' => date('Y-m-d H:i:s')
];
// 更新用户金币
UserMoney::updateMoney($userId, $reward['number']);
// 保存金币明细
$targetId = $user_id_master_db->name('user_money_details')->insertGetId($moneyDetail);
break;
// 现金奖励
case 2:
$cashDetail = [
'user_id' => $userId,
'title' => '[任务中心]',
'classify' => 7,
'type' => 1,
'state' => 2,
'money' => $reward['number'],
'content' => $taskCenter['title'] . "任务完成,现金奖励" . $reward['number'],
'money_type' => 1,
'source_id' => $reward['task_id'],
'create_time' => date('Y-m-d H:i:s')
];
// 更新用户现金
UserMoney::updateAmount($userId, $reward['number']);
// 保存现金明细
$targetId = $user_id_master_db->name('user_money_details')->insertGetId($cashDetail);
break;
}
// 构建任务记录
$records[] = [
'user_id' => $userId,
'task_id' => $id,
'type' => $reward['type'],
'number' => $reward['number'],
'name' => $taskCenter['title'],
'target_id' => $targetId,
'create_time' => date('Y-m-d H:i:s'),
'update_time' => date('Y-m-d H:i:s')
];
}
// 批量保存任务记录
if (!empty($records)) {
$user_id_master_db->name('task_center_record')->insertAll($records);
}
// 更新邀请成就任务记录
if (!empty($inviteAchievement) && $id == 1) {
$tasks = $inviteAchievement['tasks'] ?? '';
$newTasks = empty($tasks) ? '1' : $tasks . ',1';
$user_id_master_db->name('invite_achievement')
->where('user_id', $inviteAchievement['user_id'])
->where('id', $inviteAchievement['id'])
->update(['tasks' => $newTasks]);
}
return returnSuccessData();
}
}