智慧教务系统
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.
 
 
 
 
 
 

203 lines
7.2 KiB

<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\job\schedule;
use app\model\service_logs\ServiceLogs;
use app\model\personnel\Personnel;
use app\service\core\notice\NoticeService;
use core\base\BaseJob;
use think\facade\Log;
/**
* 服务记录分发定时任务
* 用于给教务和教练分发服务记录通知
*/
class ServiceLogsDistribution extends BaseJob
{
/**
* 执行任务
* @return bool
*/
public function doJob()
{
Log::write('服务记录分发任务开始 ' . date('Y-m-d H:i:s'));
try {
$this->distributeToAcademicAffairs();
$this->distributeToCoaches();
Log::write('服务记录分发任务完成 ' . date('Y-m-d H:i:s'));
} catch (\Exception $e) {
Log::write('服务记录分发任务异常: ' . $e->getMessage());
return false;
}
return true;
}
/**
* 给教务分发服务记录
*/
private function distributeToAcademicAffairs()
{
// 获取需要分发的服务记录(最近24小时内完成的记录)
$yesterday = date('Y-m-d H:i:s', strtotime('-1 day'));
$serviceLogs = ServiceLogs::where('status', 1) // 已完成状态
->where('created_at', '>=', $yesterday)
->where('is_distributed_to_academic', 0) // 未分发给教务
->with(['service', 'staff'])
->select();
if ($serviceLogs->isEmpty()) {
Log::write('没有需要分发给教务的服务记录');
return;
}
// 获取教务人员列表
$academicStaff = Personnel::where('status', Personnel::STATUS_NORMAL)
->where('position', 'like', '%教务%')
->select();
if ($academicStaff->isEmpty()) {
Log::write('未找到教务人员');
return;
}
$distributionCount = 0;
foreach ($serviceLogs as $serviceLog) {
foreach ($academicStaff as $staff) {
// 发送通知给教务
$this->sendServiceLogNotice($staff, $serviceLog, 'academic');
$distributionCount++;
}
// 标记为已分发给教务
$serviceLog->is_distributed_to_academic = 1;
$serviceLog->distribution_time = time();
$serviceLog->save();
Log::write("已分发给教务,服务记录ID: {$serviceLog->id}");
}
Log::write("成功分发给教务 {$distributionCount} 条服务记录通知");
}
/**
* 给教练分发服务记录
*/
private function distributeToCoaches()
{
// 获取需要分发的服务记录(最近24小时内完成的记录)
$yesterday = date('Y-m-d H:i:s', strtotime('-1 day'));
$serviceLogs = ServiceLogs::where('status', 1) // 已完成状态
->where('created_at', '>=', $yesterday)
->where('is_distributed_to_coach', 0) // 未分发给教练
->with(['service', 'staff'])
->select();
if ($serviceLogs->isEmpty()) {
Log::write('没有需要分发给教练的服务记录');
return;
}
// 获取教练人员列表
$coaches = Personnel::where('status', Personnel::STATUS_NORMAL)
->where('position', 'like', '%教练%')
->select();
if ($coaches->isEmpty()) {
Log::write('未找到教练人员');
return;
}
$distributionCount = 0;
foreach ($serviceLogs as $serviceLog) {
// 找到对应的教练(根据服务记录中的staff_id)
$coach = $coaches->where('id', $serviceLog->staff_id)->first();
if ($coach) {
// 发送通知给教练
$this->sendServiceLogNotice($coach, $serviceLog, 'coach');
$distributionCount++;
}
// 标记为已分发给教练
$serviceLog->is_distributed_to_coach = 1;
$serviceLog->distribution_time = time();
$serviceLog->save();
Log::write("已分发给教练,服务记录ID: {$serviceLog->id}");
}
Log::write("成功分发给教练 {$distributionCount} 条服务记录通知");
}
/**
* 发送服务记录通知
* @param Personnel $staff 接收人员
* @param ServiceLogs $serviceLog 服务记录
* @param string $type 通知类型 (academic|coach)
*/
private function sendServiceLogNotice($staff, $serviceLog, $type)
{
try {
// 准备通知数据
$noticeData = [
'staff_name' => $staff->name,
'service_name' => $serviceLog->service->service_name ?? '未知服务',
'service_remark' => $serviceLog->service_remark ?? '',
'score' => $serviceLog->score ?? 0,
'feedback' => $serviceLog->feedback ?? '',
'created_at' => date('Y-m-d H:i:s', $serviceLog->created_at),
'type' => $type
];
// 根据类型选择不同的通知模板
$noticeKey = $type === 'academic' ? 'service_log_academic_notice' : 'service_log_coach_notice';
// 发送通知
NoticeService::send($noticeKey, $noticeData);
Log::write("成功发送服务记录通知给 {$staff->name},服务记录ID: {$serviceLog->id}");
} catch (\Exception $e) {
Log::write("发送服务记录通知失败: {$e->getMessage()}");
}
}
/**
* 获取分发统计信息
* @return array
*/
public function getDistributionStats()
{
$yesterday = date('Y-m-d H:i:s', strtotime('-1 day'));
$stats = [
'total_completed' => ServiceLogs::where('status', 1)
->where('created_at', '>=', $yesterday)
->count(),
'distributed_to_academic' => ServiceLogs::where('status', 1)
->where('created_at', '>=', $yesterday)
->where('is_distributed_to_academic', 1)
->count(),
'distributed_to_coach' => ServiceLogs::where('status', 1)
->where('created_at', '>=', $yesterday)
->where('is_distributed_to_coach', 1)
->count(),
'academic_staff_count' => Personnel::where('status', Personnel::STATUS_NORMAL)
->where('position', 'like', '%教务%')
->count(),
'coach_count' => Personnel::where('status', Personnel::STATUS_NORMAL)
->where('position', 'like', '%教练%')
->count(),
];
return $stats;
}
}