From 7529061de582cc543897fb6df5fc082629e0fa56 Mon Sep 17 00:00:00 2001 From: Eric Li Date: Thu, 19 Jun 2025 12:02:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=8C=E5=8F=B0=E5=9C=96?= =?UTF-8?q?=E6=AA=94=E6=97=8B=E8=BD=89=E5=8A=9F=E8=83=BD=E3=80=82=E5=8A=A0?= =?UTF-8?q?=E5=BC=B7=E5=A0=B1=E5=90=8D=E5=9C=B0=E5=9D=80=E6=AA=A2=E6=9F=A5?= =?UTF-8?q?=E3=80=82=E4=BF=AE=E6=AD=A3=E5=89=8D=E5=8F=B0=E6=96=87=E5=AD=97?= =?UTF-8?q?=E3=80=82=E5=A2=9E=E5=8A=A0=E5=89=8D=E5=BE=8C=E5=8F=B0=E5=A0=B1?= =?UTF-8?q?=E5=90=8D=E6=AC=84=E4=BD=8D=E3=80=82=E8=A8=AD=E5=AE=9A=E5=A0=B1?= =?UTF-8?q?=E5=90=8D=E6=AC=84=E4=BD=8DTWID=E7=82=BAUNIQUE=E3=80=82?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=89=8D=E5=8F=B0=E5=A0=B1=E5=90=8D=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=A3=E7=BA=8C=E9=80=81=E5=87=BA=E7=9A=84=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Fields/IframeField.php | 3 ++ .../EventHealthAllowanceCrudController.php | 6 +-- .../EventImprovedHealthCrudController.php | 41 +++++++++++++++++-- .../Admin/EventMetabolismCrudController.php | 6 +-- .../Controllers/Admin/StorageController.php | 41 +++++++++++++++++++ .../HealthAllowanceFillFormController.php | 10 +++++ .../ImprovedHealthFillFormController.php | 10 +++++ .../MetabolismFillFormController.php | 10 +++++ .../Requests/EventHealthAllowanceRequest.php | 2 +- .../Requests/EventImprovedHealthRequest.php | 4 +- app/Http/Requests/EventMetabolismRequest.php | 2 +- .../health_allowance_fill_form.blade.php | 4 ++ .../views/improved_health_fill_form.blade.php | 33 +++++++++++++++ resources/views/link.blade.php | 2 +- .../views/metabolism_fill_form.blade.php | 3 ++ .../backpack/crud/fields/iframe.blade.php | 5 ++- routes/backpack/custom.php | 4 ++ 17 files changed, 171 insertions(+), 15 deletions(-) diff --git a/app/Fields/IframeField.php b/app/Fields/IframeField.php index 17503a6..3c17ca3 100644 --- a/app/Fields/IframeField.php +++ b/app/Fields/IframeField.php @@ -21,11 +21,14 @@ class IframeField ? $options['url'](CrudPanelFacade::getFacadeRoot()) : ($options['url'] ?? null); + $imageRotation90Url = str_replace('/storage/', '/storage/image-rotation90/', $url); + $field = [ 'name' => $name, 'label' => $label, 'type' => 'iframe', 'url' => $url, // URL to display in iframe + 'image-rotation-url' => $imageRotation90Url, 'width' => $options['width'] ?? '', // Iframe width 'height' => $options['height'] ?? '', // Iframe height 'extra_attributes' => $options['extra_attributes'] ?? [], // Additional iframe attributes diff --git a/app/Http/Controllers/Admin/EventHealthAllowanceCrudController.php b/app/Http/Controllers/Admin/EventHealthAllowanceCrudController.php index 076d915..8fde7de 100644 --- a/app/Http/Controllers/Admin/EventHealthAllowanceCrudController.php +++ b/app/Http/Controllers/Admin/EventHealthAllowanceCrudController.php @@ -51,7 +51,7 @@ class EventHealthAllowanceCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], ], [ 'name' => 'hospital_name', @@ -143,7 +143,7 @@ class EventHealthAllowanceCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], ], [ 'name' => 'twid', @@ -207,7 +207,7 @@ class EventHealthAllowanceCrudController extends CrudController 'name' => 'check_state', 'label' => "審核狀態", 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], 'allows_null' => false, 'default' => '1', ], diff --git a/app/Http/Controllers/Admin/EventImprovedHealthCrudController.php b/app/Http/Controllers/Admin/EventImprovedHealthCrudController.php index b3b377b..b009f80 100644 --- a/app/Http/Controllers/Admin/EventImprovedHealthCrudController.php +++ b/app/Http/Controllers/Admin/EventImprovedHealthCrudController.php @@ -50,7 +50,13 @@ class EventImprovedHealthCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], + ], + [ + 'name' => 'disease_type', + 'label' => '疾病類別', + 'type' => 'select_from_array', + 'options' => ['1' => '代謝症候群', '2' => '糖尿病', '3' => '初期慢性腎臟病', '4' => '糖尿病及初期慢性腎臟病'], ], [ 'name' => 'hospital_name', @@ -102,11 +108,21 @@ class EventImprovedHealthCrudController extends CrudController 1 => '未審核', 2 => '通過  〇', 3 => '未通過 ✖' - ]) ->whenActive(function($value) { CRUD::addClause('where', 'check_state', $value); }); + CRUD::filter('疾病類別') + ->type('dropdown') + ->values([ + 1 => '代謝症候群', + 2 => '糖尿病', + 3 => '初期慢性腎臟病', + 4 => '糖尿病及初期慢性腎臟病' + ]) + ->whenActive(function($value) { + CRUD::addClause('where', 'disease_type', $value); + }); CRUD::filter('ID') ->type('text') ->whenActive(function($value) { @@ -142,7 +158,7 @@ class EventImprovedHealthCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], ], [ 'name' => 'twid', @@ -154,6 +170,12 @@ class EventImprovedHealthCrudController extends CrudController 'label' => '姓名', 'type' => 'text' ], + [ + 'name' => 'disease_type', + 'label' => '疾病類別', + 'type' => 'select_from_array', + 'options' => ['1' => '代謝症候群', '2' => '糖尿病', '3' => '初期慢性腎臟病', '4' => '糖尿病及初期慢性腎臟病'], + ], [ 'name' => 'hospital_name', 'label' => '就醫院所', @@ -172,6 +194,12 @@ class EventImprovedHealthCrudController extends CrudController { CRUD::setValidation(EventImprovedHealthRequest::class); $this->crud->addFields([ + [ + 'name' => 'disease_type', + 'label' => '疾病類別', + 'type' => 'select_from_array', + 'options' => ['1' => '代謝症候群', '2' => '糖尿病', '3' => '初期慢性腎臟病', '4' => '糖尿病及初期慢性腎臟病'], + ], [ 'name' => 'hospital_name', 'label' => '就醫院所', @@ -206,7 +234,7 @@ class EventImprovedHealthCrudController extends CrudController 'name' => 'check_state', 'label' => "審核狀態", 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], 'allows_null' => false, 'default' => '1', ], @@ -311,6 +339,9 @@ class EventImprovedHealthCrudController extends CrudController $response = $this->traitUpdate(); // do something after save $entry = $this->crud->getCurrentEntry(); + + $diseaseTypes = ['1' => '代謝症候群', '2' => '糖尿病', '3' => '初期慢性腎臟病', '4' => '糖尿病及初期慢性腎臟病']; + if ($entry->check_state != $org_check_state) { switch($entry->check_state) { case '2': //過通 @@ -320,6 +351,7 @@ class EventImprovedHealthCrudController extends CrudController "body" => "恭喜您審核通過!" ."\n\n登記資料:" ."\n流水號: B-".str_pad($entry->id, 6, '0', STR_PAD_LEFT) + ."\n疾病類別:".$diseaseTypes[$entry->disease_type] ."\n就醫院所:".$entry->hospital_name ."\n姓名:".$entry->name ."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4) @@ -343,6 +375,7 @@ class EventImprovedHealthCrudController extends CrudController ."\n理由:".$entry->check_reson ."\n\n登記資料:" ."\n流水號: B-".str_pad($entry->id, 6, '0', STR_PAD_LEFT) + ."\n疾病類別:".$diseaseTypes[$entry->disease_type] ."\n就醫院所:".$entry->hospital_name ."\n姓名:".$entry->name ."\n身份證字號:".substr($entry->twid,0,2)."xxxx".substr($entry->twid,-4) diff --git a/app/Http/Controllers/Admin/EventMetabolismCrudController.php b/app/Http/Controllers/Admin/EventMetabolismCrudController.php index f1753ac..514ff3d 100644 --- a/app/Http/Controllers/Admin/EventMetabolismCrudController.php +++ b/app/Http/Controllers/Admin/EventMetabolismCrudController.php @@ -51,7 +51,7 @@ class EventMetabolismCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], ], [ 'name' => 'hospital_name', @@ -143,7 +143,7 @@ class EventMetabolismCrudController extends CrudController 'name' => 'check_state', 'label' => '審核狀態', 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], ], [ 'name' => 'twid', @@ -208,7 +208,7 @@ class EventMetabolismCrudController extends CrudController 'name' => 'check_state', 'label' => "審核狀態", 'type' => 'select_from_array', - 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖'], + 'options' => ['1' => '未審核  ', '2' => '通過  〇', '3' => '未通過 ✖', '4' => '重覆資料(僅標記)'], 'allows_null' => false, 'default' => '1', ], diff --git a/app/Http/Controllers/Admin/StorageController.php b/app/Http/Controllers/Admin/StorageController.php index 68633f1..00bf3c5 100644 --- a/app/Http/Controllers/Admin/StorageController.php +++ b/app/Http/Controllers/Admin/StorageController.php @@ -6,6 +6,8 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Response; +use Intervention\Image\Drivers\Gd\Driver; +use Intervention\Image\ImageManager; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -38,4 +40,43 @@ class StorageController extends Controller 'Content-Security-Policy' => "frame-ancestors 'self'", // Allow iframe on same domain ]); } + + public function imageRotation90(Request $request, $file_path) + { + $allowed_directory = 'uploads'; + $file_path = str_replace(['../', '..\\'], '', $file_path); + $full_path = storage_path("app/{$allowed_directory}/{$file_path}"); + + if (is_dir($full_path)) { + throw new NotFoundHttpException('檔案不存在'); + } + + if (!Storage::disk('local')->exists("{$allowed_directory}/{$file_path}")) { + throw new NotFoundHttpException('檔案不存在'); + } + + $real_path = realpath($full_path); + $allowed_base_path = realpath(storage_path("app/{$allowed_directory}")); + if (!$real_path || strpos($real_path, $allowed_base_path) !== 0) { + throw new AccessDeniedHttpException('無權訪問該檔案'); + } + $mime_type = mime_content_type($full_path) ?: 'application/octet-stream'; + + $allowedMimeTypes = [ + 'image/png', // PNG + 'image/jpeg', // JPG/JPEG + 'image/git' // git + ]; + + if (!in_array($mime_type, $allowedMimeTypes)) { + throw new \Exception('檔案類型錯誤,只接受.jpg/.jpeg/.png/.gif'); + } + + $manager = new ImageManager(Driver::class); + $image = $manager->read($full_path); + $image = $image->rotate(-90); + $image->save(quality:100); + + return []; + } } diff --git a/app/Http/Controllers/HealthAllowanceFillFormController.php b/app/Http/Controllers/HealthAllowanceFillFormController.php index 0d70c4d..f12b038 100644 --- a/app/Http/Controllers/HealthAllowanceFillFormController.php +++ b/app/Http/Controllers/HealthAllowanceFillFormController.php @@ -53,6 +53,11 @@ class HealthAllowanceFillFormController extends Controller } else { $enable = false; } + + $passCount = EventHealthAllowance::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + $enable = false; + } } return view('health_allowance', [ @@ -95,6 +100,11 @@ class HealthAllowanceFillFormController extends Controller } else { throw new \Exception('活動已截止。'); } + + $passCount = EventHealthAllowance::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + throw new \Exception('活動已截止。'); + } } DB::beginTransaction(); diff --git a/app/Http/Controllers/ImprovedHealthFillFormController.php b/app/Http/Controllers/ImprovedHealthFillFormController.php index 68f1b79..d64f44e 100644 --- a/app/Http/Controllers/ImprovedHealthFillFormController.php +++ b/app/Http/Controllers/ImprovedHealthFillFormController.php @@ -54,6 +54,11 @@ class ImprovedHealthFillFormController extends Controller } else { $enable = false; } + + $passCount = EventImprovedHealth::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + $enable = false; + } } return view('improved_health', [ @@ -96,6 +101,10 @@ class ImprovedHealthFillFormController extends Controller } else { throw new \Exception('活動已截止。'); } + $passCount = EventImprovedHealth::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + throw new \Exception('活動已截止。'); + } } DB::beginTransaction(); @@ -116,6 +125,7 @@ class ImprovedHealthFillFormController extends Controller if ($eventItem->check_state == 2) { throw new \Exception('您已經登記審查通過。'); } + $eventItem->disease_type = $request->input('disease_type'); $eventItem->hospital_name = $request->input('hospital_name'); $eventItem->name = $request->input('name'); $eventItem->phone = $request->input('phone'); diff --git a/app/Http/Controllers/MetabolismFillFormController.php b/app/Http/Controllers/MetabolismFillFormController.php index 4b95209..d1c6a54 100644 --- a/app/Http/Controllers/MetabolismFillFormController.php +++ b/app/Http/Controllers/MetabolismFillFormController.php @@ -53,6 +53,11 @@ class MetabolismFillFormController extends Controller } else { $enable = false; } + + $passCount = EventMetabolism::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + $enable = false; + } } return view('metabolism', [ @@ -95,6 +100,11 @@ class MetabolismFillFormController extends Controller } else { throw new \Exception('活動已截止。'); } + + $passCount = EventMetabolism::where('check_state', 2)->count(); + if ($passCount >= $eventInfo['limit']) { + throw new \Exception('活動已截止。'); + } } DB::beginTransaction(); diff --git a/app/Http/Requests/EventHealthAllowanceRequest.php b/app/Http/Requests/EventHealthAllowanceRequest.php index 44046f9..41c218f 100644 --- a/app/Http/Requests/EventHealthAllowanceRequest.php +++ b/app/Http/Requests/EventHealthAllowanceRequest.php @@ -51,7 +51,7 @@ class EventHealthAllowanceRequest extends FormRequest return [ 'twid.is_n_i' => '身份證字號驗證有誤', 'phone.phone' => '行動電話驗證有誤', - 'address.regex' => '收件地址格式有誤,請填寫完整。', + 'address.regex' => '收件地址格式有誤,請確定「縣/市」、「鄉/鎮/市/區」、「村/里」及「地址」是否正確。', 'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位' ]; } diff --git a/app/Http/Requests/EventImprovedHealthRequest.php b/app/Http/Requests/EventImprovedHealthRequest.php index f445ec8..097edf3 100644 --- a/app/Http/Requests/EventImprovedHealthRequest.php +++ b/app/Http/Requests/EventImprovedHealthRequest.php @@ -26,6 +26,7 @@ class EventImprovedHealthRequest extends FormRequest public function rules() { return [ + 'disease_type' => 'required', 'hospital_name' => 'required|min:2', 'name' => 'required|min:1|max:128', 'twid' => 'required|isNI', @@ -44,6 +45,7 @@ class EventImprovedHealthRequest extends FormRequest public function attributes() { return [ + 'disease_type' => '疾病類別', 'hospital_name' => '就醫院所', 'name' => '姓名', 'twid' => '身份證字號', @@ -63,7 +65,7 @@ class EventImprovedHealthRequest extends FormRequest return [ 'twid.is_n_i' => '身份證字號驗證有誤', 'phone.phone' => '行動電話驗證有誤', - 'address.regex' => '收件地址格式有誤,請填寫完整。', + 'address.regex' => '收件地址格式有誤,請確定「縣/市」、「鄉/鎮/市/區」、「村/里」及「地址」是否正確。', 'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位' ]; } diff --git a/app/Http/Requests/EventMetabolismRequest.php b/app/Http/Requests/EventMetabolismRequest.php index 3a3f5cd..759d95f 100644 --- a/app/Http/Requests/EventMetabolismRequest.php +++ b/app/Http/Requests/EventMetabolismRequest.php @@ -63,7 +63,7 @@ class EventMetabolismRequest extends FormRequest return [ 'twid.is_n_i' => '身份證字號驗證有誤', 'phone.phone' => '行動電話驗證有誤', - 'address.regex' => '收件地址格式有誤,請填寫完整。', + 'address.regex' => '收件地址格式有誤,請確定「縣/市」、「鄉/鎮/市/區」、「村/里」及「地址」是否正確。', 'check_reson.required_if' => '當審核狀態為「未通過」時,必需填寫「審核回應」欄位' ]; } diff --git a/resources/views/health_allowance_fill_form.blade.php b/resources/views/health_allowance_fill_form.blade.php index 744f8c6..d35562a 100644 --- a/resources/views/health_allowance_fill_form.blade.php +++ b/resources/views/health_allowance_fill_form.blade.php @@ -158,6 +158,10 @@