SignTaskController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Models\User\WxUserCoinRecord;
  4. use App\Models\WxTask;
  5. use App\Models\User\WxUserSignRecord;
  6. use App\Models\User\WxUserTask;
  7. use App\Wen\Utils\FieldUtils;
  8. use App\Wen\Utils\Settings;
  9. use App\Wen\Utils\UserUtils;
  10. use App\Wen\Utils\Utils;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\DB;
  13. class SignTaskController extends BaseController{
  14. private function sign_data($uid){
  15. $result_ = [
  16. ];
  17. $cur_time = current_time();
  18. $w = date('w', strtotime($cur_time));
  19. if($w == 0){
  20. $w = 6;
  21. }else{
  22. $w -= 1;
  23. }
  24. $days = Utils::getWeekDays(strtotime($cur_time));
  25. $sign_data = [];
  26. $app_user_sign = Settings::get('app_user_sign', []);
  27. $today_is_sign = UserUtils::is_signed($uid, $cur_time);
  28. for($i = 0; $i < 7; $i ++){
  29. $reward = [];
  30. if(isset($app_user_sign[$i])){
  31. $reward = $app_user_sign[$i];
  32. }
  33. $is_signed = UserUtils::is_signed($uid, $days[$i]);
  34. $day = $is_signed ? '已签' : ('第'.($i + 1).'天');
  35. // 0:过期未签 1:已签到 2:可签到 3: 未达到时间
  36. $state = 0;
  37. if($is_signed){
  38. $state = 1;
  39. }else{
  40. if($w == $i){
  41. $state = 2;
  42. $day = '可签';
  43. }else{
  44. if($days[$i] < $cur_time){
  45. $state = 0;
  46. $day = '漏签';
  47. }else{
  48. $state = 3;
  49. }
  50. }
  51. }
  52. $sign_data[] = [
  53. 'day' => $day,
  54. 'reward' => $reward,
  55. 'integral'=> _array_key($reward, 'num', 0),
  56. 'extra' => 0,
  57. 'state' => $state
  58. ];
  59. }
  60. $result_['list'] = $sign_data;
  61. $result_['today_signed'] = $today_is_sign ? 1 : 0;
  62. $coins_total_sign = WxUserCoinRecord::where([
  63. ['user_id', '=', $uid],
  64. ['type', '=', 7],
  65. ])->sum('incre');
  66. $result_['coins_total'] = $coins_total_sign;
  67. return $result_;
  68. }
  69. public function task_data($user_id){
  70. $task_ids = explode(',', Settings::get('app_sign_day_task', ''));
  71. $result = [];
  72. foreach ($task_ids as $task_id){
  73. $task = WxTask::find($task_id);
  74. if($task){
  75. $res1 = Utils::isTaskComplete($user_id, $task_id);
  76. if($res1['code'] == 1){
  77. $task->status = 1;
  78. }else{
  79. $res2 = Utils::isTaskComplete($user_id, $task_id, true);
  80. if($res2['code'] == 1){
  81. $task->status = 2;
  82. $task->condition_tip = $res2['current'].'/'.$res2['condition'];
  83. }else{
  84. $task->status = 0;
  85. $task->condition_tip = $res2['current'].'/'.$res2['condition'];
  86. }
  87. }
  88. $task->reward_tip = FieldUtils::getGiftTypes()[(int)$task->reward_type] . '*' . $task->reward_num;
  89. $result[] = $task;
  90. }
  91. }
  92. return $result;
  93. }
  94. public function user_sign_continuous_days($uid){
  95. if(_empty_($uid)){
  96. return 0;
  97. }
  98. $records = DB::table('wx_user_sign_record')
  99. ->where('user_id', $uid)
  100. ->orderByDesc('created_at')
  101. ->get();
  102. $continuous_days = 0;
  103. $previous_date = null;
  104. foreach ($records as $record) {
  105. $current_date = $record->created_at;
  106. // 检查日期是否连续
  107. if ($previous_date !== null && $this->isNextDay($current_date, $previous_date)) {
  108. $continuous_days++;
  109. } elseif ($previous_date === null) {
  110. $continuous_days++;
  111. } else {
  112. break; // 遇到不连续的日期,结束循环
  113. }
  114. $previous_date = $current_date;
  115. }
  116. return $continuous_days;
  117. }
  118. private function isNextDay($current_date, $previous_date)
  119. {
  120. $current_timestamp = strtotime(explode(' ', $current_date)[0]);
  121. $previous_timestamp = strtotime(explode(' ', $previous_date)[0]);
  122. return _abs($current_timestamp - $previous_timestamp) === 86400;
  123. }
  124. public function user_data($uid){
  125. $result = [];
  126. $experience = get_user_meta($uid, 'experience', 'n');
  127. if(_empty_($experience)){
  128. $experience = 1;
  129. }
  130. $result['experience'] = $experience;
  131. $result['signedDays'] = WxUserSignRecord::where('user_id', $uid)->count();
  132. $result['taskTotal'] = WxUserTask::where('user_id', $uid)->count();;
  133. $result['coins'] = UserUtils::user_coins($uid);
  134. $result['lv'] = UserUtils::lv($uid);
  135. if(_empty_($result['signedDays'])){
  136. $result['signedDays'] = 0;
  137. }
  138. if(_empty_($result['taskTotal'])){
  139. $result['taskTotal'] = 0;
  140. }
  141. if($result['lv'] == 1){
  142. $result['nextLvExp'] = 60;
  143. }else if($result['lv'] == 2){
  144. $result['nextLvExp'] = 800;
  145. }else if($result['lv'] == 3){
  146. $result['nextLvExp'] = 3500;
  147. }else if($result['lv'] == 4){
  148. $result['nextLvExp'] = 10800;
  149. }else if($result['lv'] == 5){
  150. $result['nextLvExp'] = 38800;
  151. }else if($result['lv'] == 6){
  152. $result['nextLvExp'] = 999999999;
  153. }
  154. $result['nextLv'] = $result['lv'] >= 6 ? '6+' : $result['lv'] + 1;
  155. $result['nextLvExpNeed'] = $result['nextLvExp'] - $result['experience'];
  156. $result['rate'] = (int)( $experience / $result['nextLvExp'] * 100 );
  157. // 连续签到天数
  158. $result['continuous_days'] = $this->user_sign_continuous_days($uid);
  159. return $result;
  160. }
  161. /** 获取签到任务页面的数据
  162. * @param Request $request
  163. * @return \Illuminate\Http\JsonResponse
  164. */
  165. public function sign_task_data(Request $request){
  166. $uid = $request->uid;
  167. $result = [];
  168. try {
  169. $result['sign'] = $this->sign_data($uid);
  170. $result['task'] = $this->task_data($uid);
  171. $result['user'] = $this->user_data($uid);
  172. }catch (\Exception $e){
  173. }
  174. return $this->success($result);
  175. }
  176. /** 获取任务大厅
  177. * @param Request $request
  178. * @return \Illuminate\Http\JsonResponse
  179. */
  180. public function task_hall(Request $request){
  181. $user_id = $request->uid;
  182. $type = $request->type;
  183. if(_empty_($type, true)){
  184. return $this->fail(200001);
  185. }
  186. if($type == 0){
  187. // 每日任务
  188. $daytasks = WxTask::where('type', 0)->orderBy('created_at', 'desc')->simplePaginate(10);
  189. if($daytasks){
  190. $daytasks->map(function ($v, $k) use ($user_id){
  191. $res1 = Utils::isTaskComplete($user_id, $v->id);
  192. if($res1['code'] == 1){
  193. $v->status = 1;
  194. }else{
  195. $res2 = Utils::isTaskComplete($user_id, $v->id, true);
  196. if($res2['code'] == 1){
  197. $v->status = 2;
  198. $v->condition_tip = $res2['current'].'/'.$res2['condition'];
  199. }else{
  200. $v->status = 0;
  201. $v->condition_tip = $res2['current'].'/'.$res2['condition'];
  202. }
  203. }
  204. $v->reward_tip = FieldUtils::getGiftTypes()[(int)$v->reward_type] . '*' . $v->reward_num;
  205. return $v;
  206. });
  207. }
  208. return $this->success($daytasks);
  209. }else{
  210. // 成长任务
  211. $oncetasks = WxTask::where('type', 1)->orderBy('created_at', 'desc')->simplePaginate(1000);
  212. $res_tasks = [];
  213. if($oncetasks){
  214. $map = [];
  215. $cache = [];
  216. foreach (FieldUtils::getOnceTaskTypes() as $k => $v){
  217. $map[$k] = [
  218. 'status_2' => [],
  219. 'status_1' => [],
  220. 'status_0' => [],
  221. ];
  222. $cache[$k] = [
  223. 'status_0' => null,
  224. ];
  225. }
  226. $oncetasks->map(function ($v, $k) use ($user_id, &$map){
  227. $res1 = Utils::isTaskComplete($user_id, $v->id);
  228. if($res1['code'] == 1){
  229. $v->status = 1;
  230. }else{
  231. $res2 = Utils::isTaskComplete($user_id, $v->id, true);
  232. if($res2['code'] == 1){
  233. $v->status = 2;
  234. $v->condition_tip = $res2['current'].'/'.$res2['condition'];
  235. }else{
  236. $v->status = 0;
  237. $v->condition_tip = $res2['current'].'/'.$res2['condition'];
  238. }
  239. }
  240. $v->reward_tip = FieldUtils::getGiftTypes()[(int)$v->reward_type] . '*' . $v->reward_num;
  241. $map[$v->condition_type_1]['status_'.$v->status][] = $v;
  242. return $v;
  243. });
  244. foreach (FieldUtils::getOnceTaskTypes() as $k => $v){
  245. if($map[$k]['status_2']){
  246. foreach ($map[$k]['status_2'] as $item){
  247. $res_tasks[] = $item;
  248. }
  249. }
  250. }
  251. foreach (FieldUtils::getOnceTaskTypes() as $k => $v){
  252. if($map[$k]['status_0']){
  253. foreach ($map[$k]['status_0'] as $item){
  254. if($cache[$k]['status_0']){
  255. if($cache[$k]['status_0']->condition_num > $item->condition_num){
  256. $cache[$k]['status_0'] = $item;
  257. }
  258. }else{
  259. $cache[$k]['status_0'] = $item;
  260. }
  261. }
  262. }
  263. }
  264. foreach (FieldUtils::getOnceTaskTypes() as $k => $v){
  265. if($cache[$k]['status_0']){
  266. $res_tasks[] = $cache[$k]['status_0'];
  267. }
  268. }
  269. foreach (FieldUtils::getOnceTaskTypes() as $k => $v){
  270. if($map[$k]['status_1']){
  271. foreach ($map[$k]['status_1'] as $item){
  272. $res_tasks[] = $item;
  273. }
  274. }
  275. }
  276. $oncetasks = json_decode($oncetasks->toJson(), true);
  277. $oncetasks['data'] = $res_tasks;
  278. }
  279. return $this->success($oncetasks);
  280. }
  281. }
  282. public function sign(Request $request){
  283. $uid = $request->uid;
  284. $date = current_time();
  285. if(UserUtils::is_signed($uid, $date)){
  286. return $this->fail(200010, [], '你今天已经签到过了');
  287. }
  288. DB::transaction(function () use($uid, $date){
  289. $model = new WxUserSignRecord();
  290. $model->user_id =$uid;
  291. $model->save();
  292. UserUtils::sign_reward($uid, $date);
  293. });
  294. return $this->success([ 'sign'=>$this->sign_data($uid), 'task'=>$this->task_data($uid), 'user'=>$this->user_data($uid) ]);
  295. }
  296. public function taskReward(Request $request){
  297. $uid = $request->uid;
  298. $task_id = trim($request->task_id, ',');
  299. if(_empty_($task_id)){
  300. return $this->fail(200001);
  301. }
  302. if(strpos($task_id, ',') === false){
  303. if(Utils::isTaskComplete($uid, $task_id)['code'] == 1){
  304. return $this->fail(200010, [], '您已领取该任务奖励');
  305. }
  306. $r = Utils::isTaskComplete($uid, $task_id, true);
  307. if($r['code'] != 1){
  308. return $this->fail(200014);
  309. }
  310. $tip = UserUtils::task_reward($uid, $task_id);
  311. if($tip){
  312. $userTask = new WxUserTask();
  313. $userTask->user_id = $uid;
  314. $userTask->task_id = $task_id;
  315. $r_ = $userTask->save();
  316. if(_empty_($r_)){
  317. $this->fail(200002);
  318. }
  319. return $this->success(['coins'=>UserUtils::user_coins($uid), 'task'=>$this->task_data($uid), 'user'=>$this->user_data($uid)], 200, '已获取 '.$tip.' 奖励');
  320. }else{
  321. $this->fail(200006);
  322. }
  323. }else{
  324. $task_id_arr = array_unique(explode(',', $task_id));
  325. if($task_id_arr){
  326. $rewrad_tip = '';
  327. foreach ($task_id_arr as $tid){
  328. if(Utils::isTaskComplete($uid, $tid)['code'] == 1){
  329. continue;
  330. }
  331. $r = Utils::isTaskComplete($uid, $tid, true);
  332. if($r['code'] != 1){
  333. continue;
  334. }
  335. $tip = UserUtils::task_reward($uid, $tid);
  336. if($tip){
  337. $userTask = new WxUserTask();
  338. $userTask->user_id = $uid;
  339. $userTask->task_id = $tid;
  340. $r_ = $userTask->save();
  341. if($r_){
  342. if(_empty_($rewrad_tip)){
  343. $rewrad_tip .= ',';
  344. }
  345. $rewrad_tip .= $tip;
  346. }
  347. }else{
  348. _logger_(__file__, __line__, '出现任务领取奖励的错误');
  349. }
  350. }
  351. if($rewrad_tip){
  352. return $this->success([], 200, '已获取 '.$rewrad_tip.' 等奖励');
  353. }
  354. }
  355. }
  356. }
  357. }