签到记录

master
lion 2 months ago
commit d4b2d757b2

@ -0,0 +1,232 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Exports\BaseExport;
use App\Exports\CommonExport;
use App\Helpers\ResponseCode;
use App\Models\AppointmentType;
use App\Models\Book;
use App\Models\Calendar;
use App\Models\Company;
use App\Models\Course;
use App\Models\CourseContentCheck;
use App\Models\CourseContentEvaluationAsk;
use App\Models\CourseContentEvaluationForm;
use App\Models\CourseSign;
use App\Models\CustomForm;
use App\Models\CustomFormField;
use App\Models\EmailTemplate;
use App\Models\SupplyDemand;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Rap2hpoutre\FastExcel\FastExcel;
class CourseContentCheckController extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
parent::__construct(new CourseContentCheck());
}
/**
* @OA\Get(
* path="/api/admin/course-content-check/index",
* tags={"签到管理"},
* summary="列表",
* description="",
* @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"),
* @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"),
* @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组包括teachercourseSettingscoursePeriods"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"),
* @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"),
* @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"),
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="course_id"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="course_content_id"),
* @OA\Parameter(name="has_check", in="query", @OA\Schema(type="string"), required=false, description="是否签到0否1是"),
* @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), required=false, description="name"),
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="mobile"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function index()
{
$all = request()->all();
// 签到用户
$courseContentCheck = CourseContentCheck::where(function ($query) use ($all) {
if (isset($all['course_id'])) {
$query->where('course_id', $all['course_id']);
}
if (isset($all['course_content_id'])) {
$query->where('course_content_id', $all['course_content_id']);
}
})->get();
$list = CourseSign::with(['course.typeDetail', 'user'])->whereHas('user', function ($query) use ($all) {
if (isset($all['name'])) {
$query->where('name', 'like', '%' . $all['name'] . '%');
}
if (isset($all['mobile'])) {
$query->where('mobile', 'like', '%' . $all['mobile'] . '%');
}
})->where(function ($query) use ($all, $courseContentCheck) {
if (isset($all['course_id'])) {
$query->where('course_id', $all['course_id']);
}
if (isset($all['has_check'])) {
if ($all['has_check'] == 1) {
$query->whereIn('user_id', $courseContentCheck->pluck('user_id'));
} else {
$query->whereNotIn('user_id', $courseContentCheck->pluck('user_id'));
}
}
if (isset($all['filter']) && !empty($all['filter'])) {
foreach ($all['filter'] as $condition) {
$key = $condition['key'] ?? null;
$op = $condition['op'] ?? null;
$value = $condition['value'] ?? null;
if (!isset($key) || !isset($op) || !isset($value)) {
continue;
}
// 等于
if ($op == 'eq') {
$query->where($key, $value);
}
// 不等于
if ($op == 'neq') {
$query->where($key, '!=', $value);
}
// 模糊搜索
if ($op == 'like') {
$query->where($key, 'like', '%' . $value . '%');
}
// 否定模糊搜索
if ($op == 'notlike') {
$query->where($key, 'not like', '%' . $value . '%');
}
// 范围搜索
if ($op == 'range') {
list($from, $to) = explode(',', $value);
if (empty($from) || empty($to)) {
continue;
}
$query->whereBetween($key, [$from, $to]);
}
}
}
})->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc')
->orderBy('created_at', 'desc');
if (isset($all['is_export']) && !empty($all['is_export'])) {
$list = $list->limit(5000)->get()->toArray();
foreach ($list as &$item) {
$courseContentCheck = CourseContentCheck::where('user_id', $item['user_id'])
->where(function ($query) use ($all) {
if (isset($all['course_content_id'])) {
$query->where('course_content_id', $all['course_content_id']);
}
if (isset($all['course_id'])) {
$query->where('course_id', $all['course_id']);
}
})->first();
// 是否存在courseContentCheck
$item['course_content_check_created_at'] = '';
if ($courseContentCheck) {
$item['course_content_check_text'] = '已签到';
$item['course_content_check_created_at'] = $courseContentCheck->created_at;
} else {
$item['course_content_check_text'] = '未签到';
}
}
return Excel::download(new CommonExport($list, $all['export_fields'] ?? ''), $all['file_name'] ?? '' . date('YmdHis') . '.xlsx');
} else {
// 输出
$list = $list->paginate($all['page_size'] ?? 20);
foreach ($list as $item) {
$item->course_content_check = CourseContentCheck::where('user_id', $item->user_id)
->where(function ($query) use ($all) {
if (isset($all['course_content_id'])) {
$query->where('course_content_id', $all['course_content_id']);
}
if (isset($all['course_id'])) {
$query->where('course_id', $all['course_id']);
}
})->first();
}
}
return $this->success(['list' => $list, 'course_content_check_count' => $courseContentCheck->count()]);
}
/**
* @OA\Get(
* path="/api/admin/course-content-check/show",
* tags={"签到管理"},
* summary="详情",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,填写输出指定数据"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public
function show()
{
return parent::show();
}
/**
* @OA\Post(
* path="/api/admin/course-content-check/save",
* tags={"签到管理"},
* summary="保存",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=true, description="Id(存在更新,不存在新增)"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"),
* @OA\Response(
* response="200",
* description="操作成功"
* )
* )
*/
public
function save()
{
return parent::save();
}
/**
* @OA\Get(
* path="/api/admin/course-content-check/destroy",
* tags={"签到管理"},
* summary="删除",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public
function destroy()
{
return parent::destroy();
}
}

@ -11,6 +11,7 @@ use App\Jobs\SendAppointCar;
use App\Jobs\SendCourseCar; use App\Jobs\SendCourseCar;
use App\Models\Appointment; use App\Models\Appointment;
use App\Models\Config; use App\Models\Config;
use App\Models\CourseContentCheck;
use App\Models\CourseSign; use App\Models\CourseSign;
use App\Models\RelatedModel; use App\Models\RelatedModel;
use App\Models\ScoreLog; use App\Models\ScoreLog;
@ -564,6 +565,7 @@ class UserController extends CommonController
* summary="短信登陆发送验证码", * summary="短信登陆发送验证码",
* description="", * description="",
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=true, description="课程id"), * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=true, description="课程id"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=true, description="课表id"),
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"), * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response( * @OA\Response(
@ -596,6 +598,21 @@ class UserController extends CommonController
if (empty($courseSigns)) { if (empty($courseSigns)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '未报名课程']); return $this->fail([ResponseCode::ERROR_BUSINESS, '未报名课程']);
} }
$user = User::where('mobile', $all['mobile'])->first();
if (empty($user)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '用户不存在']);
}
$list = CourseContentCheck::where('course_id', $all['course_id'])
->where(function ($query) use ($all) {
if (isset($all['course_content_id'])) {
$query->where('course_content_id', $all['course_content_id']);
}
})->where('user_id', $user->id)
->orderBy('created_at', 'desc')
->get();
if ($list->isNotEmpty()) {
return $this->success($list);
}
$key = 'sms_login_' . $all['mobile']; $key = 'sms_login_' . $all['mobile'];
$check = Cache::get($key); $check = Cache::get($key);
if (isset($check) && time() - $check['time'] <= 60) { if (isset($check) && time() - $check['time'] <= 60) {

@ -42,13 +42,15 @@ class CourseSign extends SoftDeletesModel
public function getFilesAttribute($value) public function getFilesAttribute($value)
{ {
if (empty($this->file_ids)) return []; if (empty($this->file_ids))
return [];
return Upload::whereIn('id', $this->file_ids)->get(); return Upload::whereIn('id', $this->file_ids)->get();
} }
public function getFeeFilesAttribute($value) public function getFeeFilesAttribute($value)
{ {
if (empty($this->fee_file_ids)) return []; if (empty($this->fee_file_ids))
return [];
return Upload::whereIn('id', $this->fee_file_ids)->get(); return Upload::whereIn('id', $this->fee_file_ids)->get();
} }

@ -1,2 +1,2 @@
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>SSTBC</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)')) <!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>SSTBC</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/sign/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/sign/static/js/chunk-vendors.fae945a7.js></script><script src=/sign/static/js/index.cf40addc.js></script></body></html> document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/sign/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/sign/static/js/chunk-vendors.fae945a7.js></script><script src=/sign/static/js/index.04a19cd7.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 957 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

@ -232,6 +232,12 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
Route::get('company/show', [\App\Http\Controllers\Admin\CompanyController::class, "show"]); Route::get('company/show', [\App\Http\Controllers\Admin\CompanyController::class, "show"]);
Route::post('company/save', [\App\Http\Controllers\Admin\CompanyController::class, "save"]); Route::post('company/save', [\App\Http\Controllers\Admin\CompanyController::class, "save"]);
Route::get('company/destroy', [\App\Http\Controllers\Admin\CompanyController::class, "destroy"]); Route::get('company/destroy', [\App\Http\Controllers\Admin\CompanyController::class, "destroy"]);
// 签到管理
Route::get('course-content-check/index', [\App\Http\Controllers\Admin\CourseContentCheckController::class, "index"]);
Route::get('course-content-check/show', [\App\Http\Controllers\Admin\CourseContentCheckController::class, "show"]);
Route::post('course-content-check/save', [\App\Http\Controllers\Admin\CourseContentCheckController::class, "save"]);
Route::get('course-content-check/destroy', [\App\Http\Controllers\Admin\CourseContentCheckController::class, "destroy"]);
}); });
}); });

Loading…
Cancel
Save