418 lines
19 KiB
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();
|
|
}
|
|
|
|
|
|
|
|
} |