course/app/api/controller/TeacherScheduleTimeController.php
2024-09-09 15:51:55 +08:00

204 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\controller;
use app\BaseController;
use app\common\model\TeacherScheduleTime;
use app\common\service\TeacherScheduleTimeService;
use app\constant\ResponseCode;
use support\Request;
use think\Exception;
class TeacherScheduleTimeController extends BaseController
{
/**
* @desc 添加空闲时间
* @param Request $request
* @return \support\Response
*/
public function addScheduleTime(Request $request)
{
$service = new TeacherScheduleTimeService();
$res = $service->addScheduleTime($request);
return $this->json($res);
}
/**
* @desc 获取排期信息
* @param Request $request
* @return \support\Response
*/
public function getScheduleTime(Request $request)
{
$service = new TeacherScheduleTimeService();
$res = $service->getScheduleTime($request);
return $this->json($res);
}
/**
* @desc 学生课表
* @param Request $request
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function downloadSchedule(Request $request)
{
try {
if (empty((array)$request->teacher)) {
throw new Exception('请教师登陆后再试');
}
$request_data = $request->post();
$month = date('Y-m', strtotime($request_data['date']));
$student_schedule = TeacherScheduleTime::where(['teacher_id' => $request->teacher->id, 'is_publish' => 1])
->where(['month' => $month])
->with(['teacher', 'subject', 'studentSchedule'])
->order('start_time asc')
->select()->toArray();
$array = [];
$stu_nmae = '';
foreach ($student_schedule as $k => &$v) {
if($v['studentSchedule']){
$student = [];
foreach ($v['studentSchedule'] as $k1 => $v1) {
if($v1['is_publish']){
$student[] = $v1['student_name'];
}
}
}
$array[] = [
'week' => $this->getWeek(strtotime($v['date'])),
'date' => $v['date'],
'time_on' => $v['time'],
'subject' => $v['english_name'],
'teacher_name' => $v['teacher_name'],
'student_name' => implode(',', $student),
'time_num' => $v['hour'] . '/h',
];
$stu_nmae = $v['teacher_name'];
}
$params = [
'row' => count($student_schedule) + 1,//数据的行数
'file_name' => time() . '.png',
'title' => $stu_nmae,
'table_time' => $month,
'data' => $array,
];
$file_path = '/files/images/teacher_schedule/' . $month . "/{$request->teacher->id}/";
$base = [
'border' => 10,//图片外边框
'file_path' => public_path($file_path),//图片保存路径
'title_height' => 30,//报表名称高度
'title_font_size' => 16,//报表名称字体大小
'font_ulr' => public_path('/111.ttf'),//字体文件路径
'text_size' => 12,//正文字体大小
'row_hight' => 30,//每行数据行高
'filed_id_width' => 60,//序号列的宽度
'filed_name_width' => 120,//玩家名称的宽度
'filed_data_width' => 120,//数据列的宽度
'table_header' => ['', 'Week', 'Date', 'Time', 'Subject', 'Teacher', 'Student','Duration'],//表头文字
'column_text_offset_arr' => [45, 70, 70, 90, 55, 65, 65, 65],//表头文字左偏移量
'row_text_offset_arr' => [50, 110, 90, 110, 90, 90, 90, 90],//数据列文字左偏移量
];
$base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
$base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
$border_top = $base['border'] + $base['title_height'];//表格顶部高度
$border_bottom = $base['img_height'] - $base['border'];//表格底部高度
$base['column_x_arr'] = [
$base['border'] + $base['filed_id_width'],//第一列边框线x轴像素 70/2+10
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素 190
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 2,//第四列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 3,//第五列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 6,//第五列边框线x轴像素
];
$img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
$bg_color = imagecolorallocate($img, 255, 255, 255);//设定图片背景色
$text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
$border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
// $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
imagefill($img, 0, 0, $bg_color);//填充图片背景色
//先填充一个黑色的大块背景
imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
//再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
//画表格纵线 及 写入表头文字
foreach ($base['column_x_arr'] as $key => $x) {
imageline($img, $x, $border_top, $x, $border_bottom, $border_coler);//画纵线
$x = $x - $base['column_text_offset_arr'][$key] + 1;
// echo $x;echo "<br>";
$y = $border_top + $base['row_hight'] - 8;
$text = $base['table_header'][$key];
imagettftext($img, $base['text_size'], 0, $x, $y, $text_coler, $base['font_ulr'], $text);//写入表头文字
}
//画表格横线
foreach ($params['data'] as $key => $item) {
$border_top += $base['row_hight'];
imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
$x = $base['column_x_arr'][0] - $base['row_text_offset_arr'][0];
$y = $border_top + $base['row_hight'] - 10;
$text = $key + 1;
imagettftext($img, $base['text_size'], 0, $x, $y, $text_coler, $base['font_ulr'], $text);//写入序号
$sub = 0;
foreach ($item as $value) {
$sub++;
imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][$sub] - $base['row_text_offset_arr'][$sub], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $value);//写入data数据
}
}
//计算标题写入起始位置
$title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
$title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
$title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
//居中写入标题
imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width) / 2, $base['title_height'], $text_coler, $base['font_ulr'], $params['title']);
//写入制表时间
imagettftext($img, $base['text_size'], 0, $base['border'], $base['title_height'], $text_coler, $base['font_ulr'], 'Date' . $params['table_time']);
$save_path = $base['file_path'] . $params['file_name'];
if (!is_dir($base['file_path']))//判断存储路径是否存在,不存在则创建
{
mkdir($base['file_path'], 0777, true);//可创建多级目录
}
imagepng($img, $save_path);//输出图片输出png使用imagepng方法输出gif使用imagegif方法
$url = getenv('SERVER_DOMAIN') . $file_path . $params['file_name'];
return $this->json([
'code'=>ResponseCode::SUCCESS,
'data' => $url,
]);
}catch (Exception $e){
return $this->json([
'code' => ResponseCode::FAIL,
'msg' => $e->getMessage()
]);
}
}
public function getWeek($date)
{
// $week_array = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
$week_array = array("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat");
$week = date("w", $date);
return $week_array[$week];
}
}