diff --git a/niucloud/app/api/controller/apiController/ClassApi.php b/niucloud/app/api/controller/apiController/ClassApi.php index 83f4ec5b..0b12e697 100644 --- a/niucloud/app/api/controller/apiController/ClassApi.php +++ b/niucloud/app/api/controller/apiController/ClassApi.php @@ -12,7 +12,7 @@ namespace app\api\controller\apiController; use app\Request; -use app\service\api\apiService\CourseService; +use app\service\api\apiService\jlClassService; use core\base\BaseApiService; @@ -21,22 +21,24 @@ use core\base\BaseApiService; * Class Personnel * @package app\api\controller\apiController */ -class ClassSpi extends BaseApiService +class ClassApi extends BaseApiService { //课程列表 public function jlClassList(Request $request){ $id = $this->member_id; - dd(111); - return success((new CourseService())->list($id,$data)); + $data = $this->request->params([ + ["name",''] + ]); + return success((new jlClassService())->list($id,$data)); } - //获取课程详情 - public function courseInfo(Request $request){ + //课程详情 + public function jlClassInfo(Request $request){ $data = $this->request->params([ - ["id",0] + ["class_id",0] ]); - return success('SUCCESS',(new CourseService())->info($data['id'])); + return success('获取成功',(new jlClassService())->info($data['class_id'])); } } diff --git a/niucloud/app/api/controller/apiController/CustomerResourcesAuth.php b/niucloud/app/api/controller/apiController/CustomerResourcesAuth.php new file mode 100644 index 00000000..1fd574ab --- /dev/null +++ b/niucloud/app/api/controller/apiController/CustomerResourcesAuth.php @@ -0,0 +1,119 @@ +param('phone', ''); //手机号 + $password = $request->param('password', ''); //密码 + $openid = $request->param('openid', ''); //微信小程序openid + + if (empty($phone)) { + return fail('请输入手机号'); + } + if (empty($password)) { + return fail('请输入密码'); + } + + $member_info = Member::where('mobile', $phone)->find();//查账户表信息是否存在 + + + if (!$member_info) { + return fail('账户手机号有误'); + } + + $customerResources = \app\model\customer_resources\CustomerResources::where('member_id', $member_info['member_id'])->find();//查客户资源表信息是否存在 + if (!$customerResources) { + return fail('账户信息有误'); + } + + //创建密码 + //$a = create_password($password); + //验证密码 + if (!check_password($password, $member_info->password)) { + return fail('手机号或密码不正确'); + } + + + $res = (new LoginService())->login($member_info, MemberLoginTypeDict::MOBILE); + if (!$res) { + return fail('账户信息有误'); + } + $res['user_type'] = '3';//用户类型|3=学员 + return success($res); + } + + //学生详情 + public function info(){ + $member_id = $this->member_id; + $where = [ + 'member_id'=>$member_id + ]; + $res = (new CustomerResourcesService())->getInfo($where); + if (!$res['code']) { + return fail($res['msg']); + } + return success($res['data']); + } + + //学生详情-修改 + public function edit(Request $request){ + $member_id = $this->member_id; + $where = [ + 'member_id'=>$member_id + ]; + $data = [ + 'headimg' => $request->param('headimg', ''), + 'name' => $request->param('name', ''), + 'gender' => $request->param('gender', ''), + 'age' => $request->param('age', ''), + 'phone_number' => $request->param('phone_number', ''), + ]; + + // 验证必填字段 + if (empty($data['name'])) { + return fail('姓名不能为空'); + } + if (empty($data['gender'])) { + return fail('性别不能为空'); + } + if (empty($data['age'])) { + return fail('年龄不能为空'); + } + if (empty($data['phone_number'])) { + return fail('手机号不能为空'); + } + + $res = (new CustomerResourcesService())->editInfo($where,$data); + if (!$res['code']) { + return fail($res['msg']); + } + return success([]); + } + +} diff --git a/niucloud/app/api/controller/apiController/TeachingResearch.php b/niucloud/app/api/controller/apiController/TeachingResearch.php index b202071b..71cd1a5f 100644 --- a/niucloud/app/api/controller/apiController/TeachingResearch.php +++ b/niucloud/app/api/controller/apiController/TeachingResearch.php @@ -115,10 +115,15 @@ class TeachingResearch extends BaseApiService if ($resLessonTeaching['answers_num'] >= $res['number_answers']) { return fail('已超过答题次数', []); } else { + if (count($userRes['data']['cameus_dept_arr']) > 0) { + $campus_id = $userRes['data']['cameus_dept_arr'][0]['campus_id']; + } else { + $campus_id = 0; + } foreach ($result as &$v){ $v['user_id'] = $userRes['data']['id']; $v['question_id'] = $v['ids']; - $v['campus_id'] = 0; + $v['campus_id'] = $campus_id; $v['answer'] = $v['value']; $resEq = $ExamQuestions->where('id',$v['ids'])->find(); if ($resEq['correct_answer'] == $v['value']){ diff --git a/niucloud/app/api/controller/apiController/Test.php b/niucloud/app/api/controller/apiController/Test.php new file mode 100644 index 00000000..93490b91 --- /dev/null +++ b/niucloud/app/api/controller/apiController/Test.php @@ -0,0 +1,46 @@ +param('personnel_id', '');//员工人力资源表id(两个参数2选1) + $customer_resources_id = $request->param('customer_resources_id', '');//学生资源表id(两个参数2选1) + if (empty($personnel_id) && empty($customer_resources_id)) { + return fail('缺少参数'); + } + + $where = [ + 'personnel_id' => $personnel_id, + 'customer_resources_id' => $customer_resources_id, + ]; + + $res = (new ChatService())->getChatFriendsPage($where); + + return success($res); + } +} diff --git a/niucloud/app/api/controller/apiController/UserFeedback.php b/niucloud/app/api/controller/apiController/UserFeedback.php new file mode 100644 index 00000000..8ac04a98 --- /dev/null +++ b/niucloud/app/api/controller/apiController/UserFeedback.php @@ -0,0 +1,53 @@ +post('user_id', ''); // 用户ID(对应school_customer_resources表id) + $feedback_text = $request->post('feedback_text', ''); // 反馈内容 + $attachment_url = $request->post('attachment_url', null); // 附件URL(OSS对象存储),允许为空 + + + //验证必填 + if (empty($user_id) || empty($feedback_text)) { + return fail('必填参数不能为空'); + } + + $data = [ + 'user_id' => $user_id, + 'feedback_text' => $feedback_text, + 'attachment_url' => $attachment_url ?? null, + ]; + + $add = \app\model\user_feedback\UserFeedback::create($data); + + if (!$add) { + return fail('添加失败'); + } + + return success([]); + } +} diff --git a/niucloud/app/api/controller/upload/Upload.php b/niucloud/app/api/controller/upload/Upload.php index 1463faaf..b24b7733 100644 --- a/niucloud/app/api/controller/upload/Upload.php +++ b/niucloud/app/api/controller/upload/Upload.php @@ -33,7 +33,17 @@ class Upload extends BaseApiController ['file', 'file'], ]); $upload_service = new UploadService(); - return success($upload_service->image($data['file'],$extraData)); + + $res = $upload_service->image($data['file'],$extraData); + + $res['ext'] = ''; // 初始化文件扩展名 + $res['name'] = ''; // 初始化文件名称 + if (isset($res['url'])) { + $res['ext'] = pathinfo($res['url'], PATHINFO_EXTENSION); + $res['name'] = basename($res['url']); + } + + return success($res); } /** diff --git a/niucloud/app/api/route/route.php b/niucloud/app/api/route/route.php index f26b3824..ba452b10 100644 --- a/niucloud/app/api/route/route.php +++ b/niucloud/app/api/route/route.php @@ -294,6 +294,8 @@ Route::group(function () { Route::get('course/delStudentCourse', 'apiController.course/delStudentCourse'); //班级列表 Route::get('class/jlClassList', 'apiController.classApi/jlClassList'); + //班级详情 + Route::get('class/jlClassInfo', 'apiController.classApi/jlClassInfo'); //课程列表 Route::get('course/courseList', 'apiController.course/courseList'); //获取课程详情 @@ -314,10 +316,11 @@ Route::group(function () { //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑-----员工端相关-----↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-----用户端相关-----↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ +//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-----学生用户端相关-----↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //无需token验证的 Route::group(function () { -// Route::post('personnelLogin', 'login.Login/personnelLogin'); + //学生登录 + Route::post('customerResourcesAuth/login', 'apiController.CustomerResourcesAuth/login'); })->middleware(ApiChannel::class) ->middleware(ApiCheckToken::class) ->middleware(ApiLog::class); @@ -325,12 +328,22 @@ Route::group(function () { //需要token验证的 Route::group(function () { -// Route::get('personnel/info', 'apiController.Personnel/info'); + //员工端-上传图片 + Route::post('memberUploadImage', 'upload.Upload/image'); + //学生详情 + Route::get('customerResourcesAuth/info', 'apiController.CustomerResourcesAuth/info'); + //学生详情-修改 + Route::post('customerResourcesAuth/edit', 'apiController.CustomerResourcesAuth/edit'); + + //学生用户反馈-添加 + Route::post('userFeedback/add', 'apiController.UserFeedback/add'); + + })->middleware(ApiChannel::class) ->middleware(ApiCheckToken::class, true) ->middleware(ApiLog::class); -//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑-----用户端相关-----↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ +//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑-----学生用户端相关-----↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //加载插件路由 diff --git a/niucloud/app/model/class_grade/ClassGrade.php b/niucloud/app/model/class_grade/ClassGrade.php index acff649b..8e8ce49f 100644 --- a/niucloud/app/model/class_grade/ClassGrade.php +++ b/niucloud/app/model/class_grade/ClassGrade.php @@ -13,6 +13,7 @@ namespace app\model\class_grade; use app\model\campus\Campus; use app\model\personnel\Personnel; +use app\model\class_personnel_rel\ClassPersonnelRel; use core\base\BaseModel; use think\model\concern\SoftDelete; use think\model\relation\HasMany; @@ -229,6 +230,16 @@ class ClassGrade extends BaseModel return $this->hasOne(Personnel::class, 'id', 'head_coach')->joinType('left')->withField('name,id')->bind(['head_coach_name'=>'name']); } + public function personnelAll(){ + return $this->hasOne(Personnel::class, 'id', 'head_coach')->joinType('left')->withField('head_img,id')->bind(['head_coach_head_img'=>'head_img']); + } + public function personnelName(){ + return $this->hasOne(Personnel::class, 'id', 'head_coach')->joinType('left')->withField('name,id')->bind(['head_coach_name'=>'name']); + } + + public function classPersonnelRel(){ + return $this->hasMany(ClassPersonnelRel::class, 'class_id', 'id'); + } } diff --git a/niucloud/app/model/class_personnel_rel/ClassPersonnelRel.php b/niucloud/app/model/class_personnel_rel/ClassPersonnelRel.php new file mode 100644 index 00000000..7644993d --- /dev/null +++ b/niucloud/app/model/class_personnel_rel/ClassPersonnelRel.php @@ -0,0 +1,57 @@ +hasOne(Student::class, 'id', 'source_id'); + } + + public function studentCourses(){ + return $this->hasOne(StudentCourses::class, 'student_id', 'source_id')->joinType('left')->withField('end_date,student_id')->bind(['end_date'=>'end_date']); + } + + public function studentCoursesInfo(){ + return $this->hasOne(StudentCourses::class, 'student_id', 'source_id'); + } + + +} diff --git a/niucloud/app/model/customer_resources/CustomerResources.php b/niucloud/app/model/customer_resources/CustomerResources.php index ce0415e3..ae42a928 100644 --- a/niucloud/app/model/customer_resources/CustomerResources.php +++ b/niucloud/app/model/customer_resources/CustomerResources.php @@ -163,6 +163,12 @@ class CustomerResources extends BaseModel return $this->hasMany(ResourceSharing::class, 'resource_id', 'id'); } + //一对一关联"用户账号登陆表" + public function memberHasOne() + { + return $this->hasOne(Member::class, 'member_id', 'member_id'); + } + diff --git a/niucloud/app/service/api/apiService/CommonService.php b/niucloud/app/service/api/apiService/CommonService.php index 1dde8cfd..1f0e82cf 100644 --- a/niucloud/app/service/api/apiService/CommonService.php +++ b/niucloud/app/service/api/apiService/CommonService.php @@ -54,6 +54,15 @@ class CommonService extends BaseApiService */ public function forgetPassword($phone, $new_password, $user_type){ if($user_type == 'personnel'){ + $data = SysUser::where('username', $phone)->find(); + if (!$data){ + $res = [ + 'code' => 0, + 'msg' => '用户不存在', + 'data' => [] + ]; + return $res; + } //重置员工(销售/教师)密码 $update = SysUser::where('username', $phone)->update([ 'password' => create_password($new_password),//创建密码 @@ -74,6 +83,15 @@ class CommonService extends BaseApiService } return $res; }else{ + $data = Member::where('username', $phone)->find(); + if (!$data){ + $res = [ + 'code' => 0, + 'msg' => '用户不存在', + 'data' => [] + ]; + return $res; + } //重置用户(学生)密码 $update = Member::where('username', $phone)->update([ 'password' => create_password($new_password),//创建密码 @@ -125,12 +143,18 @@ class CommonService extends BaseApiService } return [ + // 返回发生更改的字段名数组 'changed_fields' => $changedFields, + // 返回旧数据中的更改字段及其值 'old_values' => $oldChanges, + // 返回新数据中的更改字段及其值 'new_values' => $newChanges, + // 将 changed_fields 转换为 JSON 格式,保留中文字符 'changed_fields_json' => json_encode($changedFields, JSON_UNESCAPED_UNICODE), + // 将 old_changes 转换为 JSON 格式,保留中文字符 'old_values_json' => json_encode($oldChanges, JSON_UNESCAPED_UNICODE), + // 将 new_changes 转换为 JSON 格式,保留中文字符 'new_values_json' => json_encode($newChanges, JSON_UNESCAPED_UNICODE) ]; } diff --git a/niucloud/app/service/api/apiService/CustomerResourcesService.php b/niucloud/app/service/api/apiService/CustomerResourcesService.php index 142dec68..8b0ab131 100644 --- a/niucloud/app/service/api/apiService/CustomerResourcesService.php +++ b/niucloud/app/service/api/apiService/CustomerResourcesService.php @@ -36,6 +36,37 @@ class CustomerResourcesService extends BaseApiService parent::__construct(); } + //获取客户资源详情 + public function getInfo(array $where,string $field = '*'){ + $res = [ + 'code' => 0, + 'msg' => '操作失败', + 'data' => [] + ]; + $model = new CustomerResources(); + if(!empty($where['member_id'])){ + $model = $model->where('member_id', $where['member_id']); + } + $data = $model->field($field) + ->with([ + 'memberHasOne', + 'resourceSharingHasMany' + ]) + ->append([ + 'gender_name', + 'initial_intent_name' + ]) + ->find(); + if ($data){ + $data = $data->toArray(); + $res['code'] = 1; + $res['data'] = $data; + }else{ + $res['msg'] = '暂无数据'; + } + return $res; + } + //获取全部客户资源数据 public function getAll(array $where,string $field = '*') { @@ -280,6 +311,92 @@ class CustomerResourcesService extends BaseApiService } } + //客户资源(学生个人资料)-编辑 + public function editInfo(array $where, array $data) + { + + $res = [ + 'code' => 0, + 'msg' => '操作失败', + 'data' => [] + ]; + + if (!$where) { + $res['msg'] = '查询条件不能为空'; + return $res; + } + + $customer_resources_data = [ + 'name' => $data['name'], // 姓名 + 'gender' => $data['gender'], // 性别(male:男, female:女) + 'age' => $data['age'], // 年龄 + 'phone_number' => $data['phone_number'], // 手机号 + ]; + + $date = date('Y-m-d H:i:s'); + $customer_resources_data['updated_at'] = $date; + + //开启事物 + Db::startTrans(); + try { + $customer_resources = CustomerResources::where('member_id', $where['member_id'])->find(); + + if ($customer_resources) { + $customer_resources = $customer_resources->toArray(); + } + $update_1 = CustomerResources::where('id', $customer_resources['id'])->update($customer_resources_data);//客户资源表 + if (!$update_1) { + Db::rollback(); + return $res; + } + + //更新学生账户登录表 + $member_data = [ + 'username' => $data['phone_number'], + 'mobile' => $data['phone_number'], + 'update_time' => time() + ]; + if (!empty($data['headimg'])) { + $member_data['headimg'] = $data['headimg']; + } + $update_member = Member::where('member_id', $where['member_id'])->update($member_data); + if (!$update_member) { + Db::rollback(); + return $res; + } + + + //更近客户资源日志表 + $compareData = (new CommonService)->compareData($customer_resources, $customer_resources_data); + if ($compareData['changed_fields']) { + $data = [ + "customer_resource_id" => $customer_resources['id'],//客户资源的ID + "operator_id" => 0,//操作人的ID + "campus_id" => 0,//操作人校区的ID|如果这人有2校区就填0 + "modified_fields" => $compareData['changed_fields_json'],//修改的哪些字段 + "old_values" => $compareData['old_values_json'],//修改前的值 + "new_values" => $compareData['new_values_json'],//修改后的值 + ]; + + $id = CustomerResourceChanges::insertGetId($data); + if (!$id) { + Db::rollback(); + return $res; + } + } + + Db::commit(); + $res = [ + 'code' => 1, + 'msg' => '操作成功' + ]; + return $res; + } catch (\Exception $exception) { + Db::rollback(); + return $res; + } + } + //客户资源-获取客户资源修改记录列表 public function getCustomerResourceChangesEditLog(array $where) { diff --git a/niucloud/app/service/api/apiService/jlClassService.php b/niucloud/app/service/api/apiService/jlClassService.php new file mode 100644 index 00000000..d3628355 --- /dev/null +++ b/niucloud/app/service/api/apiService/jlClassService.php @@ -0,0 +1,102 @@ +model = (new ClassGrade()); + } + + //列表 + public function list($id,$data) + { + $order = 'id desc'; + $where = []; + if ($data['name'] !== '') { + $where[] = ['name','like','%'.$data['name'].'%']; + } + $search_model = $this->model->where('head_coach', $id)->where($where)->order($order) + ->with(['classPersonnelRel' => function($query) { + $query->with(['student' => function($query) { + $query->with(['customerResources' => function($query) { + $query->with(['member' => function($query) { + $query->select(); + }]); + }]); + },'studentCourses']); + + },'personnelAll']); + $list = $this->pageQuery($search_model); + foreach ($list['data'] as &$v){ + if (count($v['classPersonnelRel']) > 0) { + $now = time(); + $count = 0; + foreach ($v['classPersonnelRel'] as $item) { + if (isset($item['end_date'])) { + $endTime = strtotime($item['end_date']); + if ($endTime > $now && $endTime <= $now + 7 * 86400) { + $count++; + } + } + } + $v['end_count'] = $count; + } else { + $v['end_count'] = 0; + } + } + return $list; + } + + + public function info($data) + { + $search_model = $this->model->where('id', $data) + ->with(['classPersonnelRel' => function($query) { + $query->with(['student' => function($query) { + $query->with(['customerResources' => function($query) { + $query->with(['member' => function($query) { + $query->select(); + }]); + }]); + },'studentCourses','studentCoursesInfo']); + },'personnelAll', 'personnelName']); + $list = $search_model->find(); + if (count($list['classPersonnelRel']) > 0) { + $now = time(); + $count = 0; + foreach ($list['classPersonnelRel'] as $item) { + if (isset($item['end_date'])) { + $endTime = strtotime($item['end_date']); + if ($endTime > $now && $endTime <= $now + 7 * 86400) { + $count++; + } + } + } + $v['end_count'] = $count; + } else { + $v['end_count'] = 0; + } + return $list; + } + +}