于宏哲PHP 6 months ago
parent
commit
15b1f5674b
  1. 40
      niucloud/app/api/controller/apiController/CustomerResources.php
  2. 1
      niucloud/app/api/controller/member/Member.php
  3. 72
      niucloud/app/api/controller/student/StudentController.php
  4. 2
      niucloud/app/api/route/member.php
  5. 4
      niucloud/app/api/route/student.php
  6. 14
      niucloud/app/listener/personnel/Student.php
  7. 6
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  8. 13
      niucloud/app/service/admin/person_course_schedule/PersonCourseScheduleService.php
  9. 4
      niucloud/app/service/admin/physical_test/PhysicalTestService.php
  10. 88
      niucloud/app/service/api/apiService/PersonnelService.php
  11. 32
      niucloud/app/service/api/member/MemberService.php
  12. 196
      niucloud/app/service/api/student/StudentService.php
  13. 6
      uniapp/api/member.js
  14. 144
      uniapp/pages-coach/coach/my/teaching_management_info.vue
  15. 16
      uniapp/pages-market/clue/add_clues.vue
  16. 3
      uniapp/pages-market/clue/class_arrangement_detail.vue
  17. 3488
      uniapp/pages-market/clue/clue_info.vue
  18. 10
      uniapp/pages-market/clue/edit_clues.vue
  19. 26
      uniapp/pages-market/clue/index.vue
  20. 1
      uniapp/pages-student/schedule/index.vue

40
niucloud/app/api/controller/apiController/CustomerResources.php

@ -29,7 +29,7 @@ class CustomerResources extends BaseApiService
* school_customer_resources: male/female/other * school_customer_resources: male/female/other
* school_student: 1/2/0 * school_student: 1/2/0
*/ */
private function convertGender($gender) private function convertGender($gender)
{ {
switch ($gender) { switch ($gender) {
case 'male': case 'male':
@ -66,15 +66,15 @@ class CustomerResources extends BaseApiService
$date = date('Y-m-d'); $date = date('Y-m-d');
$param = $request->param(); $param = $request->param();
$promised_visit_time = $request->param('promised_visit_time', ''); $promised_visit_time = $request->param('promised_visit_time', '');
if ($promised_visit_time) { // if ($promised_visit_time) {
$promised_visit_time = date('Y-m-d H:i:s', strtotime($promised_visit_time)); // $promised_visit_time = date('Y-m-d H:i:s', strtotime($promised_visit_time));
} // }
$optional_class_time = $request->param('optional_class_time', ''); $optional_class_time = $request->param('optional_class_time', '');
if ($optional_class_time) { // if ($optional_class_time) {
$optional_class_time = date('Y-m-d H:i:s', strtotime($optional_class_time)); // $optional_class_time = date('Y-m-d H:i:s', strtotime($optional_class_time));
} // }
$personnel = new Personnel(); $personnel = new Personnel();
$role_id = $personnel->alias("a") $role_id = $personnel->alias("a")
->join(['school_campus_person_role' => 'b'], 'a.id = b.person_id', 'left') ->join(['school_campus_person_role' => 'b'], 'a.id = b.person_id', 'left')
@ -143,7 +143,7 @@ class CustomerResources extends BaseApiService
// 获取当前登录人的staff_id // 获取当前登录人的staff_id
$staff_id = $request->param('staff_id', 0); $staff_id = $request->param('staff_id', 0);
$res = (new CustomerResourcesService())->addData($customer_resources_data, $six_speed_data, $student_data, $staff_id, $role_id); $res = (new CustomerResourcesService())->addData($customer_resources_data, $six_speed_data, $student_data, $staff_id, $role_id);
if (!$res['code']) { if (!$res['code']) {
return fail($res['msg']); return fail($res['msg']);
@ -157,15 +157,15 @@ class CustomerResources extends BaseApiService
$customer_resources_id = $request->param('id', '');//客户资源表id $customer_resources_id = $request->param('id', '');//客户资源表id
$promised_visit_time = $request->param('promised_visit_time', ''); $promised_visit_time = $request->param('promised_visit_time', '');
if ($promised_visit_time) { // if ($promised_visit_time) {
$promised_visit_time = date('Y-m-d H:i:s', strtotime($promised_visit_time)); // $promised_visit_time = date('Y-m-d H:i:s', strtotime($promised_visit_time));
} // }
$optional_class_time = $request->param('optional_class_time', ''); $optional_class_time = $request->param('optional_class_time', '');
if ($optional_class_time) { // if ($optional_class_time) {
$optional_class_time = date('Y-m-d H:i:s', strtotime($optional_class_time)); // $optional_class_time = date('Y-m-d H:i:s', strtotime($optional_class_time));
} // }
if (empty($customer_resources_id)) { if (empty($customer_resources_id)) {
@ -291,11 +291,11 @@ class CustomerResources extends BaseApiService
public function getGiftRecordList(Request $request) public function getGiftRecordList(Request $request)
{ {
$resource_id = $request->param('resource_id', ''); $resource_id = $request->param('resource_id', '');
if (empty($resource_id)) { if (empty($resource_id)) {
return fail('缺少客户资源ID'); return fail('缺少客户资源ID');
} }
$res = (new CustomerResourcesService())->getGiftRecordList(['resource_id' => $resource_id]); $res = (new CustomerResourcesService())->getGiftRecordList(['resource_id' => $resource_id]);
if (!$res['code']) { if (!$res['code']) {
return fail($res['msg']); return fail($res['msg']);
@ -307,11 +307,11 @@ class CustomerResources extends BaseApiService
public function getStudentLabel(Request $request) public function getStudentLabel(Request $request)
{ {
$id = $request->param('id', ''); $id = $request->param('id', '');
if (empty($id)) { if (empty($id)) {
return fail('缺少标签ID'); return fail('缺少标签ID');
} }
$res = (new CustomerResourcesService())->getStudentLabel(['label_id' => $id]); $res = (new CustomerResourcesService())->getStudentLabel(['label_id' => $id]);
if (!$res['code']) { if (!$res['code']) {
return fail($res['msg']); return fail($res['msg']);
@ -350,11 +350,11 @@ class CustomerResources extends BaseApiService
{ {
$resource_id = $request->param('resource_id', ''); $resource_id = $request->param('resource_id', '');
$student_id = $request->param('student_id', ''); $student_id = $request->param('student_id', '');
if (empty($resource_id) && empty($student_id)) { if (empty($resource_id) && empty($student_id)) {
return fail('缺少必要参数'); return fail('缺少必要参数');
} }
$where = [ $where = [
'resource_id' => $resource_id, 'resource_id' => $resource_id,
'student_id' => $student_id 'student_id' => $student_id

1
niucloud/app/api/controller/member/Member.php

@ -212,4 +212,5 @@ class Member extends BaseApiController
public function get_classes_list(){ public function get_classes_list(){
return success(( new MemberService() )->get_classes_list()); return success(( new MemberService() )->get_classes_list());
} }
} }

72
niucloud/app/api/controller/student/StudentController.php

@ -9,6 +9,8 @@
namespace app\api\controller\student; namespace app\api\controller\student;
use app\Request;
use app\service\api\apiService\PersonnelService;
use app\service\api\parent\ParentService; use app\service\api\parent\ParentService;
use app\service\api\student\StudentService; use app\service\api\student\StudentService;
use core\base\BaseController; use core\base\BaseController;
@ -29,9 +31,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getStudentList(); $result = $service->getStudentList();
return success($result, '获取学员列表成功'); return success($result, '获取学员列表成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -74,7 +76,7 @@ class StudentController extends BaseController
'list' => $studentList, 'list' => $studentList,
'total' => count($studentList) 'total' => count($studentList)
], '获取学员列表成功'); ], '获取学员列表成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -97,9 +99,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getStudentSummary($data['student_id']); $result = $service->getStudentSummary($data['student_id']);
return success($result, '获取学员概览成功'); return success($result, '获取学员概览成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -122,9 +124,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getStudentInfoWithPhysicalTest($data['student_id']); $result = $service->getStudentInfoWithPhysicalTest($data['student_id']);
return success($result, '获取学员信息成功'); return success($result, '获取学员信息成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -158,9 +160,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->updateStudentInfo($data); $result = $service->updateStudentInfo($data);
return success($result, '更新学员信息成功'); return success($result, '更新学员信息成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -183,9 +185,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->uploadAvatar($data['student_id']); $result = $service->uploadAvatar($data['student_id']);
return success($result, '头像上传成功'); return success($result, '头像上传成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -242,9 +244,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getCourseScheduleList($data); $result = $service->getCourseScheduleList($data);
return success($result, '获取课程安排成功'); return success($result, '获取课程安排成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -267,9 +269,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getCourseScheduleDetail($data['schedule_id']); $result = $service->getCourseScheduleDetail($data['schedule_id']);
return success($result, '获取课程详情成功'); return success($result, '获取课程详情成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -294,9 +296,9 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->requestCourseLeave($data); $result = $service->requestCourseLeave($data);
return success($result, '请假申请成功'); return success($result, '请假申请成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
@ -335,11 +337,41 @@ class StudentController extends BaseController
try { try {
$service = new StudentService(); $service = new StudentService();
$result = $service->getCourseStatistics($data); $result = $service->getCourseStatistics($data);
return success($result, '获取课程统计成功'); return success($result, '获取课程统计成功');
} catch (\Exception $e) { } catch (\Exception $e) {
return fail($e->getMessage()); return fail($e->getMessage());
} }
} }
}
public function is_pass(Request $request){
//获取员工信息
$old_password = $request->param('password','');
if(empty($old_password)){
return fail('请输入旧密码');
}
$res = (new StudentService())->checkMemberOldPwd($old_password);
if(!$res['code']){
return fail('旧密码不正确');
}
return success($res['data']);
}
public function set_pass(Request $request){
$new_password = $request->param('old_password','');
$password = $request->param('password','');
if($new_password != $password){
return fail('二次密码输入不正确');
}
$res = (new StudentService())->updatePassword($new_password);
if(!$res['code']){
return fail('旧密码不正确');
}
return success($res['data']);
}
}

2
niucloud/app/api/route/member.php

@ -131,6 +131,8 @@ Route::group('member', function () {
//员工工资详情 //员工工资详情
Route::get('salary/info/:id', 'member.Salary/info'); Route::get('salary/info/:id', 'member.Salary/info');
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiPersonnelCheckToken::class, true) ->middleware(ApiPersonnelCheckToken::class, true)
->middleware(ApiLog::class); ->middleware(ApiLog::class);

4
niucloud/app/api/route/student.php

@ -35,6 +35,10 @@ Route::group('student', function () {
Route::get('contract/download', 'student.StudentContract/downloadContract'); Route::get('contract/download', 'student.StudentContract/downloadContract');
Route::get('contract/download-file', 'student.StudentContract/downloadFile'); Route::get('contract/download-file', 'student.StudentContract/downloadFile');
Route::get('student-info', 'student.StudentContract/getStudentInfo'); Route::get('student-info', 'student.StudentContract/getStudentInfo');
Route::post('is_pass', 'app\api\controller\student\StudentController@is_pass');
Route::post('set_pass', 'app\api\controller\student\StudentController@set_pass');
})->middleware(['ApiCheckToken']); })->middleware(['ApiCheckToken']);
// 体测数据管理 // 体测数据管理

14
niucloud/app/listener/personnel/Student.php

@ -49,13 +49,17 @@ class Student
$studentCourses = new StudentCourses(); $studentCourses = new StudentCourses();
$student_course_usage = new StudentCourseUsage(); $student_course_usage = new StudentCourseUsage();
$schedule_info = $courseSchedule->where(['id' => $data['schedule_id']])->find(); $schedule_info = $courseSchedule->where(['id' => $data['schedule_id']])->find();
$studentCourses_info = $studentCourses->where(['student_id' => $data['student_id'], 'course_id' => $schedule_info['course_id']])->find(); $studentCourses_info = $studentCourses->where(['student_id' => $data['student_id'], 'course_id' => $schedule_info['course_id']])->find();
$student_course_usage->insert([ if($studentCourses_info){
'student_course_id' => $studentCourses_info['id'], $student_course_usage->insert([
'used_hours' => $studentCourses_info['single_session_count'], 'student_course_id' => $studentCourses_info['id'],
'usage_date' => date("Y-m-d") 'used_hours' => $studentCourses_info['single_session_count'],
]); 'usage_date' => date("Y-m-d")
]);
}
} }

6
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -232,7 +232,7 @@ class CustomerResourcesService extends BaseAdminService
$personnel = new Personnel(); $personnel = new Personnel();
$data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id"); $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['consultant']){ if(!$data['consultant']){
return fail("操作失败"); return fail("超级管理员不允许修改资源");
} }
if ($this->model->where([ if ($this->model->where([
@ -685,11 +685,11 @@ class CustomerResourcesService extends BaseAdminService
if (empty($data['resource_id'])) { if (empty($data['resource_id'])) {
return []; return [];
} }
// 使用API服务层的方法 // 使用API服务层的方法
$api_service = new \app\service\api\apiService\CustomerResourcesService(); $api_service = new \app\service\api\apiService\CustomerResourcesService();
$result = $api_service->getGiftRecordList(['resource_id' => $data['resource_id']]); $result = $api_service->getGiftRecordList(['resource_id' => $data['resource_id']]);
if ($result['code']) { if ($result['code']) {
return $result['data']; return $result['data'];
} else { } else {

13
niucloud/app/service/admin/person_course_schedule/PersonCourseScheduleService.php

@ -236,4 +236,17 @@ class PersonCourseScheduleService extends BaseAdminService
$customerResourcesModel = new CustomerResources(); $customerResourcesModel = new CustomerResources();
return $customerResourcesModel->select()->toArray(); return $customerResourcesModel->select()->toArray();
} }
public function xk(int $id)
{
$data = $this->model->where([['id', '=', $id]])->find()->toArray();
event('Student', [
'event_type' => 'xiaoke',
'data' => $data
]);
return true;
}
} }

4
niucloud/app/service/admin/physical_test/PhysicalTestService.php

@ -39,7 +39,7 @@ class PhysicalTestService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run,physical_test_report'; $field = '*';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["resource_id","student_id"], $where)->with(['customerResources','student','personnel'])->field($field)->order($order); $search_model = $this->model->withSearch(["resource_id","student_id"], $where)->with(['customerResources','student','personnel'])->field($field)->order($order);
@ -55,7 +55,7 @@ class PhysicalTestService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,resource_id,student_id,height,weight,coach_id,created_at,updated_at,seated_forward_bend,sit_ups,push_ups,flamingo_balance,thirty_sec_jump,standing_long_jump,agility_run,balance_beam,tennis_throw,ten_meter_shuttle_run,physical_test_report'; $field = '*';
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','student','personnel'])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','student','personnel'])->findOrEmpty()->toArray();
return $info; return $info;

88
niucloud/app/service/api/apiService/PersonnelService.php

@ -12,6 +12,7 @@
namespace app\service\api\apiService; namespace app\service\api\apiService;
use app\model\campus_person_role\CampusPersonRole; use app\model\campus_person_role\CampusPersonRole;
use app\model\customer_resources\CustomerResources;
use app\model\departments\Departments; use app\model\departments\Departments;
use app\model\member\Member; use app\model\member\Member;
use app\model\personnel\Personnel; use app\model\personnel\Personnel;
@ -263,6 +264,9 @@ class PersonnelService extends BaseApiService
return $res; return $res;
} }
//设置新密码 //设置新密码
public function edidPassword($phone, $new_password, $key_value) public function edidPassword($phone, $new_password, $key_value)
{ {
@ -445,9 +449,9 @@ class PersonnelService extends BaseApiService
} }
// 检查是否使用审批流程 // 检查是否使用审批流程
if (isset($data['use_approval']) && $data['use_approval'] && if (isset($data['use_approval']) && $data['use_approval'] &&
isset($data['approval_config_id']) && $data['approval_config_id'] > 0) { isset($data['approval_config_id']) && $data['approval_config_id'] > 0) {
// 启动审批流程 // 启动审批流程
$approvalService = new \app\service\school_approval\SchoolApprovalProcessService(); $approvalService = new \app\service\school_approval\SchoolApprovalProcessService();
$processData = [ $processData = [
@ -638,7 +642,7 @@ class PersonnelService extends BaseApiService
{ {
$prefix = 'EMP'; $prefix = 'EMP';
$date = date('Ymd'); $date = date('Ymd');
// 查询今天已生成的最大编号 // 查询今天已生成的最大编号
$maxNumber = $this->model $maxNumber = $this->model
->where('employee_number', 'like', $prefix . $date . '%') ->where('employee_number', 'like', $prefix . $date . '%')
@ -736,7 +740,7 @@ class PersonnelService extends BaseApiService
$roleNameStr = implode(',', $roleNames); $roleNameStr = implode(',', $roleNames);
$roleKeyStr = implode(',', $roleKeys); $roleKeyStr = implode(',', $roleKeys);
// 根据角色名称分类 // 根据角色名称分类
$personnelData = [ $personnelData = [
'id' => $personnel['person_id'], 'id' => $personnel['person_id'],
@ -752,35 +756,35 @@ class PersonnelService extends BaseApiService
$isCoach = false; $isCoach = false;
$isEducation = false; $isEducation = false;
$isAssistant = false; $isAssistant = false;
// 检查是否为教练类角色 // 检查是否为教练类角色
if (stripos($roleNameStr, '教练') !== false || if (stripos($roleNameStr, '教练') !== false ||
stripos($roleNameStr, '教师') !== false || stripos($roleNameStr, '教师') !== false ||
stripos($roleNameStr, '主教') !== false || stripos($roleNameStr, '主教') !== false ||
stripos($roleKeyStr, 'coach') !== false || stripos($roleKeyStr, 'coach') !== false ||
stripos($roleKeyStr, 'teacher') !== false) { stripos($roleKeyStr, 'teacher') !== false) {
$isCoach = true; $isCoach = true;
} }
// 检查是否为教务类角色 // 检查是否为教务类角色
if (stripos($roleNameStr, '教务') !== false || if (stripos($roleNameStr, '教务') !== false ||
stripos($roleKeyStr, 'education') !== false || stripos($roleKeyStr, 'education') !== false ||
stripos($roleKeyStr, 'academic') !== false) { stripos($roleKeyStr, 'academic') !== false) {
$isEducation = true; $isEducation = true;
} }
// 检查是否为助教类角色 // 检查是否为助教类角色
if (stripos($roleNameStr, '助教') !== false || if (stripos($roleNameStr, '助教') !== false ||
stripos($roleNameStr, '助理') !== false || stripos($roleNameStr, '助理') !== false ||
stripos($roleKeyStr, 'assistant') !== false) { stripos($roleKeyStr, 'assistant') !== false) {
$isAssistant = true; $isAssistant = true;
} }
// 如果没有明确的角色分类,则作为通用人员添加到所有列表 // 如果没有明确的角色分类,则作为通用人员添加到所有列表
if (!$isCoach && !$isEducation && !$isAssistant) { if (!$isCoach && !$isEducation && !$isAssistant) {
$isCoach = $isEducation = $isAssistant = true; $isCoach = $isEducation = $isAssistant = true;
} }
// 根据分类结果添加到对应列表 // 根据分类结果添加到对应列表
if ($isCoach) { if ($isCoach) {
$coachList[] = $personnelData; $coachList[] = $personnelData;
@ -820,10 +824,10 @@ class PersonnelService extends BaseApiService
{ {
try { try {
$where = []; $where = [];
// 查询条件:dept_id=2(教练部门) // 查询条件:dept_id=2(教练部门)
$campusPersonWhere = ['dept_id' => 2]; $campusPersonWhere = ['dept_id' => 2];
// 校区筛选 // 校区筛选
if (!empty($data['campus_id'])) { if (!empty($data['campus_id'])) {
$campusPersonWhere['campus_id'] = $data['campus_id']; $campusPersonWhere['campus_id'] = $data['campus_id'];
@ -837,7 +841,7 @@ class PersonnelService extends BaseApiService
// 查询符合条件的教练人员ID // 查询符合条件的教练人员ID
$coachPersonIds = CampusPersonRole::where($campusPersonWhere) $coachPersonIds = CampusPersonRole::where($campusPersonWhere)
->column('person_id'); ->column('person_id');
if (empty($coachPersonIds)) { if (empty($coachPersonIds)) {
return [ return [
'code' => 1, 'code' => 1,
@ -845,36 +849,36 @@ class PersonnelService extends BaseApiService
'data' => [] 'data' => []
]; ];
} }
// 构建人员表查询条件 // 构建人员表查询条件
$where[] = ['id', 'in', $coachPersonIds]; $where[] = ['id', 'in', $coachPersonIds];
// 姓名关键词搜索 // 姓名关键词搜索
if (!empty($data['keyword'])) { if (!empty($data['keyword'])) {
$where[] = ['name', 'like', '%' . $data['keyword'] . '%']; $where[] = ['name', 'like', '%' . $data['keyword'] . '%'];
} }
// 状态筛选,默认获取有效教练 // 状态筛选,默认获取有效教练
if (isset($data['status'])) { if (isset($data['status'])) {
$where[] = ['status', '=', $data['status']]; $where[] = ['status', '=', $data['status']];
} }
// 只获取未逻辑删除的教练 // 只获取未逻辑删除的教练
$where[] = ['deleted_at', '=', 0]; $where[] = ['deleted_at', '=', 0];
$coachList = $this->model $coachList = $this->model
->where($where) ->where($where)
->field('id, name, head_img, phone, employee_number') ->field('id, name, head_img, phone, employee_number')
->order('create_time DESC') ->order('create_time DESC')
->select() ->select()
->toArray(); ->toArray();
return [ return [
'code' => 1, 'code' => 1,
'msg' => '获取成功', 'msg' => '获取成功',
'data' => $coachList 'data' => $coachList
]; ];
} catch (\Exception $e) { } catch (\Exception $e) {
return [ return [
'code' => 0, 'code' => 0,
@ -920,30 +924,30 @@ class PersonnelService extends BaseApiService
{ {
try { try {
$where = []; $where = [];
// 查询销售部门(dept_id=3)下的所有角色ID // 查询销售部门(dept_id=3)下的所有角色ID
// $salesRoleIds = SysRole::where('dept_id', 3) $salesRoleIds = SysRole::where('dept_id', 3)
// ->where('status', 1) ->where('status', 1)
// ->column('role_id'); ->column('role_id');
//
// if (empty($salesRoleIds)) { if (empty($salesRoleIds)) {
// return [ return [
// 'code' => 1, 'code' => 1,
// 'msg' => '暂无销售部门角色', 'msg' => '暂无销售部门角色',
// 'data' => [] 'data' => []
// ]; ];
// } }
//
// // 构建校区人员角色关系查询条件 // 构建校区人员角色关系查询条件
// $campusPersonWhere = [ $campusPersonWhere = [
// ['role_id', 'in', $salesRoleIds] ['role_id', 'in', $salesRoleIds]
// ]; ];
// 根据传入的校区进行筛选 // 根据传入的校区进行筛选
if (!empty($campus)) { if (!empty($campus)) {
$campusPersonWhere[] = ['campus_id', '=', $campus]; $campusPersonWhere[] = ['campus_id', '=', $campus];
} }
// 查询符合条件的销售人员ID // 查询符合条件的销售人员ID
$salesPersonIds = CampusPersonRole::where($campusPersonWhere) $salesPersonIds = CampusPersonRole::where($campusPersonWhere)
->column('person_id'); ->column('person_id');
@ -955,7 +959,7 @@ class PersonnelService extends BaseApiService
'data' => [] 'data' => []
]; ];
} }
// 从personnel表中获取人员信息,包含姓名和电话 // 从personnel表中获取人员信息,包含姓名和电话
$salesPersonnel = $this->model $salesPersonnel = $this->model
->whereIn('id', $salesPersonIds) ->whereIn('id', $salesPersonIds)
@ -964,13 +968,13 @@ class PersonnelService extends BaseApiService
->order('create_time DESC') ->order('create_time DESC')
->select() ->select()
->toArray(); ->toArray();
return [ return [
'code' => 1, 'code' => 1,
'msg' => '获取成功', 'msg' => '获取成功',
'data' => $salesPersonnel 'data' => $salesPersonnel
]; ];
} catch (\Exception $e) { } catch (\Exception $e) {
return [ return [
'code' => 0, 'code' => 0,

32
niucloud/app/service/api/member/MemberService.php

@ -378,7 +378,7 @@ class MemberService extends BaseApiService
{ {
// 添加调试日志 // 添加调试日志
Log::debug('MemberService/student_list - 接收参数: ' . json_encode($data)); Log::debug('MemberService/student_list - 接收参数: ' . json_encode($data));
// 创建查询构建器 // 创建查询构建器
$student_courses = new StudentCourses(); $student_courses = new StudentCourses();
$query = $student_courses $query = $student_courses
@ -389,22 +389,22 @@ class MemberService extends BaseApiService
->join(['school_member' => 'f'],'f.member_id = e.member_id',"left") ->join(['school_member' => 'f'],'f.member_id = e.member_id',"left")
->join(['school_resource_sharing' => 'g'],'g.resource_id = e.id',"left") ->join(['school_resource_sharing' => 'g'],'g.resource_id = e.id',"left")
->where("a.main_coach_id = {$this->member_id} OR a.education_id = {$this->member_id} OR find_in_set('{$this->member_id}', a.assistant_ids) "); ->where("a.main_coach_id = {$this->member_id} OR a.education_id = {$this->member_id} OR find_in_set('{$this->member_id}', a.assistant_ids) ");
// 基础条件:到期时间筛选 // 基础条件:到期时间筛选
if(isset($data['type']) && $data['type'] == "daoqi"){ if(isset($data['type']) && $data['type'] == "daoqi"){
$query->where('a.end_date', 'between', [date('Y-m-d', strtotime('-6 days')), date('Y-m-d')]); $query->where('a.end_date', 'between', [date('Y-m-d', strtotime('-6 days')), date('Y-m-d')]);
} }
// 处理课时数量查询 (gift_hours + total_hours - use_total_hours - use_gift_hours = lessonCount) // 处理课时数量查询 (gift_hours + total_hours - use_total_hours - use_gift_hours = lessonCount)
if (!empty($data['lessonCount'])) { if (!empty($data['lessonCount'])) {
$query->whereRaw("(a.gift_hours + a.total_hours - a.use_total_hours - a.use_gift_hours) = {$data['lessonCount']}"); $query->whereRaw("(a.gift_hours + a.total_hours - a.use_total_hours - a.use_gift_hours) = {$data['lessonCount']}");
} }
// 处理课程ID查询 // 处理课程ID查询
if (!empty($data['courseId']) && $data['courseId'] !== 'null') { if (!empty($data['courseId']) && $data['courseId'] !== 'null') {
$query->where('a.course_id', '=', $data['courseId']); $query->where('a.course_id', '=', $data['courseId']);
} }
// 处理姓名查询(模糊匹配) // 处理姓名查询(模糊匹配)
if (!empty($data['name'])) { if (!empty($data['name'])) {
Log::debug('MemberService/student_list - 添加姓名查询条件: ' . $data['name']); Log::debug('MemberService/student_list - 添加姓名查询条件: ' . $data['name']);
@ -412,15 +412,15 @@ class MemberService extends BaseApiService
Log::debug('MemberService/student_list - 姓名匹配模式: ' . $namePattern); Log::debug('MemberService/student_list - 姓名匹配模式: ' . $namePattern);
$query->where('e.name', 'like', $namePattern); $query->where('e.name', 'like', $namePattern);
} }
// 处理手机号查询(模糊匹配) // 处理手机号查询(模糊匹配)
if (!empty($data['phone'])) { if (!empty($data['phone'])) {
Log::debug('MemberService/student_list - 添加手机号查询条件: ' . $data['phone']); Log::debug('MemberService/student_list - 添加手机号查询条件: ' . $data['phone']);
$phonePattern = '%' . $data['phone'] . '%'; $phonePattern = '%' . $data['phone'] . '%';
Log::debug('MemberService/student_list - 手机号匹配模式: ' . $phonePattern); Log::debug('MemberService/student_list - 手机号匹配模式: ' . $phonePattern);
$query->where('e.phone_number', 'like', $phonePattern); $query->where('e.phone_number', 'like', $phonePattern);
} }
// 处理请假次数查询 // 处理请假次数查询
if (!empty($data['leaveCount'])) { if (!empty($data['leaveCount'])) {
$person_course_schedule = new PersonCourseSchedule(); $person_course_schedule = new PersonCourseSchedule();
@ -430,35 +430,35 @@ class MemberService extends BaseApiService
->group('resources_id') ->group('resources_id')
->having("COUNT(*) = {$data['leaveCount']}") ->having("COUNT(*) = {$data['leaveCount']}")
->column('resources_id'); ->column('resources_id');
if (empty($leave_resource_ids)) { if (empty($leave_resource_ids)) {
// 如果没有满足请假次数的资源,返回空结果 // 如果没有满足请假次数的资源,返回空结果
Log::debug('MemberService/student_list - 没有满足请假次数的资源,返回空结果'); Log::debug('MemberService/student_list - 没有满足请假次数的资源,返回空结果');
return []; return [];
} }
$query->where('e.id', 'in', $leave_resource_ids); $query->where('e.id', 'in', $leave_resource_ids);
} }
// 处理班级ID查询 // 处理班级ID查询
if (!empty($data['classId']) && $data['classId'] !== 'null') { if (!empty($data['classId']) && $data['classId'] !== 'null') {
$class_resources_rel = new ClassResourcesRel(); $class_resources_rel = new ClassResourcesRel();
$class_resource_ids = $class_resources_rel $class_resource_ids = $class_resources_rel
->where(['class_id' => $data['classId']]) ->where(['class_id' => $data['classId']])
->column('resource_id'); ->column('resource_id');
if (empty($class_resource_ids)) { if (empty($class_resource_ids)) {
// 如果班级下没有资源,返回空结果 // 如果班级下没有资源,返回空结果
Log::debug('MemberService/student_list - 班级下没有资源,返回空结果'); Log::debug('MemberService/student_list - 班级下没有资源,返回空结果');
return []; return [];
} }
$query->where('e.id', 'in', $class_resource_ids); $query->where('e.id', 'in', $class_resource_ids);
} }
// 记录生成的SQL(仅用于调试) // 记录生成的SQL(仅用于调试)
Log::debug('MemberService/student_list - SQL: ' . $query->buildSql()); Log::debug('MemberService/student_list - SQL: ' . $query->buildSql());
$list = $query->field(" $list = $query->field("
b.id,e.name,c.campus_name as campus, b.id,e.name,c.campus_name as campus,
a.total_hours,a.gift_hours,a.use_total_hours,a.use_gift_hours,a.end_date,f.headimg as avatar,g.id as resource_sharing_id, a.total_hours,a.gift_hours,a.use_total_hours,a.use_gift_hours,a.end_date,f.headimg as avatar,g.id as resource_sharing_id,
@ -468,7 +468,7 @@ class MemberService extends BaseApiService
$result = $list ? $list->toArray() : []; $result = $list ? $list->toArray() : [];
Log::debug('MemberService/student_list - 查询结果数量: ' . count($result)); Log::debug('MemberService/student_list - 查询结果数量: ' . count($result));
return $result; return $result;
} }

196
niucloud/app/service/api/student/StudentService.php

@ -9,6 +9,8 @@ use app\model\customer_resources\CustomerResources;
use app\model\student\Student; use app\model\student\Student;
use app\model\member\Member; use app\model\member\Member;
use app\model\student_label\StudentLabel; use app\model\student_label\StudentLabel;
use app\model\sys\SysUser;
use think\facade\Cache;
use think\facade\Db; use think\facade\Db;
use core\base\BaseService; use core\base\BaseService;
use core\exception\CommonException; use core\exception\CommonException;
@ -26,7 +28,7 @@ class StudentService extends BaseService
{ {
// 获取当前登录用户ID // 获取当前登录用户ID
$customerId = $this->getUserId(); $customerId = $this->getUserId();
// 通过客户资源表获取user_id // 通过客户资源表获取user_id
$customerResource = (new CustomerResources())->where('id', $customerId)->find(); $customerResource = (new CustomerResources())->where('id', $customerId)->find();
if (!$customerResource) { if (!$customerResource) {
@ -46,10 +48,10 @@ class StudentService extends BaseService
$student['age'] = $this->calculateAge($student['birthday']); $student['age'] = $this->calculateAge($student['birthday']);
$student['gender_text'] = $student['gender'] == 1 ? '男' : '女'; $student['gender_text'] = $student['gender'] == 1 ? '男' : '女';
$student['headimg'] = $student['headimg'] ? get_image_url($student['headimg']) : ''; $student['headimg'] = $student['headimg'] ? get_image_url($student['headimg']) : '';
// 添加student_id字段,确保前端能正确获取学员ID // 添加student_id字段,确保前端能正确获取学员ID
$student['student_id'] = $student['id']; $student['student_id'] = $student['id'];
// 获取学员课时统计信息 // 获取学员课时统计信息
$courseStats = $this->getStudentCourseStats($student['id']); $courseStats = $this->getStudentCourseStats($student['id']);
$student['course_stats'] = $courseStats; $student['course_stats'] = $courseStats;
@ -85,11 +87,11 @@ class StudentService extends BaseService
// 获取课程统计信息 // 获取课程统计信息
$courseStats = $this->getStudentCourseStats($studentId); $courseStats = $this->getStudentCourseStats($studentId);
// 获取预约资格信息 // 获取预约资格信息
$bookingService = new \app\service\api\student\CourseBookingService(); $bookingService = new \app\service\api\student\CourseBookingService();
$qualification = $bookingService->checkStudentQualification($studentId); $qualification = $bookingService->checkStudentQualification($studentId);
return [ return [
'student_id' => $student['id'], 'student_id' => $student['id'],
'name' => $student['name'], 'name' => $student['name'],
@ -134,10 +136,10 @@ class StudentService extends BaseService
} }
$studentData = $student->toArray(); $studentData = $student->toArray();
// 处理图片URL // 处理图片URL
$studentData['headimg'] = $studentData['headimg'] ? get_image_url($studentData['headimg']) : ''; $studentData['headimg'] = $studentData['headimg'] ? get_image_url($studentData['headimg']) : '';
// 计算年龄 // 计算年龄
$studentData['age'] = $this->calculateAge($studentData['birthday']); $studentData['age'] = $this->calculateAge($studentData['birthday']);
$studentData['gender_text'] = $studentData['gender'] == 1 ? '男' : '女'; $studentData['gender_text'] = $studentData['gender'] == 1 ? '男' : '女';
@ -208,7 +210,7 @@ class StudentService extends BaseService
public function updateStudentInfo($data) public function updateStudentInfo($data)
{ {
$studentId = $data['student_id']; $studentId = $data['student_id'];
// 验证学员权限 // 验证学员权限
$this->checkStudentPermission($studentId); $this->checkStudentPermission($studentId);
@ -217,7 +219,7 @@ class StudentService extends BaseService
->where('id', $studentId) ->where('id', $studentId)
->where('deleted_at', 0) ->where('deleted_at', 0)
->find(); ->find();
if (!$student) { if (!$student) {
throw new CommonException('学员信息不存在'); throw new CommonException('学员信息不存在');
} }
@ -225,7 +227,7 @@ class StudentService extends BaseService
// 允许更新的字段 // 允许更新的字段
$allowedFields = ['name', 'gender', 'birthday', 'emergency_contact', 'contact_phone', 'note', 'headimg']; $allowedFields = ['name', 'gender', 'birthday', 'emergency_contact', 'contact_phone', 'note', 'headimg'];
$updateData = []; $updateData = [];
foreach ($allowedFields as $field) { foreach ($allowedFields as $field) {
if (isset($data[$field]) && $data[$field] !== '') { if (isset($data[$field]) && $data[$field] !== '') {
$updateData[$field] = $data[$field]; $updateData[$field] = $data[$field];
@ -244,7 +246,7 @@ class StudentService extends BaseService
$result = Db::table('school_student') $result = Db::table('school_student')
->where('id', $studentId) ->where('id', $studentId)
->update($updateData); ->update($updateData);
if ($result === false) { if ($result === false) {
throw new CommonException('更新学员信息失败'); throw new CommonException('更新学员信息失败');
} }
@ -317,17 +319,17 @@ class StudentService extends BaseService
private function calculateAge($birthday) private function calculateAge($birthday)
{ {
if (!$birthday) return 0; if (!$birthday) return 0;
$birthTime = strtotime($birthday); $birthTime = strtotime($birthday);
if (!$birthTime) return 0; if (!$birthTime) return 0;
$age = date('Y') - date('Y', $birthTime); $age = date('Y') - date('Y', $birthTime);
// 如果还没过生日,年龄减1 // 如果还没过生日,年龄减1
if (date('md') < date('md', $birthTime)) { if (date('md') < date('md', $birthTime)) {
$age--; $age--;
} }
return max(0, $age); return max(0, $age);
} }
@ -339,18 +341,18 @@ class StudentService extends BaseService
private function calculateAgeFromBirthday($birthday) private function calculateAgeFromBirthday($birthday)
{ {
if (!$birthday) return 0; if (!$birthday) return 0;
$birthTime = strtotime($birthday); $birthTime = strtotime($birthday);
if (!$birthTime) return 0; if (!$birthTime) return 0;
$today = new \DateTime(); $today = new \DateTime();
$birthDate = new \DateTime($birthday); $birthDate = new \DateTime($birthday);
$interval = $today->diff($birthDate); $interval = $today->diff($birthDate);
$years = $interval->y; $years = $interval->y;
$months = $interval->m; $months = $interval->m;
// 将月份转换为小数,如3岁11个月 = 3.11 // 将月份转换为小数,如3岁11个月 = 3.11
return $years + ($months / 100); return $years + ($months / 100);
} }
@ -363,7 +365,7 @@ class StudentService extends BaseService
public function addChild($data) public function addChild($data)
{ {
$customerId = $this->getUserId(); $customerId = $this->getUserId();
// 创建学员数据 // 创建学员数据
$studentData = [ $studentData = [
'user_id' => $customerId, 'user_id' => $customerId,
@ -383,7 +385,7 @@ class StudentService extends BaseService
try { try {
// 插入学员数据 // 插入学员数据
$studentId = Db::table('school_student')->insertGetId($studentData); $studentId = Db::table('school_student')->insertGetId($studentData);
if (!$studentId) { if (!$studentId) {
throw new CommonException('添加孩子失败'); throw new CommonException('添加孩子失败');
} }
@ -394,7 +396,7 @@ class StudentService extends BaseService
'gender_text' => $data['gender'] == 1 ? '男' : '女', 'gender_text' => $data['gender'] == 1 ? '男' : '女',
'age' => $this->calculateAge($data['birthday']) 'age' => $this->calculateAge($data['birthday'])
]; ];
} catch (\Exception $e) { } catch (\Exception $e) {
throw new CommonException('添加孩子失败:' . $e->getMessage()); throw new CommonException('添加孩子失败:' . $e->getMessage());
} }
@ -414,22 +416,22 @@ class StudentService extends BaseService
['pcs.deleted_at', '=', 0], ['pcs.deleted_at', '=', 0],
['cs.deleted_at', '=', 0] ['cs.deleted_at', '=', 0]
]; ];
// 日期筛选 // 日期筛选
if (!empty($params['date'])) { if (!empty($params['date'])) {
$where[] = ['cs.course_date', '=', $params['date']]; $where[] = ['cs.course_date', '=', $params['date']];
} }
// 日期范围筛选 // 日期范围筛选
if (!empty($params['start_date']) && !empty($params['end_date'])) { if (!empty($params['start_date']) && !empty($params['end_date'])) {
$where[] = ['cs.course_date', 'between', [$params['start_date'], $params['end_date']]]; $where[] = ['cs.course_date', 'between', [$params['start_date'], $params['end_date']]];
} }
// 状态筛选 // 状态筛选
if (isset($params['status']) && $params['status'] !== '') { if (isset($params['status']) && $params['status'] !== '') {
$where[] = ['pcs.status', '=', $params['status']]; $where[] = ['pcs.status', '=', $params['status']];
} }
// 查询课程安排数据,联合两个表 // 查询课程安排数据,联合两个表
$scheduleList = Db::table('school_person_course_schedule pcs') $scheduleList = Db::table('school_person_course_schedule pcs')
->leftJoin('school_course_schedule cs', 'pcs.schedule_id = cs.id') ->leftJoin('school_course_schedule cs', 'pcs.schedule_id = cs.id')
@ -464,12 +466,12 @@ class StudentService extends BaseService
->order('cs.course_date desc, cs.start_time desc') ->order('cs.course_date desc, cs.start_time desc')
->select() ->select()
->toArray(); ->toArray();
// 处理数据格式 // 处理数据格式
foreach ($scheduleList as &$schedule) { foreach ($scheduleList as &$schedule) {
// 状态处理 // 状态处理
$schedule['status_text'] = $this->getScheduleStatusText($schedule['status']); $schedule['status_text'] = $this->getScheduleStatusText($schedule['status']);
// 时间处理 // 时间处理
if (!$schedule['start_time'] || !$schedule['end_time']) { if (!$schedule['start_time'] || !$schedule['end_time']) {
// 如果没有具体时间,从time_slot中解析 // 如果没有具体时间,从time_slot中解析
@ -478,20 +480,20 @@ class StudentService extends BaseService
$schedule['start_time'] = $times[0] ?? '09:00'; $schedule['start_time'] = $times[0] ?? '09:00';
$schedule['end_time'] = $times[1] ?? '10:00'; $schedule['end_time'] = $times[1] ?? '10:00';
} }
$schedule['time_slot'] = $schedule['start_time'] . '-' . $schedule['end_time']; $schedule['time_slot'] = $schedule['start_time'] . '-' . $schedule['end_time'];
$schedule['duration'] = $schedule['duration'] ?: 60; $schedule['duration'] = $schedule['duration'] ?: 60;
// 准备事项(模拟数据,实际可从课程信息中获取) // 准备事项(模拟数据,实际可从课程信息中获取)
$schedule['preparation_items'] = $this->getCoursePreparationItems($schedule['course_name']); $schedule['preparation_items'] = $this->getCoursePreparationItems($schedule['course_name']);
} }
return [ return [
'list' => $scheduleList, 'list' => $scheduleList,
'total' => count($scheduleList) 'total' => count($scheduleList)
]; ];
} }
/** /**
* 获取课程安排详情 * 获取课程安排详情
* @param int $scheduleId * @param int $scheduleId
@ -536,23 +538,23 @@ class StudentService extends BaseService
TIMESTAMPDIFF(MINUTE, cs.start_time, cs.end_time) as duration TIMESTAMPDIFF(MINUTE, cs.start_time, cs.end_time) as duration
') ')
->find(); ->find();
if (!$schedule) { if (!$schedule) {
throw new CommonException('课程安排不存在'); throw new CommonException('课程安排不存在');
} }
// 验证权限 // 验证权限
$this->checkStudentPermission($schedule['student_id']); $this->checkStudentPermission($schedule['student_id']);
// 处理数据格式 // 处理数据格式
$schedule['status_text'] = $this->getScheduleStatusText($schedule['status']); $schedule['status_text'] = $this->getScheduleStatusText($schedule['status']);
$schedule['time_slot'] = $schedule['start_time'] . '-' . $schedule['end_time']; $schedule['time_slot'] = $schedule['start_time'] . '-' . $schedule['end_time'];
$schedule['duration'] = $schedule['duration'] ?: 60; $schedule['duration'] = $schedule['duration'] ?: 60;
$schedule['preparation_items'] = $this->getCoursePreparationItems($schedule['course_name']); $schedule['preparation_items'] = $this->getCoursePreparationItems($schedule['course_name']);
return $schedule; return $schedule;
} }
/** /**
* 申请课程请假 * 申请课程请假
* @param array $data * @param array $data
@ -562,41 +564,41 @@ class StudentService extends BaseService
{ {
$scheduleId = $data['schedule_id']; $scheduleId = $data['schedule_id'];
$reason = $data['reason'] ?? ''; $reason = $data['reason'] ?? '';
// 查询课程安排 // 查询课程安排
$schedule = Db::table('school_person_course_schedule') $schedule = Db::table('school_person_course_schedule')
->where('id', $scheduleId) ->where('id', $scheduleId)
->where('deleted_at', 0) ->where('deleted_at', 0)
->find(); ->find();
if (!$schedule) { if (!$schedule) {
throw new CommonException('课程安排不存在'); throw new CommonException('课程安排不存在');
} }
// 验证权限 // 验证权限
$this->checkStudentPermission($schedule['student_id']); $this->checkStudentPermission($schedule['student_id']);
// 检查课程状态 // 检查课程状态
if ($schedule['status'] != 0) { // 0-待上课 if ($schedule['status'] != 0) { // 0-待上课
throw new CommonException('当前课程状态不允许请假'); throw new CommonException('当前课程状态不允许请假');
} }
// 获取对应的课程安排信息来检查时间 // 获取对应的课程安排信息来检查时间
$courseSchedule = Db::table('school_course_schedule') $courseSchedule = Db::table('school_course_schedule')
->where('id', $schedule['schedule_id']) ->where('id', $schedule['schedule_id'])
->find(); ->find();
if ($courseSchedule) { if ($courseSchedule) {
// 检查请假时间限制(上课前6小时) // 检查请假时间限制(上课前6小时)
$courseDateTime = $courseSchedule['course_date'] . ' ' . $courseSchedule['start_time']; $courseDateTime = $courseSchedule['course_date'] . ' ' . $courseSchedule['start_time'];
$courseTimestamp = strtotime($courseDateTime); $courseTimestamp = strtotime($courseDateTime);
$currentTimestamp = time(); $currentTimestamp = time();
if ($courseTimestamp - $currentTimestamp < 6 * 3600) { if ($courseTimestamp - $currentTimestamp < 6 * 3600) {
throw new CommonException('上课前6小时内不允许请假'); throw new CommonException('上课前6小时内不允许请假');
} }
} }
// 更新状态为请假 // 更新状态为请假
$result = Db::table('school_person_course_schedule') $result = Db::table('school_person_course_schedule')
->where('id', $scheduleId) ->where('id', $scheduleId)
@ -605,16 +607,16 @@ class StudentService extends BaseService
'cancel_reason' => $reason, 'cancel_reason' => $reason,
'updated_at' => date('Y-m-d H:i:s') 'updated_at' => date('Y-m-d H:i:s')
]); ]);
if ($result === false) { if ($result === false) {
throw new CommonException('请假申请失败'); throw new CommonException('请假申请失败');
} }
// TODO: 发送消息通知相关人员 // TODO: 发送消息通知相关人员
return true; return true;
} }
/** /**
* 获取课程状态文本 * 获取课程状态文本
* @param int $status * @param int $status
@ -624,14 +626,14 @@ class StudentService extends BaseService
{ {
$statusMap = [ $statusMap = [
0 => '待上课', 0 => '待上课',
1 => '已完成', 1 => '已完成',
2 => '请假', 2 => '请假',
3 => '取消' 3 => '取消'
]; ];
return $statusMap[$status] ?? '未知状态'; return $statusMap[$status] ?? '未知状态';
} }
/** /**
* 获取课程准备事项 * 获取课程准备事项
* @param string $courseName * @param string $courseName
@ -650,7 +652,7 @@ class StudentService extends BaseService
'儿童游泳' => ['泳衣', '泳帽', '游泳镜', '毛巾'], '儿童游泳' => ['泳衣', '泳帽', '游泳镜', '毛巾'],
'暑季特训营' => ['运动服装', '防晒用品', '充足水分', '能量补充食品'] '暑季特训营' => ['运动服装', '防晒用品', '充足水分', '能量补充食品']
]; ];
return $preparationMap[$courseName] ?? ['运动服装', '运动鞋', '毛巾', '水杯']; return $preparationMap[$courseName] ?? ['运动服装', '运动鞋', '毛巾', '水杯'];
} }
@ -689,10 +691,10 @@ class StudentService extends BaseService
// 有效课程 = total_hours + gift_hours // 有效课程 = total_hours + gift_hours
$totalValidHours = $totalHours + $giftHours; $totalValidHours = $totalHours + $giftHours;
// 已使用 = use_total_hours + use_gift_hours // 已使用 = use_total_hours + use_gift_hours
$usedHours = $useTotalHours + $useGiftHours; $usedHours = $useTotalHours + $useGiftHours;
// 剩余课时数 = total_hours + gift_hours - use_total_hours - use_gift_hours // 剩余课时数 = total_hours + gift_hours - use_total_hours - use_gift_hours
$remainingHours = $totalValidHours - $usedHours; $remainingHours = $totalValidHours - $usedHours;
@ -714,7 +716,7 @@ class StudentService extends BaseService
if ($memberId) { if ($memberId) {
return $memberId; return $memberId;
} }
// 如果没有中间件设置,尝试解析token // 如果没有中间件设置,尝试解析token
$token = request()->header('token'); $token = request()->header('token');
if ($token) { if ($token) {
@ -729,7 +731,7 @@ class StudentService extends BaseService
throw new CommonException('用户未登录或token无效'); throw new CommonException('用户未登录或token无效');
} }
} }
// 如果都没有,抛出异常 // 如果都没有,抛出异常
throw new CommonException('用户未登录'); throw new CommonException('用户未登录');
} }
@ -756,19 +758,19 @@ class StudentService extends BaseService
$studentId = $params['student_id']; $studentId = $params['student_id'];
$startDate = $params['start_date']; $startDate = $params['start_date'];
$endDate = $params['end_date']; $endDate = $params['end_date'];
// 构建查询条件 // 构建查询条件
$where = [ $where = [
['pcs.student_id', '=', $studentId], ['pcs.student_id', '=', $studentId],
['pcs.deleted_at', '=', 0], ['pcs.deleted_at', '=', 0],
['cs.deleted_at', '=', 0] ['cs.deleted_at', '=', 0]
]; ];
// 日期筛选 // 日期筛选
if (!empty($startDate) && !empty($endDate)) { if (!empty($startDate) && !empty($endDate)) {
$where[] = ['cs.course_date', 'between', [$startDate, $endDate]]; $where[] = ['cs.course_date', 'between', [$startDate, $endDate]];
} }
// 查询课程安排数据 // 查询课程安排数据
$scheduleList = Db::table('school_person_course_schedule pcs') $scheduleList = Db::table('school_person_course_schedule pcs')
->leftJoin('school_course_schedule cs', 'pcs.schedule_id = cs.id') ->leftJoin('school_course_schedule cs', 'pcs.schedule_id = cs.id')
@ -776,13 +778,13 @@ class StudentService extends BaseService
->field('pcs.status') ->field('pcs.status')
->select() ->select()
->toArray(); ->toArray();
// 统计各状态数量 // 统计各状态数量
$totalCourses = count($scheduleList); $totalCourses = count($scheduleList);
$completedCourses = 0; $completedCourses = 0;
$scheduledCourses = 0; $scheduledCourses = 0;
$cancelledCourses = 0; $cancelledCourses = 0;
foreach ($scheduleList as $schedule) { foreach ($scheduleList as $schedule) {
switch ($schedule['status']) { switch ($schedule['status']) {
case 1: // 已完成 case 1: // 已完成
@ -797,7 +799,7 @@ class StudentService extends BaseService
break; break;
} }
} }
return [ return [
'total_courses' => $totalCourses, 'total_courses' => $totalCourses,
'completed_courses' => $completedCourses, 'completed_courses' => $completedCourses,
@ -805,4 +807,68 @@ class StudentService extends BaseService
'cancelled_courses' => $cancelledCourses 'cancelled_courses' => $cancelledCourses
]; ];
} }
}
public function checkMemberOldPwd(string $old_passowrd)
{
$res = [
'code' => 0,
'msg' => '操作失败',
'data' => []
];
$customerResources = new CustomerResources();
$personnel_id = $this->getUserId();
$member = new Member();
$phone = $customerResources->where('id', $personnel_id)->value('phone_number');
$password = $customerResources->where('id', $personnel_id)->value('password');
if (!check_password($old_passowrd, $password)) {
$res['msg'] = '旧密码错误';
return $res;
}
$res['code'] = 1;
$res['msg'] = '密码正确';
$res['data'] = [
'key_value' => $this->setEditPasswordKey($phone)
];
return $res;
}
public function updatePassword($new_password){
$customerResources = new CustomerResources();
$personnel_id = $this->getUserId();
$update = $customerResources->where('id', $personnel_id)->update([
'password' => create_password($new_password)
]);
if (!$update) {
$res = [
'code' => 0,
'msg' => '操作失败',
'data' => []
];
} else {
$res = [
'code' => 1,
'msg' => '操作成功',
'data' => []
];
}
return $res;
}
public function setEditPasswordKey(string $phone)
{
$key_name = 'edit_password_' . $phone;
//生成字符串,存入cache中
//check_password()//验证
//create_password()//创建
$key_value = create_password($key_name);
// 缓存在3600秒之后过期
Cache::set($key_name, $key_value, 3600);
return $key_value;
}
}

6
uniapp/api/member.js

@ -149,4 +149,10 @@ export default {
async getSalaryInfo(data = {}) { async getSalaryInfo(data = {}) {
return await http.get(`/member/salary/info/${data.id}`); return await http.get(`/member/salary/info/${data.id}`);
}, },
async is_pass(data = {}) {
return await http.post('/student/is_pass', data)
},
async set_pass(data = {}) {
return await http.post('/student/set_pass', data)
},
} }

144
uniapp/pages-coach/coach/my/teaching_management_info.vue

@ -191,8 +191,9 @@ export default {
if (url.startsWith('http://') || url.startsWith('https://')) { if (url.startsWith('http://') || url.startsWith('https://')) {
return url; return url;
} }
// URL // URL
return 'http://localhost:20080' + (url.startsWith('/') ? url : '/' + url); return 'https://api.hnhbty.cn' + (url.startsWith('/') ? url : '/' + url);
}, },
// //
@ -204,75 +205,92 @@ export default {
}, },
// //
downloadFile(url) { downloadFile(url) {
uni.showLoading({ uni.showLoading({
title: '下载中...' title: '下载中...'
}); });
uni.downloadFile({ //
url: url, // #ifdef H5
success: (res) => { // H5
if (res.statusCode === 200) { const link = document.createElement('a');
// link.href = url;
const extension = this.getFileExtension(url); link.download = this.getFileName(url); //
const fileName = this.getFileName(url); document.body.appendChild(link);
link.click();
// document.body.removeChild(link);
if (['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(extension.toLowerCase())) {
// uni.hideLoading();
uni.saveImageToPhotosAlbum({ uni.showToast({
filePath: res.tempFilePath, title: '开始下载',
success: () => { icon: 'success'
uni.showToast({ });
title: '保存成功', // #endif
icon: 'success'
}); // #ifndef H5
}, // / App uni.downloadFile
fail: (error) => { uni.downloadFile({
console.error('保存图片失败:', error); url: url,
uni.showToast({ success: (res) => {
title: '保存失败', if (res.statusCode === 200) {
icon: 'none' const extension = this.getFileExtension(url);
});
} if (['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(extension.toLowerCase())) {
//
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
uni.showToast({
title: '保存成功',
icon: 'success'
}); });
} else { },
// fail: (error) => {
uni.openDocument({ console.error('保存图片失败:', error);
filePath: res.tempFilePath, uni.showToast({
showMenu: true, title: '保存失败',
success: () => { icon: 'none'
console.log('打开文档成功'); });
}, }
fail: (error) => { });
console.error('打开文档失败:', error); } else {
uni.showToast({ //
title: '无法打开文件', uni.openDocument({
icon: 'none' filePath: res.tempFilePath,
}); showMenu: true,
} success: () => {
console.log('打开文档成功');
},
fail: (error) => {
console.error('打开文档失败:', error);
uni.showToast({
title: '无法打开文件',
icon: 'none'
}); });
} }
} else {
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
},
fail: (error) => {
console.error('下载失败:', error);
uni.showToast({
title: '下载失败',
icon: 'none'
}); });
},
complete: () => {
uni.hideLoading();
} }
} else {
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
},
fail: (error) => {
console.error('下载失败:', error);
uni.showToast({
title: '下载失败',
icon: 'none'
}); });
}, },
complete: () => {
uni.hideLoading();
}
});
// #endif
},
// //
getFileName(url) { getFileName(url) {
if (!url) return ''; if (!url) return '';

16
uniapp/pages-market/clue/add_clues.vue

@ -390,12 +390,24 @@
:bottomBorder='false' :bottomBorder='false'
> >
<view class="input-title" style="margin-right:14rpx;"> <view class="input-title" style="margin-right:14rpx;">
<view
<fui-input
:borderBottom="false"
:padding="[0]"
placeholder="填写承诺到访时间"
v-model="formData.promised_visit_time"
backgroundColor="#434544"
size="26"
color="#fff"
></fui-input>
<!-- <view
class="input-title" class="input-title"
style="margin-right:14rpx;" style="margin-right:14rpx;"
@click="openDateTime(`promised_visit_time`)"> @click="openDateTime(`promised_visit_time`)">
{{ (formData.promised_visit_time) ? formData.promised_visit_time : '点击选择' }} {{ (formData.promised_visit_time) ? formData.promised_visit_time : '点击选择' }}
</view> </view> -->
</view> </view>
</fui-form-item> </fui-form-item>
<!--距离--> <!--距离-->

3
uniapp/pages-market/clue/class_arrangement_detail.vue

@ -485,7 +485,8 @@
}); });
return; return;
} }
console.log(this.selectedStudent);
// 2. // 2.
if (!this.selectedStudent.name || !this.selectedStudent.phone) { if (!this.selectedStudent.name || !this.selectedStudent.phone) {
uni.showToast({ uni.showToast({

3488
uniapp/pages-market/clue/clue_info.vue

File diff suppressed because it is too large

10
uniapp/pages-market/clue/edit_clues.vue

@ -165,12 +165,18 @@
</view> </view>
</fui-form-item> </fui-form-item>
<!-- 承诺到访时间 --> <!-- 承诺到访时间 -->
<fui-form-item labelWidth="240" label="2、承诺到访时间" labelSize='26' prop="promised_visit_time" background='#434544' labelColor='#fff' :bottomBorder='false'> <!-- <fui-form-item labelWidth="240" label="2、承诺到访时间" labelSize='26' prop="promised_visit_time" background='#434544' labelColor='#fff' :bottomBorder='false'>
<view class="input-title" style="margin-right:14rpx;"> <view class="input-title" style="margin-right:14rpx;">
<view class="input-title" style="margin-right:14rpx;" @click="openDateTime('promised_visit_time')"> <view class="input-title" style="margin-right:14rpx;" @click="openDateTime('promised_visit_time')">
{{ formData.promised_visit_time ? formData.promised_visit_time : '点击选择' }} {{ formData.promised_visit_time ? formData.promised_visit_time : '点击选择' }}
</view> </view>
</view> </view>
</fui-form-item> -->
<fui-form-item labelWidth="240" label="2、承诺到访时间" labelSize='26' prop="promised_visit_time" background='#434544' labelColor='#fff' :bottomBorder='false'>
<view class="input-title" style="margin-right:14rpx;">
<fui-input :borderBottom="false" :padding="[0]" placeholder="填写承诺到访时间" v-model="formData.promised_visit_time" backgroundColor="#434544" size="26" color="#fff" ></fui-input>
</view>
</fui-form-item> </fui-form-item>
<!-- 距离 --> <!-- 距离 -->
<fui-form-item label="3、距离" label-width="210" labelSize='26' prop="distance" background='#434544' labelColor='#fff' :bottomBorder='false'> <fui-form-item label="3、距离" label-width="210" labelSize='26' prop="distance" background='#434544' labelColor='#fff' :bottomBorder='false'>
@ -309,7 +315,7 @@
<fui-date-picker :show="date_picker_show" type="5" @change="change_date" @cancel="cancel_date" :value="default_date_value"></fui-date-picker> <fui-date-picker :show="date_picker_show" type="5" @change="change_date" @cancel="cancel_date" :value="default_date_value"></fui-date-picker>
<!-- 日期时间选择器 --> <!-- 日期时间选择器 -->
<fui-date-picker :show="datetime_picker_show" type="1" @change="change_datetime" @cancel="cancel_datetime" :value="default_datetime_value"></fui-date-picker> <fui-date-picker :show="datetime_picker_show" type="5" @change="change_datetime" @cancel="cancel_datetime" :value="default_datetime_value"></fui-date-picker>
<fui-picker :linkage='picker_linkage' :options="picker_options" :layer="1" :show="picker_show" @change="changeCicker" @cancel="cancelCicker"></fui-picker> <fui-picker :linkage='picker_linkage' :options="picker_options" :layer="1" :show="picker_show" @change="changeCicker" @cancel="cancelCicker"></fui-picker>

26
uniapp/pages-market/clue/index.vue

@ -18,10 +18,10 @@
</view> </view>
<view class="card" v-for="(v,k) in tableList_1" :key="k"> <view class="card" v-for="(v,k) in tableList_1" :key="k">
<!-- 状态水印 --> <!-- 状态水印 -->
<view class="status-watermark" v-if="!v.customerResource.communication_time"> <view class="status-watermark" v-if="v.customerResource && !v.customerResource.communication_time">
新资源 新资源
</view> </view>
<view class="card-content"> <view class="card-content" v-if="v.customerResource">
<view class="card-left" @click="clue_info(v)"> <view class="card-left" @click="clue_info(v)">
<view class="user-info-row"> <view class="user-info-row">
<view class="user-avatar"> <view class="user-avatar">
@ -79,14 +79,14 @@
</view> </view>
<view class="card-footer"> <view class="card-footer">
<view class="card-date"> <view class="card-date">
<view class="card-con" v-if="v.customerResource.communication_time"> <view class="card-con" v-if="v.customerResource && v.customerResource.communication_time">
{{ $util.formatToDateTime((v.customerResource.communication_time || ''), 'm-d H:i') }} {{ $util.formatToDateTime((v.customerResource.communication_time || ''), 'm-d H:i') }}
拨打电话 拨打电话
</view> </view>
<view class="card-con" v-else> <view class="card-con" v-else>
暂未联系 暂未联系
</view> </view>
<view style="margin-left: 30rpx;"> <view style="margin-left: 30rpx;" v-if="v.customerResource">
<view style="display: flex;align-items: center;"> <view style="display: flex;align-items: center;">
<view class="title-x"> <view class="title-x">
是否有效{{ v.sixSpeed && v.sixSpeed.efficacious === 1 ? '有效' : '无效' }} 是否有效{{ v.sixSpeed && v.sixSpeed.efficacious === 1 ? '有效' : '无效' }}
@ -134,7 +134,7 @@
</view> </view>
<view class="card" v-for="(v,k) in tableList_2" :key="k" @click="batchMode ? toggleItemSelection(v) : null"> <view class="card" v-for="(v,k) in tableList_2" :key="k" @click="batchMode ? toggleItemSelection(v) : null">
<!-- 状态水印 --> <!-- 状态水印 -->
<view class="status-watermark" v-if="!v.customerResource.communication_time"> <view class="status-watermark" v-if="v.customerResource && !v.customerResource.communication_time">
新资源 新资源
</view> </view>
<view class="card-content"> <view class="card-content">
@ -153,6 +153,18 @@
</view> </view>
<!-- <view class="card-label">{{v.is_status == 1 ? '试听' : '成交'}}</view>--> <!-- <view class="card-label">{{v.is_status == 1 ? '试听' : '成交'}}</view>-->
</view> </view>
<view class="card-con">
所属校区{{ v.customerResource.campus_name }}
</view>
<view class="card-con">
市场老师{{ v.customerResource.consultant_name }}
</view>
<view class="card-con"> <view class="card-con">
决策人{{v.customerResource.name}} <span 决策人{{v.customerResource.name}} <span
class="card-con-span">{{v.customerResource.decision_maker}}</span> class="card-con-span">{{v.customerResource.decision_maker}}</span>
@ -169,13 +181,13 @@
</view> </view>
<view class="card-footer"> <view class="card-footer">
<view class="card-date"> <view class="card-date">
<view class="card-con" v-if="v.customerResource.communication_time"> <view class="card-con" v-if="v.customerResource && v.customerResource.communication_time">
{{ $util.formatToDateTime((v.customerResource.communication_time || ''),'m-d H:i') }} 拨打电话 {{ $util.formatToDateTime((v.customerResource.communication_time || ''),'m-d H:i') }} 拨打电话
</view> </view>
<view class="card-con" v-else> <view class="card-con" v-else>
暂未联系 暂未联系
</view> </view>
<view style="margin-left: 30rpx;"> <view style="margin-left: 30rpx;" v-if="v.customerResource">
<view style="display: flex;align-items: center;"> <view style="display: flex;align-items: center;">
<view style="padding: 12rpx;"> <view style="padding: 12rpx;">
<image v-if="v.customerResource.initial_intent == 'high'" <image v-if="v.customerResource.initial_intent == 'high'"

1
uniapp/pages-student/schedule/index.vue

@ -498,6 +498,7 @@
}, },
async requestLeave() { async requestLeave() {
this.showCoursePopup = false
if (!this.selectedCourse) return if (!this.selectedCourse) return
uni.showModal({ uni.showModal({

Loading…
Cancel
Save