优化
This commit is contained in:
parent
960f7720be
commit
e5794d4822
@ -7,6 +7,7 @@ use app\common\model\TeacherScheduleTime;
|
|||||||
use app\common\service\TeacherScheduleTimeService;
|
use app\common\service\TeacherScheduleTimeService;
|
||||||
use app\constant\ResponseCode;
|
use app\constant\ResponseCode;
|
||||||
use support\Request;
|
use support\Request;
|
||||||
|
use think\Exception;
|
||||||
|
|
||||||
class TeacherScheduleTimeController extends BaseController
|
class TeacherScheduleTimeController extends BaseController
|
||||||
{
|
{
|
||||||
@ -47,132 +48,146 @@ class TeacherScheduleTimeController extends BaseController
|
|||||||
public function downloadSchedule(Request $request)
|
public function downloadSchedule(Request $request)
|
||||||
{
|
{
|
||||||
|
|
||||||
$request_data = $request->post();
|
try {
|
||||||
$month = date('Y-m', strtotime($request_data['date']));
|
if (empty((array)$request->teacher)) {
|
||||||
$student_schedule = TeacherScheduleTime::where(['teacher_id' => $request->teacher->id, 'is_publish' => 1])
|
throw new Exception('请教师登陆后再试');
|
||||||
->where(['month' => $month])
|
}
|
||||||
->with(['teacher', 'subject', 'studentSchedule'])
|
|
||||||
->order('start_time asc')
|
|
||||||
->select()->toArray();
|
|
||||||
|
|
||||||
$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']){
|
$array = [];
|
||||||
$student = [];
|
$stu_nmae = '';
|
||||||
foreach ($v['studentSchedule'] as $k1 => $v1) {
|
|
||||||
if($v1['is_publish']){
|
foreach ($student_schedule as $k => &$v) {
|
||||||
$student[] = $v1['student_name'];
|
|
||||||
|
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[] = [
|
$params = [
|
||||||
'week' => $this->getWeek(strtotime($v['date'])),
|
'row' => count($student_schedule) + 1,//数据的行数
|
||||||
'date' => $v['date'],
|
'file_name' => time() . '.png',
|
||||||
'time_on' => $v['time'],
|
'title' => $stu_nmae,
|
||||||
'subject' => $v['english_name'],
|
'table_time' => $month,
|
||||||
'teacher_name' => $v['teacher_name'],
|
'data' => $array,
|
||||||
'student_name' => implode(',', $student),
|
|
||||||
'time_num' => $v['hour'] . '/h',
|
|
||||||
];
|
];
|
||||||
$stu_nmae = $v['teacher_name'];
|
$file_path = '/files/images/teacher_schedule/' . $month . "/{$request->teacher->id}/";
|
||||||
}
|
$base = [
|
||||||
|
'border' => 10,//图片外边框
|
||||||
$params = [
|
'file_path' => public_path($file_path),//图片保存路径
|
||||||
'row' => count($student_schedule) + 1,//数据的行数
|
'title_height' => 30,//报表名称高度
|
||||||
'file_name' => time() . '.png',
|
'title_font_size' => 16,//报表名称字体大小
|
||||||
'title' => $stu_nmae,
|
'font_ulr' => public_path('/111.ttf'),//字体文件路径
|
||||||
'table_time' => $month,
|
'text_size' => 12,//正文字体大小
|
||||||
'data' => $array,
|
'row_hight' => 30,//每行数据行高
|
||||||
];
|
'filed_id_width' => 60,//序号列的宽度
|
||||||
$file_path = '/files/images/teacher_schedule/' . $month . "/{$request->teacher->id}/";
|
'filed_name_width' => 120,//玩家名称的宽度
|
||||||
$base = [
|
'filed_data_width' => 120,//数据列的宽度
|
||||||
'border' => 10,//图片外边框
|
'table_header' => ['', 'Week', 'Date', 'Time', 'Subject', 'Teacher', 'Student','Duration'],//表头文字
|
||||||
'file_path' => public_path($file_path),//图片保存路径
|
'column_text_offset_arr' => [45, 70, 70, 90, 55, 65, 65, 65],//表头文字左偏移量
|
||||||
'title_height' => 30,//报表名称高度
|
'row_text_offset_arr' => [50, 110, 90, 110, 90, 90, 90, 90],//数据列文字左偏移量
|
||||||
'title_font_size' => 16,//报表名称字体大小
|
];
|
||||||
'font_ulr' => public_path('/111.ttf'),//字体文件路径
|
$base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
|
||||||
'text_size' => 12,//正文字体大小
|
$base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
|
||||||
'row_hight' => 30,//每行数据行高
|
$border_top = $base['border'] + $base['title_height'];//表格顶部高度
|
||||||
'filed_id_width' => 60,//序号列的宽度
|
$border_bottom = $base['img_height'] - $base['border'];//表格底部高度
|
||||||
'filed_name_width' => 120,//玩家名称的宽度
|
$base['column_x_arr'] = [
|
||||||
'filed_data_width' => 120,//数据列的宽度
|
$base['border'] + $base['filed_id_width'],//第一列边框线x轴像素 70/2+10
|
||||||
'table_header' => ['', 'Week', 'Date', 'Time', 'Subject', 'Teacher', 'Student','Duration'],//表头文字
|
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素 190
|
||||||
'column_text_offset_arr' => [45, 70, 70, 90, 55, 65, 65, 65],//表头文字左偏移量
|
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
|
||||||
'row_text_offset_arr' => [50, 110, 90, 110, 90, 90, 90, 90],//数据列文字左偏移量
|
$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['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
|
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
|
||||||
$base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
|
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
|
||||||
$border_top = $base['border'] + $base['title_height'];//表格顶部高度
|
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 6,//第五列边框线x轴像素
|
||||||
$border_bottom = $base['img_height'] - $base['border'];//表格底部高度
|
];
|
||||||
$base['column_x_arr'] = [
|
$img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
|
||||||
$base['border'] + $base['filed_id_width'],//第一列边框线x轴像素 70/2+10
|
$bg_color = imagecolorallocate($img, 255, 255, 255);//设定图片背景色
|
||||||
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素 190
|
$text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
|
||||||
$base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
|
$border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
|
||||||
$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);//设定边框颜色
|
// $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
|
||||||
imagefill($img, 0, 0, $bg_color);//填充图片背景色
|
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'], $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);//画矩形
|
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) {
|
foreach ($base['column_x_arr'] as $key => $x) {
|
||||||
imageline($img, $x, $border_top, $x, $border_bottom, $border_coler);//画纵线
|
imageline($img, $x, $border_top, $x, $border_bottom, $border_coler);//画纵线
|
||||||
$x = $x - $base['column_text_offset_arr'][$key] + 1;
|
$x = $x - $base['column_text_offset_arr'][$key] + 1;
|
||||||
// echo $x;echo "<br>";
|
// echo $x;echo "<br>";
|
||||||
$y = $border_top + $base['row_hight'] - 8;
|
$y = $border_top + $base['row_hight'] - 8;
|
||||||
$text = $base['table_header'][$key];
|
$text = $base['table_header'][$key];
|
||||||
imagettftext($img, $base['text_size'], 0, $x, $y, $text_coler, $base['font_ulr'], $text);//写入表头文字
|
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数据
|
|
||||||
}
|
}
|
||||||
|
//画表格横线
|
||||||
|
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,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user