From e5794d4822330a13947d715942496190675ef180 Mon Sep 17 00:00:00 2001 From: Dai Date: Mon, 9 Sep 2024 15:51:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TeacherScheduleTimeController.php | 243 ++++++++++-------- 1 file changed, 129 insertions(+), 114 deletions(-) diff --git a/app/api/controller/TeacherScheduleTimeController.php b/app/api/controller/TeacherScheduleTimeController.php index fa8b7dc..dab1814 100644 --- a/app/api/controller/TeacherScheduleTimeController.php +++ b/app/api/controller/TeacherScheduleTimeController.php @@ -7,6 +7,7 @@ use app\common\model\TeacherScheduleTime; use app\common\service\TeacherScheduleTimeService; use app\constant\ResponseCode; use support\Request; +use think\Exception; class TeacherScheduleTimeController extends BaseController { @@ -47,132 +48,146 @@ class TeacherScheduleTimeController extends BaseController 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(); + try { + if (empty((array)$request->teacher)) { + throw new Exception('请教师登陆后再试'); + } - $array = []; - $stu_nmae = ''; - foreach ($student_schedule as $k => &$v) { + $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(); - if($v['studentSchedule']){ - $student = []; - foreach ($v['studentSchedule'] as $k1 => $v1) { - if($v1['is_publish']){ - $student[] = $v1['student_name']; + $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']; } - $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', + $params = [ + 'row' => count($student_schedule) + 1,//数据的行数 + 'file_name' => time() . '.png', + 'title' => $stu_nmae, + 'table_time' => $month, + 'data' => $array, ]; - $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);//设定边框颜色 + $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 "
"; - $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数据 + 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 "
"; + $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() + ]); } - //计算标题写入起始位置 - $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, - ]); }