Merge branch 'master' of ssh://47.101.48.251:/data/git/wx.sstbc.com

master
lion 8 months ago
commit 504170d164

@ -0,0 +1,60 @@
<?php
namespace App\Console\Commands;
use App\Models\Course;
use App\Models\CourseSign;
use App\Models\EmailRecord;
use App\Models\EmailRecordUser;
use App\Models\User;
use App\Repositories\MeetRepository;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
class AutoSchoolmate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'auto_schoolmate';
/**
* The console command description.
*
* @var string
*/
protected $description = '已审核学员自动进入校友库';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// 获取今天上课的课程
$today = date('Y-m-d');
$courses = Course::where('start_date', $today)->where('auto_schoolmate', 1)->get();
foreach ($courses as $course) {
// 获取报名通过的学员
$courseSigns = CourseSign::where('course_id', $course->id)->where('status', 1)->get();
// 用户设置成校友
User::whereIn('id', $courseSigns->pluck('user_id'))->where('is_black',0)->update(['is_schoolmate' => 1]);
}
return $this->info('更新完成');
}
}

@ -42,6 +42,10 @@ class UpdateCompany extends Command
*/
public function handle()
{
// $YuanheRepository = new YuanheRepository();
// $result = $YuanheRepository->companyInfo(['keyword' => '苏州元瞰科技有限公司']);
// dd($result);
$user_id = $this->option('user_id');
// 更新公司信息
$this->compnay($user_id);

@ -28,6 +28,8 @@ class Kernel extends ConsoleKernel
$schedule->command('push_courses')->dailyAt('23:00');
// 更新学员编号
$schedule->command('update_user_no')->dailyAt('00:05');
// 更新课程校友资格
$schedule->command('auto_schoolmate')->dailyAt('23:50');
}
/**

@ -105,6 +105,8 @@ class CalendarsController extends BaseController
* @OA\Parameter(name="content", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="内容"),
* @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string", format="date-time"), required=false, description="开始时间YYYY-MM-DD HH:MM:SS"),
* @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string", format="date-time"), required=false, description="结束时间YYYY-MM-DD HH:MM:SS"),
* @OA\Parameter(name="is_publish", in="query", @OA\Schema(type="string"), required=true, description="是否向用户发布0否1是"),
* @OA\Parameter(name="address", in="query", @OA\Schema(type="string"), required=true, description="地址"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"),
* @OA\Response(
* response="200",

@ -160,6 +160,8 @@ class CourseContentController extends BaseController
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"),
* @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"),
* @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), description="文件id数组"),
* @OA\Parameter(name="direction", in="query", @OA\Schema(type="string"), description="课程方向"),
* @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"),
* @OA\Response(
* response=200,
* description="操作成功"
@ -171,6 +173,49 @@ class CourseContentController extends BaseController
return parent::save();
}
/**
* @OA\Post(
* path="/api/admin/course-contents/batch-save",
* tags={"排课"},
* summary="更新或新增",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=true, description="课程ID,多个英文逗号分割"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="验证token"),
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="integer"), description="课程ID"),
* @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string"), description="开始时间,例如11:00"),
* @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string"), description="结束时间,例如11:00"),
* @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), description="日期"),
* @OA\Parameter(name="teacher_id", in="query", @OA\Schema(type="integer"), description="老师ID"),
* @OA\Parameter(name="address", in="query", @OA\Schema(type="string"), description="地址"),
* @OA\Parameter(name="theme", in="query", @OA\Schema(type="string"), description="主题"),
* @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), description="经度"),
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"),
* @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"),
* @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), description="文件id数组"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function batchSave()
{
$all = \request()->all();
DB::beginTransaction();
try {
$ids = explode(',', $all['id']);
foreach ($ids as $id) {
$model = $this->model->find($id);
$model->fill($all);
$model->save();
}
DB::commit();
return $this->success("更新成功");
} catch (\Exception $exception) {
DB::rollBack();
return $this->fail([$exception->getCode(), $exception->getMessage()]);
}
}
/**
* @OA\Get(
* path="/api/admin/course-contents/destroy",

@ -203,12 +203,9 @@ class CourseController extends BaseController
* @OA\Parameter(name="image_id", in="query", @OA\Schema(type="integer"), description="图片id"),
* @OA\Parameter(name="qun_image_id", in="query", @OA\Schema(type="integer"), description="群图片id"),
* @OA\Parameter(name="is_virtual", in="query", @OA\Schema(type="integer"), description="是否虚拟课程0否1是"),
* @OA\Parameter(name="course_content_evaluation_title", in="query", @OA\Schema(type="integer"), description="问卷标题"),
* @OA\Parameter(name="course_content_status", in="query", @OA\Schema(type="integer"), description="课表状态0未发布, 1已发布"),
* @OA\Parameter(name="course_content_evaluation_desc", in="query", @OA\Schema(type="integer"), description="问卷描述"),
* @OA\Parameter(name="course_content_evaluation_type_id", in="query", @OA\Schema(type="integer"), description="问卷类型id"),
* @OA\Parameter(name="course_content_evaluation_start_time", in="query", @OA\Schema(type="integer"), description="问卷开始时间"),
* @OA\Parameter(name="course_content_evaluation_end_time", in="query", @OA\Schema(type="integer"), description="问卷结束时间"),
* @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), description="经度"),
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"),
* @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"),
* @OA\Response(
* response=200,
* description="操作成功"
@ -336,6 +333,36 @@ class CourseController extends BaseController
return $this->success($url);
}
/**
* @OA\Get(
* path="/api/admin/courses/check-qrcode",
* 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 checkQrcode()
{
$all = \request()->all();
$messages = [
'id.required' => 'Id必填',
];
$validator = Validator::make($all, [
'id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$url = (new Course())->getCourseCheckQrcode($all['id']);
return $this->success($url);
}
/**
* @OA\Get(
* path="/api/admin/courses/send-sms",

@ -71,103 +71,103 @@ class CourseSignController extends BaseController
public function index()
{
$all = request()->all();
$list = $this->model->with('course', 'user', 'thirdAppointmentLogs')
->whereHas('user', function ($query) use ($all) {
if (isset($all['is_vip'])) {
$query->where('is_vip', $all['is_vip']);
}
// if (isset($all['name'])) {
// $query->where('name', 'like', '%' . $all['name'] . '%');
// }
if (isset($all['company_name'])) {
$query->where('company_name', 'like', '%' . $all['company_name'] . '%');
}
if (isset($all['company_position'])) {
$query->where('company_position', $all['company_position']);
}
if (isset($all['company_area'])) {
$company_area = explode(',', $all['company_area']);
$query->whereIn('company_area', $company_area);
}
if (isset($all['company_type'])) {
$company_type = explode(',', $all['company_type']);
$query->where(function ($q) use ($company_type) {
foreach ($company_type as $v) {
$q->orWhereRaw('FIND_IN_SET(?, company_type)', [$v]);
}
});
}
if (isset($all['company_industry'])) {
$company_industry = explode(',', $all['company_industry']);
$query->whereIn('company_industry', $company_industry);
}
if (isset($all['is_schoolmate'])) {
$query->where('is_schoolmate', $all['is_schoolmate']);
}
if (isset($all['mobile'])) {
$query->where('mobile', 'like', '%' . $all['mobile'] . '%');
}
if (isset($all['education'])) {
$education = explode(',', $all['education']);
$query->whereIn('education', $education);
}
if (isset($all['type'])) {
$type = explode(',', $all['type']);
$query->where(function ($q) use ($type) {
foreach ($type as $v) {
$q->orWhereRaw('FIND_IN_SET(?, type)', [$v]);
}
});
}
})->where(function ($query) use ($all) {
if (isset($all['filter_date']) && !empty($all['filter_date'])) {
foreach ($all['filter_date'] as $item) {
$query->whereJsonContains("data->{$item->name}", $item->value);
$list = $this->model->with(['course', 'thirdAppointmentLogs', 'user' => function ($query) {
$query->with(['courseSigns' => function ($q) {
$q->where('status', 1)->with('course');
}]);
}])->whereHas('user', function ($query) use ($all) {
if (isset($all['is_vip'])) {
$query->where('is_vip', $all['is_vip']);
}
if (isset($all['company_name'])) {
$query->where('company_name', 'like', '%' . $all['company_name'] . '%');
}
if (isset($all['company_position'])) {
$query->where('company_position', $all['company_position']);
}
if (isset($all['company_area'])) {
$company_area = explode(',', $all['company_area']);
$query->whereIn('company_area', $company_area);
}
if (isset($all['company_type'])) {
$company_type = explode(',', $all['company_type']);
$query->where(function ($q) use ($company_type) {
foreach ($company_type as $v) {
$q->orWhereRaw('FIND_IN_SET(?, company_type)', [$v]);
}
});
}
if (isset($all['company_industry'])) {
$company_industry = explode(',', $all['company_industry']);
$query->whereIn('company_industry', $company_industry);
}
if (isset($all['is_schoolmate'])) {
$query->where('is_schoolmate', $all['is_schoolmate']);
}
if (isset($all['mobile'])) {
$query->where('mobile', 'like', '%' . $all['mobile'] . '%');
}
if (isset($all['education'])) {
$education = explode(',', $all['education']);
$query->whereIn('education', $education);
}
if (isset($all['type'])) {
$type = explode(',', $all['type']);
$query->where(function ($q) use ($type) {
foreach ($type as $v) {
$q->orWhereRaw('FIND_IN_SET(?, type)', [$v]);
}
});
}
})->where(function ($query) use ($all) {
if (isset($all['filter_date']) && !empty($all['filter_date'])) {
foreach ($all['filter_date'] as $item) {
$query->whereJsonContains("data->{$item->name}", $item->value);
}
})->where(function ($query) use ($all) {
if (isset($all['name'])) {
$query->where(function ($q) use ($all) {
$q->whereHas('user', function ($q) use ($all) {
$q->where('name', 'like', '%' . $all['name'] . '%');
})->orWhere('change_data', 'like', '%' . $all['name'] . '%');
});
}
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)) {
}
})->where(function ($query) use ($all) {
if (isset($all['name'])) {
$query->where(function ($q) use ($all) {
$q->whereHas('user', function ($q) use ($all) {
$q->where('name', 'like', '%' . $all['name'] . '%');
})->orWhere('change_data', 'like', '%' . $all['name'] . '%');
});
}
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;
}
// 等于
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]);
}
$query->whereBetween($key, [$from, $to]);
}
}
})->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc')
}
})->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();

@ -196,9 +196,8 @@ class OtherController extends CommonController
public function test()
{
$appointmentModel = Appointment::find(288);
$appointmentConfig = $appointmentModel->site_detail;
$result = (new Appointment())->appointDoor($appointmentModel, $appointmentConfig);
$door = new DoorRepository();
$result = $door->getAllDoorInfo();
dd($result);
}

@ -6,6 +6,7 @@ use App\Exports\BaseExport;
use App\Helpers\ResponseCode;
use App\Models\AppointmentType;
use App\Models\CustomForm;
use App\Models\Dialogue;
use App\Models\Message;
use App\Models\SupplyDemand;
use App\Models\SupplyDemandType;
@ -336,4 +337,59 @@ class SupplyDemandController extends BaseController
];
}
/**
* @OA\Get(
* path="/api/admin/supply-demand/message-list",
* tags={"供需信息管理"},
* summary="消息列表",
* description="",
* @OA\Parameter(name="to_user_id", in="query", @OA\Schema(type="string"), required=true, description="接收人"),
* @OA\Parameter(name="user_id", in="query", @OA\Schema(type="string"), required=true, description="发起人"),
* @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="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function messageList()
{
$all = \request()->all();
$messages = [
'to_user_id.required' => '接收人必填',
'user_id.required' => '接收人必填',
];
$validator = Validator::make($all, [
'user_id' => 'required',
'to_user_id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
// 获取会话id
$dialogue = Dialogue::where(function ($query) use ($all) {
$query->where('user_id', $all['user_id'])->where('to_user_id', $all['to_user_id']);
})->orWhere(function ($query) use ($all) {
$query->where('user_id', $all['to_user_id'])->where('to_user_id', $all['user_id']);
})->first();
if (empty($dialogue)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '会话不存在']);
}
$message = Message::with([
'user' => function ($query) {
$query->select('id', 'nickname', 'name', 'headimgurl', 'username');
},
'toUser' => function ($query) {
$query->select('id', 'nickname', 'name', 'headimgurl', 'username');
}
])->where(function ($query) use ($dialogue) {
$query->where('dialogue_id', $dialogue->id);
})->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc')
->paginate($all['page_size'] ?? 20);
return $this->success(compact('message'));
}
}

@ -2,7 +2,10 @@
namespace App\Http\Controllers\Admin;
use App\Exports\BaseExport;
use App\Models\CustomForm;
use App\Models\Teacher;
use Maatwebsite\Excel\Facades\Excel;
class TeacherController extends BaseController
{
@ -38,7 +41,79 @@ class TeacherController extends BaseController
*/
public function index()
{
return parent::index();
$all = request()->all();
$list = $this->model->with('courseContents.course')->where(function ($query) use ($all) {
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 == 'gt') {
$query->where($key, '>', $value);
}
// 大于等于
if ($op == 'egt') {
$query->where($key, '>=', $value);
}
// 小于
if ($op == 'lt') {
$query->where($key, '<', $value);
}
// 小于等于
if ($op == 'elt') {
$query->where($key, '<=', $value);
}
// 模糊搜索
if ($op == 'like') {
$query->where($key, 'like', '%' . $value . '%');
}
// 否定模糊搜索
if ($op == 'notlike') {
$query->where($key, 'not like', '%' . $value . '%');
}
// null搜索
if ($op == 'null') {
$query->whereNull($key);
}
// notnull搜索
if ($op == 'notnull') {
$query->whereNotNull($key);
}
// 范围搜索
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');
if (isset($all['is_export']) && !empty($all['is_export'])) {
$list = $list->get()->toArray();
$export_fields = $all['export_fields'] ?? [];
// 导出文件名字
$tableName = $this->model->getTable();
$filename = (new CustomForm())->getTableComment($tableName);
return Excel::download(new BaseExport($export_fields, $list, $tableName), $filename . date('YmdHis') . '.xlsx');
} else {
// 输出
$list = $list->paginate($all['page_size'] ?? 20);
}
return $this->success($list);
}
/**

@ -179,6 +179,7 @@ class UserController extends BaseController
* @OA\Parameter(name="is_fee", in="query", @OA\Schema(type="string"), required=true, description="是否缴费0否1是"),
* @OA\Parameter(name="has_openid", in="query", @OA\Schema(type="string"), required=true, description="是否绑定小程序0否1是"),
* @OA\Parameter(name="year", in="query", @OA\Schema(type="string"), required=true, description="年份"),
* @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), required=true, description="是否黑名单0否1是"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
@ -241,6 +242,9 @@ class UserController extends BaseController
if (isset($all['is_vip'])) {
$query->where('is_vip', $all['is_vip']);
}
if (isset($all['is_black'])) {
$query->where('is_black', $all['is_black']);
}
if (isset($all['type'])) {
$type = explode(',', $all['type']);
$query->where(function ($q) use ($type) {
@ -402,6 +406,7 @@ class UserController extends BaseController
* @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="integer"), description="公司是否需要融资0否1是"),
* @OA\Parameter(name="sign_from", in="query", @OA\Schema(type="string"), description="报名信息来源"),
* @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"),
* @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), description="是否黑名单0否1是"),
* @OA\Parameter(name="has_appointment_total", in="query", @OA\Schema(type="string"), description="预约剩余次数"),
* @OA\Response(
* response=200,
@ -623,6 +628,7 @@ class UserController extends BaseController
* description="",
* @OA\Parameter(name="ids", in="query", @OA\Schema(type="string"), required=true, description="英文逗号分隔的id数组"),
* @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string"), required=true, description="是否校友库-0否1是"),
* @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), required=true, description="是否黑名单-0否1是"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
@ -635,17 +641,23 @@ class UserController extends BaseController
$all = \request()->all();
$messages = [
'ids.required' => '编号必填',
'is_schoolmate.required' => '是否校友库必填',
];
$validator = Validator::make($all, [
'ids' => 'required',
'is_schoolmate' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$idsArray = explode(',', $all['ids']);
$this->model->whereIn('id', $idsArray)->update(['is_schoolmate' => $all['is_schoolmate']]);
$data = [];
if (isset($all['is_schoolmate'])) {
$data['is_schoolmate'] = $all['is_schoolmate'];
}
if (isset($all['is_black'])) {
$data['is_black'] = $all['is_black'];
}
$this->model->whereIn('id', $idsArray)->update($data);
return $this->success('批量更新成功');
}

@ -109,7 +109,7 @@ class CourseController extends CommonController
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher')
$detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher','courseContentEvaluation.courseContentEvaluationAsks')
->withCount(['courseSigns as my_user' => function ($query) {
$query->where('user_id', $this->getUserId());
}])->find($all['course_id']);
@ -223,7 +223,7 @@ class CourseController extends CommonController
*/
public function myCourse()
{
$list = Course::with('typeDetail')->with(['courseSigns' => function ($query) {
$list = Course::with('typeDetail', 'courseContentEvaluation')->with(['courseSigns' => function ($query) {
$query->where('user_id', $this->getUserId());
}])->whereHas('courseSigns', function ($query) {
$query->where('user_id', $this->getUserId());
@ -236,6 +236,7 @@ class CourseController extends CommonController
* path="/api/mobile/course/my-course-content",
* tags={"小程序-课程"},
* summary="我的课表",
* @OA\Parameter(name="date", in="query", @OA\Schema(type="string"), required=false, description="日期"),
* @OA\Response(
* response=200,
* description="操作成功"
@ -244,18 +245,24 @@ class CourseController extends CommonController
*/
public function myCourseContent()
{
$list = CourseContent::with('course.typeDetail', 'teacher', 'courseContentEvaluation')->whereHas('course', function ($query) {
$query->where('course_status', '!=', 40)->where('course_content_status', 1);
$query->whereHas('courseSigns', function ($query) {
$query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) {
$q->where('fee_status', 1)->orWhere(function ($q) {
$q->whereHas('course', function ($qry) {
$qry->where('is_fee', 0);
$date = request('date');
$list = CourseContent::with('course.typeDetail', 'teacher', 'courseContentEvaluation')
->where(function ($query) use ($date) {
if ($date) {
$query->where('date', $date);
}
})->whereHas('course', function ($query) {
$query->where('course_status', '!=', 40)->where('course_content_status', 1);
$query->whereHas('courseSigns', function ($query) {
$query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) {
$q->where('fee_status', 1)->orWhere(function ($q) {
$q->whereHas('course', function ($qry) {
$qry->where('is_fee', 0);
});
});
});
});
});
})->orderBy('date')->get();
})->orderBy('date')->get();
return $this->success(compact('list'));
}
@ -311,12 +318,10 @@ class CourseController extends CommonController
$messages = [
'course_content_evaluation_id.required' => '问卷id必填',
'data.required' => '表单数据必填',
// 'time_total.required' => '用时必填'
];
$validator = Validator::make($all, [
'course_content_evaluation_id' => 'required',
'data' => 'required',
// 'time_total' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
@ -338,6 +343,7 @@ class CourseController extends CommonController
return $this->fail([ResponseCode::ERROR_BUSINESS, '您已提交过评价']);
}
$model = CourseContentEvaluationForm::create([
'course_id' => $courseContentEvaluation->course_id,
'course_content_evaluation_id' => $all['course_content_evaluation_id'],
'user_id' => $this->getUserId(),
'time_total' => $all['time_total'] ?? 0,
@ -455,7 +461,8 @@ class CourseController extends CommonController
* path="/api/mobile/course/distance",
* tags={"小程序-计算距离"},
* summary="签到",
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"),
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课程id二选一"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id二选一"),
* @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"),
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"),
* @OA\Response(
@ -470,20 +477,26 @@ class CourseController extends CommonController
$messages = [
'longitude.required' => '经度必填',
'latitude.required' => '纬度必填',
'course_content_id.required' => '课程id必填',
];
$validator = Validator::make($all, [
'longitude' => 'required',
'latitude' => 'required',
'course_content_id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
// 获取打卡范围,千米
$content_check_range = Config::getValueByKey('content_check_range');
$courseContent = CourseContent::find($all['course_content_id']);
$distance = getDistance($courseContent->longitude, $courseContent->latitude, $all['longitude'], $all['latitude']);
if (isset($all['course_id'])) {
$info = Course::find($all['course_id']);
}
if (isset($all['course_content_id'])) {
$info = CourseContent::find($all['course_content_id']);
}
if (!isset($info)) {
return $this->fail([ResponseCode::ERROR_PARAMETER, '数据不存在']);
}
$distance = getDistance($info->longitude, $info->latitude, $all['longitude'], $all['latitude']);
return $this->success(compact('distance', 'content_check_range'));
}
@ -491,7 +504,8 @@ class CourseController extends CommonController
* @OA\Get(
* path="/api/mobile/course/content-check",
* tags={"小程序-课程"},
* summary="签到",
* summary="课表签到",
* @OA\Parameter(name="batch_sign", in="query", @OA\Schema(type="string"), required=false, description="是否同日期批量签到0否1是"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"),
* @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"),
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"),
@ -507,7 +521,7 @@ class CourseController extends CommonController
$messages = [
'longitude.required' => '经度必填',
'latitude.required' => '纬度必填',
'course_content_id.required' => '课id必填',
'course_content_id.required' => '课id必填',
];
$validator = Validator::make($all, [
'longitude' => 'required',
@ -525,7 +539,8 @@ class CourseController extends CommonController
return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']);
}
// 判断当天才能签到
if (date('Y-m-d') != $courseContent->date) {
$today = date('Y-m-d');
if ($today != $courseContent->date) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '不在签到时间']);
}
// 不能重复签到
@ -537,40 +552,125 @@ class CourseController extends CommonController
}
CourseContentCheck::create([
'course_content_id' => $all['course_content_id'],
'course_id' => $courseContent->course_id,
'user_id' => $this->getUserId(),
'longitude' => $all['longitude'],
'latitude' => $all['latitude'],
]);
return $this->success('打卡成功');
// 同日期课程批量签到
$batch_sign = request('batch_sign', 0);
if ($batch_sign) {
$courseContentList = CourseContent::where('date', $today)
->whereHas('course', function ($query) {
$query->where('course_status', '!=', 40)->where('course_content_status', 1);
$query->whereHas('courseSigns', function ($query) {
$query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) {
$q->where('fee_status', 1)->orWhere(function ($q) {
$q->whereHas('course', function ($qry) {
$qry->where('is_fee', 0);
});
});
});
});
})->get();
foreach ($courseContentList as $courseContent) {
CourseContentCheck::create([
'course_id' => $courseContent->course_id,
'course_content_id' => $courseContent->id,
'user_id' => $this->getUserId(),
'longitude' => $all['longitude'],
'latitude' => $all['latitude'],
]);
}
}
return $this->success('签到成功');
}
/**
* @OA\Get(
* path="/api/mobile/course/content-check-list",
* path="/api/mobile/course/course-check",
* tags={"小程序-课程"},
* summary="获取签到记录",
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"),
* summary="课程签到",
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"),
* @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"),
* @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function contentCheckList()
public function courseCheck()
{
$all = \request()->all();
$messages = [
'course_content_id.required' => '课程id必填',
'longitude.required' => '经度必填',
'latitude.required' => '纬度必填',
'course_id.required' => '课表id必填',
];
$validator = Validator::make($all, [
'course_content_id' => 'required'
'longitude' => 'required',
'latitude' => 'required',
'course_id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$list = CourseContentCheck::where('course_content_id', $all['course_content_id'])
// 获取打卡范围,千米
$content_check_range = Config::getValueByKey('content_check_range');
$course = Course::find($all['course_id']);
if (empty($course->longitude) || empty($course->latitude)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '请先设置课程经纬度']);
}
$distance = getDistance($course->longitude, $course->latitude, $all['longitude'], $all['latitude']);
if ($distance > $content_check_range) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']);
}
// 判断当天才能签到
$today = date('Y-m-d');
if ($today != $course->start_date) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '不在签到时间']);
}
// 不能重复签到
$courseContentCheck = CourseContentCheck::where('course_id', $all['course_id'])
->where('user_id', $this->getUserId())
->first();
if ($courseContentCheck) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '不能重复签到']);
}
CourseContentCheck::create([
'course_id' => $all['course_id'],
'user_id' => $this->getUserId(),
'longitude' => $all['longitude'],
'latitude' => $all['latitude'],
]);
return $this->success('课程签到成功');
}
/**
* @OA\Get(
* path="/api/mobile/course/content-check-list",
* tags={"小程序-课程"},
* summary="获取签到记录",
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课程id"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function contentCheckList()
{
$all = \request()->all();
$list = 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']);
}
})->where('user_id', $this->getUserId())
->orderBy('created_at', 'desc')
->get();
return $this->success(compact('list'));
@ -855,29 +955,16 @@ class CourseController extends CommonController
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
// $startDate = $all['month'] . '-01';
// $endDate = date('Y-m-t', strtotime($startDate));
$list = Calendar::with('course', 'courseContent')
->where(function ($query) use ($all) {
if (isset($all['type'])) {
$query->where('type', $all['type']);
}
})->where('start_time', 'like', '%' . $all['month'] . '%')
->where('is_publish', 1)
->orderBy('start_time', 'asc')
->get();
// $range = getDates($startDate, $endDate);
// $list = [];
// foreach ($range as $date) {
// // 查询Calendar模型里start_time和end_time在日期内的数据,其中date是年月日start_time和end_time是时分秒
// $list[] = [
// 'date' => $date,
// 'details' => Calendar::with('course', 'courseContent')
// ->whereDate('start_time', '<=', $date)
// ->whereDate('end_time', '>=', $date)
// ->get()
// ];
// }
return $this->success($list);
}

@ -90,7 +90,47 @@ class OtherController extends CommonController
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$YuanheRepository = new YuanheRepository();
$result = $YuanheRepository->companyInfo(['keyword' => $all['company_name']]);
// $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]);
$result[] = [
"createBy" => null,
"createDt" => null,
"updateBy" => null,
"updateDt" => null,
"enterpriseId" => "1950060660573786112",
"enterpriseName" => "苏州元瞰科技有限公司",
"creditCode" => "91320594MA7F0G9W6A",
"keyNo" => "db5ppy5kbsprbbhjbjlarvmvphjhp3mrkv",
"isAbroad" => "0",
"status" => "注销",
"logo" => "https://image.qcc.com/logo/EntImage.png",
"operName" => "刘杰杰",
"contactMail" => "425039148@qq.com",
"contactPhone" => "15298866552",
"startDate" => "2021-12-21",
"endDate" => null,
"updatedDate" => "2025-08-17",
"registCapi" => "100万元",
"registAmount" => "1000000.0000",
"registCapiType" => "1",
"currencyType" => null,
"termStart" => "2021-12-21",
"termEnd" => null,
"checkDate" => "2025-07-03",
"orgNo" => "MA7F0G9W-6",
"isOnStock" => "0",
"stockNumber" => "",
"stockType" => "",
"stockDate" => null,
"province" => "江苏省",
"city" => "苏州市",
"country" => "苏州工业园区",
"areaCode" => "320576",
"address" => "苏州工业园区亭新街11号B1栋二楼",
"businessScope" => "一般项目:人工智能应用软件开发",
"tagList" => null,
"qccIndustry" => null,
"isYhInvested" => false
];
if (!$result) {
return $this->fail([ResponseCode::ERROR_PARAMETER, '获取失败']);
}

@ -252,27 +252,22 @@ class SupplyDemandController extends CommonController
// 创建一条会话
$dialogue = Dialogue::create([
'user_id' => $this->getUserId(),
'to_user_id' => $all['to_user_id'],
'supply_demand_id' => $all['supply_demand_id'] ?? 0
'to_user_id' => $all['to_user_id']
]);
// 增加联系次数
if (isset($all['supply_demand_id'])) {
SupplyDemand::where('id', $all['supply_demand_id'])->increment('contact_count');
}
} else {
// 存在对话如果也存在供需信息id则更新供需id到最新
if (isset($all['supply_demand_id'])) {
$dialogue->supply_demand_id = $all['supply_demand_id'];
$dialogue->save();
}
}
if (isset($all['supply_demand_id'])) {
$now = date('Y-m-d');
// 过期数据不能私信
$supplyDemand = SupplyDemand::find($all['supply_demand_id']);
if ($supplyDemand->expire_time > $now) {
if (isset($supplyDemand->expire_time) && $supplyDemand->expire_time > $now) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '该信息已过期,不能私信']);
}
if ($dialogue->supply_demand_id != $all['supply_demand_id']) {
// 第一次联系才增加一次
SupplyDemand::where('id', $all['supply_demand_id'])->increment('contact_count');
}
$dialogue->supply_demand_id = $all['supply_demand_id'];
$dialogue->save();
}
// 每天限制私信次数限制
$message_limit = Config::getValueByKey('message_limit');
@ -349,7 +344,11 @@ class SupplyDemandController extends CommonController
$query->where('user_id', $all['to_user_id'])->where('to_user_id', $this->getUserId());
})->first();
if (empty($dialogue)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '会话不存在']);
// 创建一个会话
$dialogue = Dialogue::create([
'user_id' => $this->getUserId(),
'to_user_id' => $all['to_user_id']
]);
}
$message = Message::with([
'user' => function ($query) {

@ -254,7 +254,7 @@ class UserController extends CommonController
})->where('id', $this->getUserId())->count();
// 是否生日
$is_birthday = 0;
if ($user->birthday == date('Y-m-d')) {
if (isset($user->birthday) && $user->birthday == date('Y-m-d')) {
$is_birthday = 1;
}
return $this->success(compact('user', 'door_appointments', 'course_signs', 'enter_schoolmate', 'is_birthday'));

@ -99,6 +99,11 @@ class Course extends SoftDeletesModel
return $this->hasMany(CourseContent::class, 'course_id', 'id');
}
public function courseContentEvaluation()
{
return $this->hasOne(CourseContentEvaluation::class, 'course_id', 'id');
}
/**
* 更新课程报名状态
*/
@ -180,5 +185,33 @@ class Course extends SoftDeletesModel
return $url;
}
/**
* 获取课程报名小程序码
*/
public function getCourseCheckQrcode($courseId)
{
$course = Course::find($courseId);
$path = config('filesystems.disks.public.root') . '/course_check_qrcode/' . $course->id . '.png';
$url = config('filesystems.disks.public.url') . '/course_check_qrcode/' . $course->id . '.png';
$fileSys = new Filesystem();
if ($fileSys->exists($path)) {
return $url;
}
$config = [
'app_id' => \config('app.applet_appid'),
'secret' => \config('app.applet_secret')
];
$app = Factory::miniProgram($config);
$tmp = $app->app_code->get('packages/sign/course?course_id=' . $courseId, [
// todo:: 版本切换
// 'env_version' => "release" // 正式版
'env_version' => "trial" // 体验版
]);
$dir = dirname($path);
$fileSys->ensureDirectoryExists($dir, 0755, true);
$fileSys->put($path, $tmp);
return $url;
}
}

@ -6,6 +6,10 @@ namespace App\Models;
class Teacher extends SoftDeletesModel
{
public function courseContents()
{
return $this->hasMany(CourseContent::class, 'teacher_id', 'id');
}
}

@ -15,6 +15,8 @@ return new class extends Migration
{
Schema::create('course_content_checks', function (Blueprint $table) {
$table->id();
// 课程id
$table->integer('course_id')->nullable()->comment('课程id');
$table->integer('course_content_id')->nullable()->comment('课程排课id');
$table->integer('user_id')->nullable()->comment('用户id');
// 经度

@ -14,6 +14,10 @@ return new class extends Migration
public function up()
{
Schema::table('course_contents', function (Blueprint $table) {
// 课程方向
$table->string('direction')->nullable()->comment('课程方向');
// 备注
$table->string('remark')->nullable()->comment('备注');
// 经度
$table->string('longitude')->nullable()->comment('经度');
// 纬度

@ -32,6 +32,12 @@ return new class extends Migration {
$table->dateTime('end_time')->nullable()->comment('结束时间');
// 链接
$table->string('url')->nullable()->comment('链接');
// 是否向用户发布
$table->boolean('is_publish')->nullable()->comment('是否向用户发布');
// 地址
$table->string('address')->nullable()->comment('地址');
// 介绍
$table->text('introduce')->nullable()->comment('介绍');
$table->timestamps();
$table->softDeletes();
});

@ -14,6 +14,8 @@ return new class extends Migration {
{
Schema::create('course_content_evaluation_forms', function (Blueprint $table) {
$table->id();
// 课程id
$table->integer('course_id')->nullable()->comment('课程id');
$table->integer('course_content_evaluation_id')->nullable()->comment('课程内容id');
$table->integer('user_id')->nullable()->comment('用户id');
$table->integer('time_total')->nullable()->comment('用时,单位秒');

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('courses', function (Blueprint $table) {
// 已审核学员是否自动进入校友库
$table->boolean('auto_schoolmate')->default(false)->comment('已审核学员是否自动进入校友库0否1是');
// 经度
$table->string('longitude')->nullable()->comment('经度');
// 纬度
$table->string('latitude')->nullable()->comment('纬度');
// 详细地址
$table->string('address_detail')->nullable()->comment('详细地址');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('courses', function (Blueprint $table) {
//
});
}
};

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
// 是否黑名单
$table->boolean('is_black')->default(0)->comment('是否黑名单');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
};

@ -48,12 +48,14 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
Route::post('courses/excel-show', [\App\Http\Controllers\Admin\CourseController::class, "excelShow"]);
Route::post('courses/import', [\App\Http\Controllers\Admin\CourseController::class, "import"]);
Route::get('courses/qrcode', [\App\Http\Controllers\Admin\CourseController::class, "qrcode"]);
Route::get('courses/check-qrcode', [\App\Http\Controllers\Admin\CourseController::class, "checkQrcode"]);
Route::get('courses/send-sms', [\App\Http\Controllers\Admin\CourseController::class, "sendSms"]);
// 排课
Route::get('course-contents/index', [\App\Http\Controllers\Admin\CourseContentController::class, "index"]);
Route::get('course-contents/show', [\App\Http\Controllers\Admin\CourseContentController::class, "show"]);
Route::post('course-contents/save', [\App\Http\Controllers\Admin\CourseContentController::class, "save"]);
Route::post('course-contents/batch-save', [\App\Http\Controllers\Admin\CourseContentController::class, "batchSave"]);
Route::get('course-contents/destroy', [\App\Http\Controllers\Admin\CourseContentController::class, "destroy"]);
Route::post('course-contents/excel-show', [\App\Http\Controllers\Admin\CourseContentController::class, "excelShow"]);
Route::post('course-contents/import', [\App\Http\Controllers\Admin\CourseContentController::class, "import"]);
@ -174,6 +176,8 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
Route::post('supply-demand/save', [\App\Http\Controllers\Admin\SupplyDemandController::class, "save"]);
Route::get('supply-demand/destroy', [\App\Http\Controllers\Admin\SupplyDemandController::class, "destroy"]);
Route::get('supply-demand/chart', [\App\Http\Controllers\Admin\SupplyDemandController::class, "chart"]);
Route::get('supply-demand/message-list', [\App\Http\Controllers\Admin\SupplyDemandController::class, "messageList"]);
// 图书管理
Route::get('book/index', [\App\Http\Controllers\Admin\BookController::class, "index"]);
@ -272,17 +276,20 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () {
Route::get('course/my-course', [\App\Http\Controllers\Mobile\CourseController::class, "myCourse"]);
Route::get('course/my-course-content', [\App\Http\Controllers\Mobile\CourseController::class, "myCourseContent"]);
Route::get('course/course-content-detail', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentDetail"]);
Route::post('course/course-content-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentForm"]);
Route::post('course/course-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseForm"]);
Route::get('course/get-sign', [\App\Http\Controllers\Mobile\CourseController::class, "getSign"]);
Route::post('course/update-sign', [\App\Http\Controllers\Mobile\CourseController::class, "updateSign"]);
Route::post('course/course-content-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentForm"]);
// 获取缴费二维码
Route::get('course/pay', [\App\Http\Controllers\Mobile\CourseController::class, "pay"]);
Route::get('course/contents', [\App\Http\Controllers\Mobile\CourseController::class, "contents"]);
// 计算距离
Route::get('course/distance', [\App\Http\Controllers\Mobile\CourseController::class, "distance"]);
// 签到
// 课表签到
Route::get('course/content-check', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheck"]);
// 课程签到
Route::get('course/course-check', [\App\Http\Controllers\Mobile\CourseController::class, "courseCheck"]);
// 签到列表
Route::get('course/content-check-list', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheckList"]);
// 校友库

Loading…
Cancel
Save