学生、教师课程表

This commit is contained in:
Dai 2024-07-25 22:43:43 +08:00
parent cfa7e8a385
commit ab4f8849ce
3 changed files with 176 additions and 9 deletions

View File

@ -79,17 +79,17 @@ class StudentController extends BaseController
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
*/ */
public function studentSchedule(Request $request) public function downloadSchedule(Request $request)
{ {
$request_data = $request->post(); $request_data = $request->post();
$month = date('Y-m', strtotime($request_data['date']));
$student_schedule = StudentSchedule::where(['student_id' => $request->student->id]) $student_schedule = StudentSchedule::where(['student_id' => $request->student->id])
->where(['month' => '2024-07']) ->where(['month' => $month])
->with(['teacher', 'subject']) ->with(['teacher', 'subject'])
->order('start_time asc') ->order('start_time asc')
->select()->toArray(); ->select()->toArray();
$array = []; $array = [];
$stu_nmae = ''; $stu_nmae = '';
@ -105,17 +105,17 @@ class StudentController extends BaseController
$stu_nmae = $v['student_name']; $stu_nmae = $v['student_name'];
} }
$date = '2024-07';
$params = [ $params = [
'row' => count($student_schedule) + 1,//数据的行数 'row' => count($student_schedule) + 1,//数据的行数
'file_name' => time() . '.png', 'file_name' => time() . '.png',
'title' => $stu_nmae, 'title' => $stu_nmae,
'table_time' => $date, 'table_time' => $month,
'data' => $array, 'data' => $array,
]; ];
$file_path = '/files/images/student_schedule/' . $month . "/{$request->student->id}/";
$base = [ $base = [
'border' => 10,//图片外边框 'border' => 10,//图片外边框
'file_path' => public_path('/files/images/'),//图片保存路径 'file_path' => public_path($file_path),//图片保存路径
'title_height' => 30,//报表名称高度 'title_height' => 30,//报表名称高度
'title_font_size' => 16,//报表名称字体大小 'title_font_size' => 16,//报表名称字体大小
'font_ulr' => public_path('/111.ttf'),//字体文件路径 'font_ulr' => public_path('/111.ttf'),//字体文件路径
@ -123,10 +123,10 @@ class StudentController extends BaseController
'row_hight' => 30,//每行数据行高 'row_hight' => 30,//每行数据行高
'filed_id_width' => 60,//序号列的宽度 'filed_id_width' => 60,//序号列的宽度
'filed_name_width' => 120,//玩家名称的宽度 'filed_name_width' => 120,//玩家名称的宽度
'filed_data_width' => 100,//数据列的宽度 'filed_data_width' => 120,//数据列的宽度
'table_header' => ['', '星期', '日期', '上课时间', '学科', '教师', '课时'],//表头文字 'table_header' => ['', '星期', '日期', '上课时间', '学科', '教师', '课时'],//表头文字
'column_text_offset_arr' => [45, 70, 70, 80, 55, 65, 65],//表头文字左偏移量 'column_text_offset_arr' => [45, 70, 70, 100, 55, 65, 65],//表头文字左偏移量
'row_text_offset_arr' => [50, 110, 90, 90, 90, 90, 90],//数据列文字左偏移量 'row_text_offset_arr' => [50, 110, 90, 110, 90, 90, 90],//数据列文字左偏移量
]; ];
$base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度 $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'];//图片高度 $base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
@ -191,6 +191,13 @@ class StudentController extends BaseController
mkdir($base['file_path'], 0777, true);//可创建多级目录 mkdir($base['file_path'], 0777, true);//可创建多级目录
} }
imagepng($img, $save_path);//输出图片输出png使用imagepng方法输出gif使用imagegif方法 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
]);
} }

View File

@ -3,7 +3,9 @@
namespace app\api\controller; namespace app\api\controller;
use app\BaseController; use app\BaseController;
use app\common\model\TeacherScheduleTime;
use app\common\service\TeacherScheduleTimeService; use app\common\service\TeacherScheduleTimeService;
use app\constant\ResponseCode;
use support\Request; use support\Request;
class TeacherScheduleTimeController extends BaseController class TeacherScheduleTimeController extends BaseController
@ -33,4 +35,153 @@ class TeacherScheduleTimeController extends BaseController
return $this->json($res); 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)
{
$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'],
];
$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' => ['', '星期', '日期', '上课时间', '学科', '教师', '学生','课时'],//表头文字
'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'], '时间:' . $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,
]);
}
public function getWeek($date)
{
$week_array = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
$week = date("w", $date);
return $week_array[$week];
}
} }

View File

@ -37,10 +37,12 @@ class TeacherFreeTimeService
$free_time = json_decode($data['free_time'], true); $free_time = json_decode($data['free_time'], true);
$total_count = 0; $total_count = 0;
$exit_count = 0; $exit_count = 0;
$err_free_count = 0; $err_free_count = 0;
$has_msg = false;
foreach ($free_time as $item) { foreach ($free_time as $item) {
$free_date = $item['day']; $free_date = $item['day'];
foreach ($item['times'] as $val){ foreach ($item['times'] as $val){
@ -68,13 +70,20 @@ class TeacherFreeTimeService
//判断是否已经存在 //判断是否已经存在
$exit = TeacherFreeTime::where($free_data)->findOrEmpty(); $exit = TeacherFreeTime::where($free_data)->findOrEmpty();
if(!$exit->isEmpty()){ if(!$exit->isEmpty()){
$msg .= '【' + $free_data['en_time'] + '】';
$has_msg = true;
continue; continue;
} }
$res = TeacherFreeTime::create($free_data); $res = TeacherFreeTime::create($free_data);
if(!$res){ if(!$res){
throw new Exception('保存失败'); throw new Exception('保存失败');
} }
if($has_msg){
$msg = $msg + '已存在添加';
}
} }
} }