智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

454 lines
14 KiB

<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\api\parent;
use app\model\customer_resources\CustomerResources;
use core\base\BaseService;
use core\exception\CommonException;
use core\util\TokenAuth;
use think\facade\Db;
/**
* 家长端服务类
*/
class ParentService extends BaseService
{
/**
* 获取当前登录用户信息
* @return array
* @throws \Exception
*/
private function getCurrentUser()
{
$token = request()->header('token');
if (!$token) {
throw new CommonException('未登录');
}
try {
$tokenData = TokenAuth::parseToken($token, 'api');
if (empty($tokenData)) {
throw new CommonException('Token无效');
}
} catch (\Exception $e) {
throw new CommonException('Token解析失败: ' . $e->getMessage());
}
// 获取客户资源信息
$customerResources = new CustomerResources();
$userInfo = $customerResources->where('id', $tokenData['user_id'])->find();
if (!$userInfo) {
throw new CommonException('用户信息不存在');
}
return $userInfo;
}
/**
* 获取家长下的孩子列表
* @return array
* @throws \Exception
*/
public function getChildrenList()
{
$currentUser = $this->getCurrentUser();
// 查询该家长下的所有孩子
$children = Db::table('school_student')
->alias('s')
->leftJoin('school_campus ca', 's.campus_id = ca.id')
->leftJoin('school_class cl', 's.class_id = cl.id')
->where('s.user_id', $currentUser['id'])
->where('s.deleted_at', 0)
->field('s.*, ca.campus_name, cl.class_name')
->select()
->toArray();
// 计算每个孩子的课程统计信息
foreach ($children as &$child) {
// 计算年龄
if ($child['birthday']) {
$birthDate = new \DateTime($child['birthday']);
$today = new \DateTime();
$age = $today->diff($birthDate)->y;
$child['age'] = $age;
}
// 获取课程统计信息
$courseStats = $this->getChildCourseStats($child['id']);
$child = array_merge($child, $courseStats);
}
return [
'data' => $children,
'parent_info' => [
'id' => $currentUser['id'],
'name' => $currentUser['name'],
'phone_number' => $currentUser['phone_number']
]
];
}
/**
* 获取孩子的课程统计信息
* @param int $childId
* @return array
*/
private function getChildCourseStats($childId)
{
// 获取该学员的所有课程
$courses = Db::table('school_student_courses')
->where('student_id', $childId)
->select()
->toArray();
$totalCourses = 0;
$remainingCourses = 0;
$completedCourses = 0;
foreach ($courses as $course) {
$totalCourses += $course['course_hours'] ?? 0;
$remainingCourses += $course['remaining_hours'] ?? 0;
}
$completedCourses = $totalCourses - $remainingCourses;
// 计算出勤率
$attendanceRate = 0;
if ($completedCourses > 0) {
$presentCount = Db::table('school_student_course_usage')
->where('student_id', $childId)
->where('status', 'present')
->count();
$attendanceRate = round(($presentCount / $completedCourses) * 100, 1);
}
return [
'total_courses' => $totalCourses,
'remaining_courses' => $remainingCourses,
'completed_courses' => $completedCourses,
'attendance_rate' => $attendanceRate
];
}
/**
* 获取指定孩子的详细信息
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildInfo($childId)
{
$currentUser = $this->getCurrentUser();
$student = new Student();
$childInfo = $student->alias('s')
->leftJoin('school_campus ca', 's.campus_id = ca.id')
->leftJoin('school_classes cl', 's.class_id = cl.id')
->where('s.id', $childId)
->where('s.user_id', $currentUser['id'])
->where('s.deleted_at', 0)
->field('s.*, ca.name as campus_name, cl.name as class_name')
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// 计算年龄
if ($childInfo['birthday']) {
$birthDate = new \DateTime($childInfo['birthday']);
$today = new \DateTime();
$age = $today->diff($birthDate)->y;
$childInfo['age'] = $age;
}
// 获取课程统计信息
$courseStats = $this->getChildCourseStats($childId);
$childInfo = array_merge($childInfo->toArray(), $courseStats);
return $childInfo;
}
/**
* 新增孩子信息
* @param array $data
* @return array
* @throws \Exception
*/
public function addChild($data)
{
$currentUser = $this->getCurrentUser();
// 计算年龄
if ($data['birthday']) {
$birthDate = new \DateTime($data['birthday']);
$today = new \DateTime();
$age = $today->diff($birthDate)->y;
$data['age'] = $age;
}
$childData = [
'name' => $data['name'],
'gender' => $data['gender'],
'age' => $data['age'],
'birthday' => $data['birthday'],
'user_id' => $currentUser['id'],
'campus_id' => 0, // 默认未分配校区
'class_id' => 0, // 默认未分配班级
'note' => $data['remark'] ?? '',
'status' => 1, // 默认正常状态
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
];
$result = Db::table('school_student')->insertGetId($childData);
if (!$result) {
throw new CommonException('新增孩子信息失败');
}
return [
'id' => $result,
'name' => $data['name'],
'message' => '新增孩子信息成功'
];
}
/**
* 更新孩子信息
* @param array $data
* @return array
* @throws \Exception
*/
public function updateChildInfo($data)
{
$currentUser = $this->getCurrentUser();
$student = new Student();
$childInfo = $student->where('id', $data['child_id'])
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// 计算年龄
if ($data['birthday']) {
$birthDate = new \DateTime($data['birthday']);
$today = new \DateTime();
$age = $today->diff($birthDate)->y;
$data['age'] = $age;
}
$updateData = [
'name' => $data['name'],
'gender' => $data['gender'],
'age' => $data['age'],
'birthday' => $data['birthday'],
'note' => $data['remark'] ?? '',
'updated_at' => date('Y-m-d H:i:s')
];
$result = $childInfo->save($updateData);
if (!$result) {
throw new CommonException('更新孩子信息失败');
}
return [
'message' => '更新孩子信息成功'
];
}
/**
* 获取指定孩子的课程信息
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildCourses($childId)
{
$currentUser = $this->getCurrentUser();
// 验证孩子是否属于当前用户
$student = new Student();
$childInfo = $student->where('id', $childId)
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// 获取课程信息
$studentCourses = new StudentCourses();
$courses = $studentCourses->alias('sc')
->leftJoin('school_course c', 'sc.course_id = c.id')
->where('sc.student_id', $childId)
->field('sc.*, c.name as course_name, c.description')
->select()
->toArray();
return [
'data' => $courses,
'child_info' => [
'id' => $childInfo['id'],
'name' => $childInfo['name']
]
];
}
/**
* 获取指定孩子的订单信息
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildOrders($childId)
{
$currentUser = $this->getCurrentUser();
// 验证孩子是否属于当前用户
$student = new Student();
$childInfo = $student->where('id', $childId)
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// 获取订单信息
$orderTable = new OrderTable();
$orders = $orderTable->where('customer_resources_id', $currentUser['id'])
->where('student_id', $childId)
->order('created_at DESC')
->select()
->toArray();
return [
'data' => $orders,
'child_info' => [
'id' => $childInfo['id'],
'name' => $childInfo['name']
]
];
}
/**
* 获取指定孩子的服务记录
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildServices($childId)
{
$currentUser = $this->getCurrentUser();
// 验证孩子是否属于当前用户
$student = new Student();
$childInfo = $student->where('id', $childId)
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// TODO: 这里需要根据实际的服务记录表结构来实现
// 暂时返回空数据
return [
'data' => [],
'child_info' => [
'id' => $childInfo['id'],
'name' => $childInfo['name']
]
];
}
/**
* 获取指定孩子的消息记录
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildMessages($childId)
{
$currentUser = $this->getCurrentUser();
// 验证孩子是否属于当前用户
$student = new Student();
$childInfo = $student->where('id', $childId)
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// 获取消息记录
$chatMessages = new ChatMessages();
$messages = $chatMessages->where('to_customer_id', $currentUser['id'])
->order('created_at DESC')
->limit(50)
->select()
->toArray();
return [
'data' => $messages,
'child_info' => [
'id' => $childInfo['id'],
'name' => $childInfo['name']
]
];
}
/**
* 获取指定孩子的合同信息
* @param int $childId
* @return array
* @throws \Exception
*/
public function getChildContracts($childId)
{
$currentUser = $this->getCurrentUser();
// 验证孩子是否属于当前用户
$student = new Student();
$childInfo = $student->where('id', $childId)
->where('user_id', $currentUser['id'])
->where('deleted_at', 0)
->find();
if (!$childInfo) {
throw new CommonException('孩子信息不存在');
}
// TODO: 这里需要根据实际的合同表结构来实现
// 暂时返回空数据
return [
'data' => [],
'child_info' => [
'id' => $childInfo['id'],
'name' => $childInfo['name']
]
];
}
}