From 5cae572916b6379e10560fb33cd52a0b9f46976f Mon Sep 17 00:00:00 2001 From: mahdahar <89adham@gmail.com> Date: Mon, 19 Jan 2026 06:37:37 +0700 Subject: [PATCH] Refactor application structure, unify entry management, and overhaul UI with DaisyUI - Reorganized Architecture: Moved Master data management (Controls, Departments, Tests) to a dedicated Master namespace/directory for better modularity. - Unified Data Entry: Consolidated daily and monthly QC entry views and logic into a single streamlined system. - UI/UX Modernization: - Integrated DaisyUI and Alpine.js for a responsive, themeable, and interactive experience. - Replaced legacy layouts with a new DaisyUI-based template. - Updated branding with new logo and favicon assets. - Cleaned up deprecated JavaScript assets (app.js, charts.js, tables.js). - Backend Enhancements: - Added `ControlEntryModel` and `ResultCommentsController` for improved data handling and auditing. - Updated routing to support the new controller structure and consolidated API endpoints. - Documentation & Assets: - Added [docs/PRD.md](cci:7://file:///c:/www/tinyqc/docs/PRD.md:0:0-0:0) and [docs/llms.txt](cci:7://file:///c:/www/tinyqc/docs/llms.txt:0:0-0:0) for project context and requirements. - Included database schema scripts and backups in the `backup/` directory. - Cleanup: Removed legacy TUI progress files and unused commands. --- app/Config/Routes.php | 43 + app/Controllers/Api/ControlApiController.php | 148 -- app/Controllers/Api/EntryApiController.php | 252 --- app/Controllers/Control.php | 36 - app/Controllers/Dashboard.php | 28 - app/Controllers/Dept.php | 25 - app/Controllers/Entry.php | 32 - .../MasterControlsController.php} | 74 +- .../MasterDeptsController.php} | 69 +- .../Master/MasterTestsController.php | 101 + app/Controllers/PageController.php | 157 +- app/Controllers/Qc/ControlTestsController.php | 99 + .../Qc/ResultCommentsController.php | 99 + app/Controllers/Qc/ResultsController.php | 99 + app/Controllers/Report.php | 26 - app/Controllers/Test.php | 29 - .../2026-01-14-000001_CreateCmodQcTables.php | 282 --- ...2026-01-17-000001-QualityControlSystem.php | 107 + ...2026-01-18-000001-QualityControlSystem.php | 110 + ...-01-18-000001-RenameDictToMasterTables.php | 45 + app/Database/Migrations/test.php | 10 + app/Database/Seeds/CmodQcSeeder.php | 322 --- app/Models/ControlModel.php | 41 - app/Models/ControlTestModel.php | 32 - app/Models/DailyResultModel.php | 61 - app/Models/DeptModel.php | 16 - app/Models/DictControlModel.php | 53 - app/Models/DictDeptModel.php | 16 - app/Models/DictTestModel.php | 29 - app/Models/Master/MasterControlsModel.php | 32 + app/Models/Master/MasterDeptsModel.php | 27 + app/Models/Master/MasterTestsModel.php | 33 + app/Models/MonthlyCommentModel.php | 38 - app/Models/Qc/ControlTestsModel.php | 30 + app/Models/Qc/ResultCommentsModel.php | 31 + app/Models/Qc/ResultsModel.php | 31 + app/Models/ResultCommentModel.php | 38 - app/Models/ResultModel.php | 72 - app/Models/TestModel.php | 29 - app/Views/control/dialog_form.php | 95 - app/Views/control/form.php | 46 - app/Views/control/index.php | 261 --- app/Views/dashboard.php | 181 +- app/Views/dept/dialog_form.php | 60 - app/Views/dept/index.php | 187 -- app/Views/entry/daily.php | 258 +-- app/Views/entry/index.php | 40 + app/Views/entry/monthly.php | 498 ----- app/Views/layout/form_layout.php | 65 - app/Views/layout/main_layout.php | 371 ++-- .../master/control/dialog_control_form.php | 83 + app/Views/master/control/index.php | 242 +++ app/Views/master/dept/dialog_dept_form.php | 44 + app/Views/master/dept/index.php | 231 ++ app/Views/master/test/dialog_test_form.php | 113 + app/Views/master/test/index.php | 240 +++ app/Views/report/index.php | 145 +- app/Views/report/view.php | 290 +-- app/Views/test/dialog_form.php | 89 - app/Views/test/index.php | 231 -- backup/qc20260114.bak | Bin 0 -> 8625664 bytes backup/script.sql | Bin 0 -> 9926 bytes backup/script_utf8.sql | 170 ++ docs/PRD.md | 1009 +++++++++ docs/llms.txt | 1852 +++++++++++++++++ docs/prd.json | 221 ++ index.json | 238 +++ public/images/favicon.png | Bin 0 -> 318028 bytes public/images/favicon.svg | 18 + public/images/logo.png | Bin 0 -> 158287 bytes public/js/app.js | 88 - public/js/charts.js | 128 -- public/js/tables.js | 186 -- public/template.html | 450 ++++ 74 files changed, 6164 insertions(+), 4768 deletions(-) delete mode 100644 app/Controllers/Api/ControlApiController.php delete mode 100644 app/Controllers/Api/EntryApiController.php delete mode 100644 app/Controllers/Control.php delete mode 100644 app/Controllers/Dashboard.php delete mode 100644 app/Controllers/Dept.php delete mode 100644 app/Controllers/Entry.php rename app/Controllers/{Api/TestApiController.php => Master/MasterControlsController.php} (52%) rename app/Controllers/{Api/DeptApiController.php => Master/MasterDeptsController.php} (54%) create mode 100644 app/Controllers/Master/MasterTestsController.php create mode 100644 app/Controllers/Qc/ControlTestsController.php create mode 100644 app/Controllers/Qc/ResultCommentsController.php create mode 100644 app/Controllers/Qc/ResultsController.php delete mode 100644 app/Controllers/Report.php delete mode 100644 app/Controllers/Test.php delete mode 100644 app/Database/Migrations/2026-01-14-000001_CreateCmodQcTables.php create mode 100644 app/Database/Migrations/2026-01-17-000001-QualityControlSystem.php create mode 100644 app/Database/Migrations/2026-01-18-000001-QualityControlSystem.php create mode 100644 app/Database/Migrations/2026-01-18-000001-RenameDictToMasterTables.php create mode 100644 app/Database/Migrations/test.php delete mode 100644 app/Database/Seeds/CmodQcSeeder.php delete mode 100644 app/Models/ControlModel.php delete mode 100644 app/Models/ControlTestModel.php delete mode 100644 app/Models/DailyResultModel.php delete mode 100644 app/Models/DeptModel.php delete mode 100644 app/Models/DictControlModel.php delete mode 100644 app/Models/DictDeptModel.php delete mode 100644 app/Models/DictTestModel.php create mode 100644 app/Models/Master/MasterControlsModel.php create mode 100644 app/Models/Master/MasterDeptsModel.php create mode 100644 app/Models/Master/MasterTestsModel.php delete mode 100644 app/Models/MonthlyCommentModel.php create mode 100644 app/Models/Qc/ControlTestsModel.php create mode 100644 app/Models/Qc/ResultCommentsModel.php create mode 100644 app/Models/Qc/ResultsModel.php delete mode 100644 app/Models/ResultCommentModel.php delete mode 100644 app/Models/ResultModel.php delete mode 100644 app/Models/TestModel.php delete mode 100644 app/Views/control/dialog_form.php delete mode 100644 app/Views/control/form.php delete mode 100644 app/Views/control/index.php delete mode 100644 app/Views/dept/dialog_form.php delete mode 100644 app/Views/dept/index.php create mode 100644 app/Views/entry/index.php delete mode 100644 app/Views/entry/monthly.php delete mode 100644 app/Views/layout/form_layout.php create mode 100644 app/Views/master/control/dialog_control_form.php create mode 100644 app/Views/master/control/index.php create mode 100644 app/Views/master/dept/dialog_dept_form.php create mode 100644 app/Views/master/dept/index.php create mode 100644 app/Views/master/test/dialog_test_form.php create mode 100644 app/Views/master/test/index.php delete mode 100644 app/Views/test/dialog_form.php delete mode 100644 app/Views/test/index.php create mode 100644 backup/qc20260114.bak create mode 100644 backup/script.sql create mode 100644 backup/script_utf8.sql create mode 100644 docs/PRD.md create mode 100644 docs/llms.txt create mode 100644 docs/prd.json create mode 100644 index.json create mode 100644 public/images/favicon.png create mode 100644 public/images/favicon.svg create mode 100644 public/images/logo.png delete mode 100644 public/js/app.js delete mode 100644 public/js/charts.js delete mode 100644 public/js/tables.js create mode 100644 public/template.html diff --git a/app/Config/Routes.php b/app/Config/Routes.php index e81430f..b608135 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -7,6 +7,9 @@ use CodeIgniter\Router\RouteCollection; */ $routes->get('/', 'PageController::dashboard'); +$routes->get('/master/dept', 'PageController::masterDept'); +$routes->get('/master/test', 'PageController::masterTest'); +$routes->get('/master/control', 'PageController::masterControl'); $routes->get('/dept', 'PageController::dept'); $routes->get('/test', 'PageController::test'); $routes->get('/control', 'PageController::control'); @@ -42,3 +45,43 @@ $routes->group('api', function ($routes) { $routes->post('entry/monthly', 'Api\EntryApiController::saveMonthly'); $routes->post('entry/comment', 'Api\EntryApiController::saveComment'); }); + + $routes->group('api/master', function ($routes) { + $routes->get('depts', 'Master\MasterDeptsController::index'); + $routes->get('depts/(:num)', 'Master\MasterDeptsController::show/$1'); + $routes->post('depts', 'Master\MasterDeptsController::create'); + $routes->patch('depts/(:num)', 'Master\MasterDeptsController::update/$1'); + $routes->delete('depts/(:num)', 'Master\MasterDeptsController::delete/$1'); + + $routes->get('controls', 'Master\MasterControlsController::index'); + $routes->get('controls/(:num)', 'Master\MasterControlsController::show/$1'); + $routes->post('controls', 'Master\MasterControlsController::create'); + $routes->patch('controls/(:num)', 'Master\MasterControlsController::update/$1'); + $routes->delete('controls/(:num)', 'Master\MasterControlsController::delete/$1'); + + $routes->get('tests', 'Master\MasterTestsController::index'); + $routes->get('tests/(:num)', 'Master\MasterTestsController::show/$1'); + $routes->post('tests', 'Master\MasterTestsController::create'); + $routes->patch('tests/(:num)', 'Master\MasterTestsController::update/$1'); + $routes->delete('tests/(:num)', 'Master\MasterTestsController::delete/$1'); +}); + +$routes->group('api/qc', function ($routes) { + $routes->get('control-tests', 'Qc\ControlTestsController::index'); + $routes->get('control-tests/(:num)', 'Qc\ControlTestsController::show/$1'); + $routes->post('control-tests', 'Qc\ControlTestsController::create'); + $routes->patch('control-tests/(:num)', 'Qc\ControlTestsController::update/$1'); + $routes->delete('control-tests/(:num)', 'Qc\ControlTestsController::delete/$1'); + + $routes->get('results', 'Qc\ResultsController::index'); + $routes->get('results/(:num)', 'Qc\ResultsController::show/$1'); + $routes->post('results', 'Qc\ResultsController::create'); + $routes->patch('results/(:num)', 'Qc\ResultsController::update/$1'); + $routes->delete('results/(:num)', 'Qc\ResultsController::delete/$1'); + + $routes->get('result-comments', 'Qc\ResultCommentsController::index'); + $routes->get('result-comments/(:num)', 'Qc\ResultCommentsController::show/$1'); + $routes->post('result-comments', 'Qc\ResultCommentsController::create'); + $routes->patch('result-comments/(:num)', 'Qc\ResultCommentsController::update/$1'); + $routes->delete('result-comments/(:num)', 'Qc\ResultCommentsController::delete/$1'); +}); diff --git a/app/Controllers/Api/ControlApiController.php b/app/Controllers/Api/ControlApiController.php deleted file mode 100644 index e375076..0000000 --- a/app/Controllers/Api/ControlApiController.php +++ /dev/null @@ -1,148 +0,0 @@ -dictControlModel = new DictControlModel(); - $this->controlTestModel = new ControlTestModel(); - $this->rules = [ - 'name' => 'required|min_length[1]', - 'dept_ref_id' => 'required', - ]; - } - - public function index() - { - $keyword = $this->request->getGet('keyword'); - $deptId = $this->request->getGet('deptId'); - try { - $rows = $this->dictControlModel->getWithDept($keyword, $deptId); - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => $rows - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Exception: ' . $e->getMessage()); - } - } - - public function show($id = null) - { - try { - $rows = $this->dictControlModel->where('control_id', $id)->findAll(); - if (empty($rows)) { - return $this->respond([ - 'status' => 'success', - 'message' => 'data not found.' - ], 200); - } - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => $rows - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function getTests($id = null) - { - try { - $rows = $this->controlTestModel->where('control_ref_id', $id)->findAll(); - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => $rows - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function create() - { - $input = $this->request->getJSON(true); - if (!$this->validate($this->rules)) { - return $this->failValidationErrors($this->validator->getErrors()); - } - try { - $controlId = $this->dictControlModel->insert($input, true); - - if (!empty($input['test_ids'])) { - foreach ($input['test_ids'] as $testId) { - $this->controlTestModel->insert([ - 'control_ref_id' => $controlId, - 'test_ref_id' => $testId, - 'mean' => 0, - 'sd' => 0, - ]); - } - } - - return $this->respondCreated([ - 'status' => 'success', - 'message' => $controlId - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function update($id = null) - { - $input = $this->request->getJSON(true); - if (!$this->validate($this->rules)) { - return $this->failValidationErrors($this->validator->getErrors()); - } - try { - $this->dictControlModel->update($id, $input); - - if (!empty($input['test_ids'])) { - $this->controlTestModel->where('control_ref_id', $id)->delete(); - foreach ($input['test_ids'] as $testId) { - $this->controlTestModel->insert([ - 'control_ref_id' => $id, - 'test_ref_id' => $testId, - 'mean' => 0, - 'sd' => 0, - ]); - } - } - - return $this->respond([ - 'status' => 'success', - 'message' => 'update success', - 'data' => $id - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function delete($id = null) - { - try { - $this->controlTestModel->where('control_ref_id', $id)->delete(); - $this->dictControlModel->delete($id); - return $this->respond([ - 'status' => 'success', - 'message' => 'delete success' - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } -} diff --git a/app/Controllers/Api/EntryApiController.php b/app/Controllers/Api/EntryApiController.php deleted file mode 100644 index b8971a1..0000000 --- a/app/Controllers/Api/EntryApiController.php +++ /dev/null @@ -1,252 +0,0 @@ -dictControlModel = new \App\Models\DictControlModel(); - $this->controlTestModel = new \App\Models\ControlTestModel(); - $this->dailyResultModel = new \App\Models\DailyResultModel(); - $this->resultModel = new \App\Models\ResultModel(); - $this->commentModel = new \App\Models\ResultCommentModel(); - } - - public function getControls() - { - try { - $date = $this->request->getGet('date'); - $deptId = $this->request->getGet('deptId'); - - $rows = $this->dictControlModel->getActiveByDate($date, $deptId); - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => $rows - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function getTests() - { - try { - $controlId = $this->request->getGet('controlId'); - - $rows = $this->controlTestModel->getByControl($controlId); - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => $rows - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function saveDaily() - { - $input = $this->request->getJSON(true); - - try { - $resultData = [ - 'control_ref_id' => $input['controlId'] ?? 0, - 'test_ref_id' => $input['testId'] ?? 0, - 'resdate' => $input['resdate'] ?? date('Y-m-d'), - 'resvalue' => $input['resvalue'] ?? '', - 'rescomment' => $input['rescomment'] ?? '', - ]; - - $this->dailyResultModel->saveResult($resultData); - return $this->respond([ - 'status' => 'success', - 'message' => 'save success' - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function saveMonthly() - { - $input = $this->request->getJSON(true); - - try { - $controlId = $input['controlId'] ?? 0; - $yearMonth = $input['yearMonth'] ?? ''; - $operation = $input['operation'] ?? 'replace'; - $tests = $input['tests'] ?? []; - $results = []; - $statistics = []; - $validations = []; - - foreach ($tests as $testData) { - $testId = $testData['testId'] ?? 0; - $resvalues = $testData['resvalue'] ?? []; - $rescomments = $testData['rescomment'] ?? []; - - $controlTest = $this->controlTestModel->getByControlAndTest($controlId, $testId); - $mean = $controlTest['mean'] ?? 0; - $sd = $controlTest['sd'] ?? 0; - $sdLimit = $sd > 0 ? $sd * 2 : 0; - - $testValues = []; - $validCount = 0; - $validSum = 0; - $validSqSum = 0; - - foreach ($resvalues as $day => $value) { - if (!empty($value)) { - $resdate = $yearMonth . '-' . str_pad($day, 2, '0', STR_PAD_LEFT); - $rescomment = $rescomments[$day] ?? ''; - - $resultData = [ - 'control_ref_id' => $controlId, - 'test_ref_id' => $testId, - 'resdate' => $resdate, - 'resvalue' => $value, - 'rescomment' => $rescomment, - ]; - - if ($operation === 'replace') { - $this->resultModel->saveResult($resultData); - } else { - $existing = $this->resultModel->checkExisting($controlId, $testId, $resultData['resdate']); - if (!$existing) { - $this->resultModel->saveResult($resultData); - } - } - - $numValue = (float) $value; - $testValues[] = $numValue; - $validCount++; - $validSum += $numValue; - $validSqSum += $numValue * $numValue; - - $withinLimit = true; - if ($sdLimit > 0) { - $withinLimit = abs($numValue - $mean) <= $sdLimit; - } - - if (!$withinLimit) { - $validations[] = [ - 'testId' => $testId, - 'day' => $day, - 'value' => $value, - 'mean' => $mean, - 'sd' => $sd, - 'status' => 'out_of_range' - ]; - } - } - } - - if ($validCount > 0) { - $calcMean = $validSum / $validCount; - $calcSd = 0; - if ($validCount > 1) { - $variance = ($validSqSum - ($validSum * $validSum) / $validCount) / ($validCount - 1); - $calcSd = $variance > 0 ? sqrt($variance) : 0; - } - $cv = $calcMean > 0 ? ($calcSd / $calcMean) * 100 : 0; - - $statistics[] = [ - 'testId' => $testId, - 'n' => $validCount, - 'mean' => round($calcMean, 3), - 'sd' => round($calcSd, 3), - 'cv' => round($cv, 2) - ]; - } - - $results[] = [ - 'testId' => $testId, - 'saved' => count($resvalues) - ]; - } - - return $this->respond([ - 'status' => 'success', - 'message' => 'save success', - 'data' => [ - 'results' => $results, - 'statistics' => $statistics, - 'validations' => $validations - ] - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function saveComment() - { - $input = $this->request->getJSON(true); - - try { - $commentData = [ - 'control_ref_id' => $input['controlId'] ?? 0, - 'test_ref_id' => $input['testId'] ?? 0, - 'commonth' => $input['commonth'] ?? '', - 'comtext' => $input['comtext'] ?? '', - ]; - - $this->commentModel->saveComment($commentData); - return $this->respond([ - 'status' => 'success', - 'message' => 'save success' - ]); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } - - public function getMonthlyData() - { - $controlId = $this->request->getGet('controlId'); - $testId = $this->request->getGet('testId'); - $yearMonth = $this->request->getGet('yearMonth'); - - try { - $results = $this->resultModel->getByMonth($controlId, $testId, $yearMonth); - $comment = $this->commentModel->getByControlTestMonth($controlId, $testId, $yearMonth); - - $formValues = []; - $comments = []; - foreach ($results as $row) { - $day = (int)date('j', strtotime($row['resdate'])); - $formValues[$day] = $row['resvalue']; - if (!empty($row['rescomment'])) { - $comments[$day] = $row['rescomment']; - } - } - - return $this->respond([ - 'status' => 'success', - 'message' => 'fetch success', - 'data' => [ - 'formValues' => $formValues, - 'comments' => $comments, - 'comment' => $comment ? $comment['comtext'] : '' - ] - ], 200); - } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); - } - } -} diff --git a/app/Controllers/Control.php b/app/Controllers/Control.php deleted file mode 100644 index 0969dc6..0000000 --- a/app/Controllers/Control.php +++ /dev/null @@ -1,36 +0,0 @@ -dictControlModel = new DictControlModel(); - $this->controlTestModel = new ControlTestModel(); - $this->dictDeptModel = new DictDeptModel(); - $this->dictTestModel = new DictTestModel(); - } - - public function index(): string - { - return view('control/index', [ - 'title' => 'Control Dictionary', - 'controls' => $this->dictControlModel->getWithDept(), - 'depts' => $this->dictDeptModel->findAll(), - 'tests' => $this->dictTestModel->getWithDept(), - 'active_menu' => 'control', - 'page_title' => 'Control Dictionary' - ]); - } -} diff --git a/app/Controllers/Dashboard.php b/app/Controllers/Dashboard.php deleted file mode 100644 index fec4041..0000000 --- a/app/Controllers/Dashboard.php +++ /dev/null @@ -1,28 +0,0 @@ - $dictDeptModel->findAll(), - 'tests' => $dictTestModel->getWithDept(), - 'controls' => $dictControlModel->getWithDept(), - 'recent_results' => $resultModel->findAll(20), - 'page_title' => 'Dashboard', - 'active_menu' => 'dashboard' - ]); - } -} diff --git a/app/Controllers/Dept.php b/app/Controllers/Dept.php deleted file mode 100644 index ffd0055..0000000 --- a/app/Controllers/Dept.php +++ /dev/null @@ -1,25 +0,0 @@ -dictDeptModel = new DictDeptModel(); - } - - public function index(): string - { - return view('dept/index', [ - 'title' => 'Department Dictionary', - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'dept', - 'page_title' => 'Department Dictionary' - ]); - } -} diff --git a/app/Controllers/Entry.php b/app/Controllers/Entry.php deleted file mode 100644 index 5bbce67..0000000 --- a/app/Controllers/Entry.php +++ /dev/null @@ -1,32 +0,0 @@ - 'Monthly Entry', - 'depts' => $dictDeptModel->findAll(), - 'active_menu' => 'entry', - 'page_title' => 'Monthly Entry' - ]); - } - - public function daily() - { - $dictDeptModel = new \App\Models\DictDeptModel(); - - return view('entry/daily', [ - 'title' => 'Daily Entry', - 'depts' => $dictDeptModel->findAll(), - 'active_menu' => 'entry_daily', - 'page_title' => 'Daily Entry' - ]); - } -} diff --git a/app/Controllers/Api/TestApiController.php b/app/Controllers/Master/MasterControlsController.php similarity index 52% rename from app/Controllers/Api/TestApiController.php rename to app/Controllers/Master/MasterControlsController.php index 37f0cb1..ef09e7f 100644 --- a/app/Controllers/Api/TestApiController.php +++ b/app/Controllers/Master/MasterControlsController.php @@ -1,46 +1,42 @@ dictTestModel = new DictTestModel(); - $this->dictDeptModel = new DictDeptModel(); + public function __construct() { + $this->model = new MasterControlsModel(); $this->rules = [ 'name' => 'required|min_length[1]', - 'dept_ref_id' => 'required', + 'lot' => 'required|min_length[1]', ]; } - public function index() - { + public function index() { + $keyword = $this->request->getGet('keyword'); try { - $rows = $this->dictTestModel->getWithDept(); + $rows = $this->model->search($keyword); return $this->respond([ 'status' => 'success', 'message' => 'fetch success', 'data' => $rows ], 200); } catch (\Exception $e) { - return $this->failServerError('Exception: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function show($id = null) - { + public function show($id = null) { try { - $rows = $this->dictTestModel->where('test_id', $id)->findAll(); - if (empty($rows)) { + $row = $this->model->find($id); + if (!$row) { return $this->respond([ 'status' => 'success', 'message' => 'data not found.' @@ -49,58 +45,58 @@ class TestApiController extends BaseController return $this->respond([ 'status' => 'success', 'message' => 'fetch success', - 'data' => $rows + 'data' => [$row] ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function create() - { + public function create() { $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); if (!$this->validate($this->rules)) { return $this->failValidationErrors($this->validator->getErrors()); } try { - $id = $this->dictTestModel->insert($input, true); + $id = $this->model->insert($input, true); return $this->respondCreated([ 'status' => 'success', 'message' => $id ]); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function update($id = null) - { + public function update($id = null) { $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); if (!$this->validate($this->rules)) { return $this->failValidationErrors($this->validator->getErrors()); } try { - $this->dictTestModel->update($id, $input); + $this->model->update($id, $input); return $this->respond([ 'status' => 'success', 'message' => 'update success', - 'data' => $id - ]); + 'data' => [$id] + ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function delete($id = null) - { + public function delete($id = null) { try { - $this->dictTestModel->delete($id); + $this->model->delete($id); return $this->respond([ 'status' => 'success', - 'message' => 'delete success' - ]); + 'message' => 'delete success', + 'data' => [$id] + ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } } diff --git a/app/Controllers/Api/DeptApiController.php b/app/Controllers/Master/MasterDeptsController.php similarity index 54% rename from app/Controllers/Api/DeptApiController.php rename to app/Controllers/Master/MasterDeptsController.php index a7c701d..4fd60ea 100644 --- a/app/Controllers/Api/DeptApiController.php +++ b/app/Controllers/Master/MasterDeptsController.php @@ -1,42 +1,41 @@ dictDeptModel = new DictDeptModel(); + public function __construct() { + $this->model = new MasterDeptsModel(); $this->rules = [ 'name' => 'required|min_length[1]', ]; } - public function index() - { + public function index() { + $keyword = $this->request->getGet('keyword'); try { - $rows = $this->dictDeptModel->findAll(); + $rows = $this->model->search($keyword); return $this->respond([ 'status' => 'success', 'message' => 'fetch success', 'data' => $rows ], 200); } catch (\Exception $e) { - return $this->failServerError('Exception: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function show($id = null) - { + public function show($id = null) { try { - $rows = $this->dictDeptModel->where('dept_id', $id)->findAll(); - if (empty($rows)) { + $row = $this->model->find($id); + if (!$row) { return $this->respond([ 'status' => 'success', 'message' => 'data not found.' @@ -45,58 +44,58 @@ class DeptApiController extends BaseController return $this->respond([ 'status' => 'success', 'message' => 'fetch success', - 'data' => $rows + 'data' => [$row] ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function create() - { + public function create() { $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); if (!$this->validate($this->rules)) { return $this->failValidationErrors($this->validator->getErrors()); } try { - $id = $this->dictDeptModel->insert($input, true); + $id = $this->model->insert($input, true); return $this->respondCreated([ 'status' => 'success', 'message' => $id ]); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function update($id = null) - { + public function update($id = null) { $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); if (!$this->validate($this->rules)) { return $this->failValidationErrors($this->validator->getErrors()); } try { - $this->dictDeptModel->update($id, $input); + $this->model->update($id, $input); return $this->respond([ 'status' => 'success', 'message' => 'update success', - 'data' => $id - ]); + 'data' => [$id] + ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } - public function delete($id = null) - { + public function delete($id = null) { try { - $this->dictDeptModel->delete($id); + $this->model->delete($id); return $this->respond([ 'status' => 'success', - 'message' => 'delete success' - ]); + 'message' => 'delete success', + 'data' => [$id] + ], 200); } catch (\Exception $e) { - return $this->failServerError('Something went wrong: ' . $e->getMessage()); + return $this->failServerError($e->getMessage()); } } } diff --git a/app/Controllers/Master/MasterTestsController.php b/app/Controllers/Master/MasterTestsController.php new file mode 100644 index 0000000..916c6e8 --- /dev/null +++ b/app/Controllers/Master/MasterTestsController.php @@ -0,0 +1,101 @@ +model = new MasterTestsModel(); + $this->rules = [ + 'name' => 'required|min_length[1]', + ]; + } + + public function index() { + $keyword = $this->request->getGet('keyword'); + try { + $rows = $this->model->search($keyword); + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => $rows + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function show($id = null) { + try { + $row = $this->model->find($id); + if (!$row) { + return $this->respond([ + 'status' => 'success', + 'message' => 'data not found.' + ], 200); + } + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => [$row] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function create() { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $id = $this->model->insert($input, true); + return $this->respondCreated([ + 'status' => 'success', + 'message' => $id + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function update($id = null) { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $this->model->update($id, $input); + return $this->respond([ + 'status' => 'success', + 'message' => 'update success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function delete($id = null) { + try { + $this->model->delete($id); + return $this->respond([ + 'status' => 'success', + 'message' => 'delete success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } +} diff --git a/app/Controllers/PageController.php b/app/Controllers/PageController.php index 1f441ca..7991861 100644 --- a/app/Controllers/PageController.php +++ b/app/Controllers/PageController.php @@ -2,157 +2,40 @@ namespace App\Controllers; -class PageController extends BaseController -{ - protected $dictDeptModel; - protected $dictTestModel; - protected $dictControlModel; - protected $resultModel; - protected $controlTestModel; - protected $commentModel; +use CodeIgniter\API\ResponseTrait; - public function __construct() - { - $this->dictDeptModel = new \App\Models\DictDeptModel(); - $this->dictTestModel = new \App\Models\DictTestModel(); - $this->dictControlModel = new \App\Models\DictControlModel(); - $this->resultModel = new \App\Models\ResultModel(); - $this->controlTestModel = new \App\Models\ControlTestModel(); - $this->commentModel = new \App\Models\ResultCommentModel(); +class PageController extends BaseController { + use ResponseTrait; + + public function dashboard() { + return view('dashboard'); } - public function dashboard(): string - { - return view('dashboard', [ - 'depts' => $this->dictDeptModel->findAll(), - 'tests' => $this->dictTestModel->getWithDept(), - 'controls' => $this->dictControlModel->getWithDept(), - 'recent_results' => $this->resultModel->findAll(20), - 'page_title' => 'Dashboard', - 'active_menu' => 'dashboard' - ]); + public function masterDept() { + return view('master/dept/index'); } - public function dept(): string - { - return view('dept/index', [ - 'title' => 'Department Dictionary', - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'dept', - 'page_title' => 'Department Dictionary' - ]); + public function masterTest() { + return view('master/test/index'); } - public function test(): string - { - return view('test/index', [ - 'title' => 'Test Dictionary', - 'tests' => $this->dictTestModel->getWithDept(), - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'test', - 'page_title' => 'Test Dictionary' - ]); + public function masterControl() { + return view('master/control/index'); } - public function control(): string - { - return view('control/index', [ - 'title' => 'Control Dictionary', - 'controls' => $this->dictControlModel->getWithDept(), - 'depts' => $this->dictDeptModel->findAll(), - 'tests' => $this->dictTestModel->getWithDept(), - 'active_menu' => 'control', - 'page_title' => 'Control Dictionary' - ]); + public function entry() { + return view('entry/index'); } - public function entry(): string - { - return view('entry/monthly', [ - 'title' => 'Monthly Entry', - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'entry', - 'page_title' => 'Monthly Entry' - ]); + public function entryDaily() { + return view('entry/daily'); } - public function entryDaily(): string - { - return view('entry/daily', [ - 'title' => 'Daily Entry', - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'entry_daily', - 'page_title' => 'Daily Entry' - ]); + public function report() { + return view('report/index'); } - public function report(): string - { - return view('report/index', [ - 'title' => 'Reports', - 'depts' => $this->dictDeptModel->findAll(), - 'tests' => $this->dictTestModel->findAll(), - 'controls' => $this->dictControlModel->findAll(), - 'active_menu' => 'report', - 'page_title' => 'Reports' - ]); - } - - public function reportView(): string - { - $control1 = $this->request->getGet('control1') ?? 0; - $control2 = $this->request->getGet('control2') ?? 0; - $control3 = $this->request->getGet('control3') ?? 0; - $dates = $this->request->getGet('dates') ?? date('Y-m'); - $test = $this->request->getGet('test') ?? 0; - - $controls = []; - if ($control1) { - $c1 = $this->dictControlModel->find($control1); - if ($c1) $controls[] = $c1; - } - if ($control2) { - $c2 = $this->dictControlModel->find($control2); - if ($c2) $controls[] = $c2; - } - if ($control3) { - $c3 = $this->dictControlModel->find($control3); - if ($c3) $controls[] = $c3; - } - - $reportData = []; - foreach ($controls as $control) { - $controlTest = $this->controlTestModel->getByControlAndTest($control['control_id'], $test); - $results = $this->resultModel->getByMonth($control['control_id'], $test, $dates); - $comment = $this->commentModel->getByControlTestMonth($control['control_id'], $test, $dates); - - $outOfRangeCount = 0; - if ($controlTest && $controlTest['sd'] > 0) { - foreach ($results as $res) { - if (abs($res['resvalue'] - $controlTest['mean']) > 2 * $controlTest['sd']) { - $outOfRangeCount++; - } - } - } - - $reportData[] = [ - 'control' => $control, - 'controlTest' => $controlTest, - 'results' => $results, - 'comment' => $comment, - 'test' => $this->dictTestModel->find($test), - 'outOfRange' => $outOfRangeCount - ]; - } - - return view('report/view', [ - 'title' => 'QC Report', - 'reportData' => $reportData, - 'dates' => $dates, - 'test' => $test, - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'report', - 'page_title' => 'QC Report' - ]); + public function reportView() { + return view('report/view'); } } diff --git a/app/Controllers/Qc/ControlTestsController.php b/app/Controllers/Qc/ControlTestsController.php new file mode 100644 index 0000000..3b3b1af --- /dev/null +++ b/app/Controllers/Qc/ControlTestsController.php @@ -0,0 +1,99 @@ +model = new ControlTestsModel(); + $this->rules = []; + } + + public function index() { + $keyword = $this->request->getGet('keyword'); + try { + $rows = $this->model->search($keyword); + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => $rows + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function show($id = null) { + try { + $row = $this->model->find($id); + if (!$row) { + return $this->respond([ + 'status' => 'success', + 'message' => 'data not found.' + ], 200); + } + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => [$row] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function create() { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $id = $this->model->insert($input, true); + return $this->respondCreated([ + 'status' => 'success', + 'message' => $id + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function update($id = null) { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $this->model->update($id, $input); + return $this->respond([ + 'status' => 'success', + 'message' => 'update success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function delete($id = null) { + try { + $this->model->delete($id); + return $this->respond([ + 'status' => 'success', + 'message' => 'delete success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } +} diff --git a/app/Controllers/Qc/ResultCommentsController.php b/app/Controllers/Qc/ResultCommentsController.php new file mode 100644 index 0000000..1896213 --- /dev/null +++ b/app/Controllers/Qc/ResultCommentsController.php @@ -0,0 +1,99 @@ +model = new ResultCommentsModel(); + $this->rules = []; + } + + public function index() { + $keyword = $this->request->getGet('keyword'); + try { + $rows = $this->model->search($keyword); + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => $rows + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function show($id = null) { + try { + $row = $this->model->find($id); + if (!$row) { + return $this->respond([ + 'status' => 'success', + 'message' => 'data not found.' + ], 200); + } + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => [$row] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function create() { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $id = $this->model->insert($input, true); + return $this->respondCreated([ + 'status' => 'success', + 'message' => $id + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function update($id = null) { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $this->model->update($id, $input); + return $this->respond([ + 'status' => 'success', + 'message' => 'update success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function delete($id = null) { + try { + $this->model->delete($id); + return $this->respond([ + 'status' => 'success', + 'message' => 'delete success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } +} diff --git a/app/Controllers/Qc/ResultsController.php b/app/Controllers/Qc/ResultsController.php new file mode 100644 index 0000000..8b0deb8 --- /dev/null +++ b/app/Controllers/Qc/ResultsController.php @@ -0,0 +1,99 @@ +model = new ResultsModel(); + $this->rules = []; + } + + public function index() { + $keyword = $this->request->getGet('keyword'); + try { + $rows = $this->model->search($keyword); + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => $rows + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function show($id = null) { + try { + $row = $this->model->find($id); + if (!$row) { + return $this->respond([ + 'status' => 'success', + 'message' => 'data not found.' + ], 200); + } + return $this->respond([ + 'status' => 'success', + 'message' => 'fetch success', + 'data' => [$row] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function create() { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $id = $this->model->insert($input, true); + return $this->respondCreated([ + 'status' => 'success', + 'message' => $id + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function update($id = null) { + $input = $this->request->getJSON(true); + $input = camel_to_snake_array($input); + if (!$this->validate($this->rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + try { + $this->model->update($id, $input); + return $this->respond([ + 'status' => 'success', + 'message' => 'update success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + public function delete($id = null) { + try { + $this->model->delete($id); + return $this->respond([ + 'status' => 'success', + 'message' => 'delete success', + 'data' => [$id] + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } +} diff --git a/app/Controllers/Report.php b/app/Controllers/Report.php deleted file mode 100644 index 5021bc8..0000000 --- a/app/Controllers/Report.php +++ /dev/null @@ -1,26 +0,0 @@ - 'Reports', - 'depts' => $dictDeptModel->findAll(), - 'tests' => $dictTestModel->findAll(), - 'controls' => $dictControlModel->findAll(), - 'active_menu' => 'report', - 'page_title' => 'Reports' - ]); - } -} diff --git a/app/Controllers/Test.php b/app/Controllers/Test.php deleted file mode 100644 index 0ef1b81..0000000 --- a/app/Controllers/Test.php +++ /dev/null @@ -1,29 +0,0 @@ -dictTestModel = new DictTestModel(); - $this->dictDeptModel = new DictDeptModel(); - } - - public function index() - { - return view('test/index', [ - 'title' => 'Test Dictionary', - 'tests' => $this->dictTestModel->getWithDept(), - 'depts' => $this->dictDeptModel->findAll(), - 'active_menu' => 'test', - 'page_title' => 'Test Dictionary' - ]); - } -} diff --git a/app/Database/Migrations/2026-01-14-000001_CreateCmodQcTables.php b/app/Database/Migrations/2026-01-14-000001_CreateCmodQcTables.php deleted file mode 100644 index ae2c90a..0000000 --- a/app/Database/Migrations/2026-01-14-000001_CreateCmodQcTables.php +++ /dev/null @@ -1,282 +0,0 @@ -forge->addField([ - 'control_test_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'control_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'test_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'mean' => [ - 'type' => 'FLOAT', - 'null' => true, - ], - 'sd' => [ - 'type' => 'FLOAT', - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('control_test_id', true); - $this->forge->createTable('control_tests'); - - $this->forge->addField([ - 'result_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'control_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'test_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'resdate' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'resvalue' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'rescomment' => [ - 'type' => 'TEXT', - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('result_id', true); - $this->forge->createTable('results'); - - $this->forge->addField([ - 'control_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'dept_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'name' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'lot' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'producer' => [ - 'type' => 'TEXT', - 'null' => true, - ], - 'expdate' => [ - 'type' => 'DATE', - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('control_id', true); - $this->forge->createTable('dict_controls'); - - $this->forge->addField([ - 'dept_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'name' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('dept_id', true); - $this->forge->createTable('dict_depts'); - - $this->forge->addField([ - 'test_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'dept_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'name' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'unit' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'method' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'cva' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'ba' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'tea' => [ - 'type' => 'VARCHAR', - 'constraint' => 50, - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('test_id', true); - $this->forge->createTable('dict_tests'); - - $this->forge->addField([ - 'result_comment_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'control_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'test_ref_id' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => true, - ], - 'commonth' => [ - 'type' => 'VARCHAR', - 'constraint' => 7, - 'null' => true, - ], - 'comtext' => [ - 'type' => 'TEXT', - 'null' => true, - ], - 'created_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'updated_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - 'deleted_at' => [ - 'type' => 'DATETIME', - 'null' => true, - ], - ]); - $this->forge->addKey('result_comment_id', true); - $this->forge->createTable('result_comments'); - } - - public function down() - { - $this->forge->dropTable('control_tests'); - $this->forge->dropTable('results'); - $this->forge->dropTable('dict_controls'); - $this->forge->dropTable('dict_depts'); - $this->forge->dropTable('dict_tests'); - $this->forge->dropTable('result_comments'); - } -} diff --git a/app/Database/Migrations/2026-01-17-000001-QualityControlSystem.php b/app/Database/Migrations/2026-01-17-000001-QualityControlSystem.php new file mode 100644 index 0000000..cd5a9bf --- /dev/null +++ b/app/Database/Migrations/2026-01-17-000001-QualityControlSystem.php @@ -0,0 +1,107 @@ +forge->addField([ + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('dept_id', true); + $this->forge->createTable('dict_depts'); + + $this->forge->addField([ + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'lot' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'producer' => ['type' => 'TEXT', 'null' => true], + 'exp_date' => ['type' => 'DATE', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('control_id', true); + $this->forge->addForeignKey('dept_id', 'dict_depts', 'dept_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('dict_controls'); + + $this->forge->addField([ + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'unit' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'method' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'cva' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'ba' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'tea' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('test_id', true); + $this->forge->addForeignKey('dept_id', 'dict_depts', 'dept_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('dict_tests'); + + $this->forge->addField([ + 'control_test_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'mean' => ['type' => 'FLOAT', 'null' => true], + 'sd' => ['type' => 'FLOAT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('control_test_id', true); + $this->forge->addForeignKey('control_id', 'dict_controls', 'control_id', 'SET NULL', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'dict_tests', 'test_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('control_tests'); + + $this->forge->addField([ + 'result_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'res_date' => ['type' => 'DATETIME', 'null' => true], + 'res_value' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'res_comment' => ['type' => 'TEXT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('result_id', true); + $this->forge->addForeignKey('control_id', 'dict_controls', 'control_id', 'SET NULL', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'dict_tests', 'test_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('results'); + + $this->forge->addField([ + 'result_comment_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true], + 'comment_month' => ['type' => 'VARCHAR', 'constraint' => 7], + 'com_text' => ['type' => 'TEXT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('result_comment_id', true); + $this->forge->addUniqueKey(['control_id', 'test_id', 'comment_month']); + $this->forge->addForeignKey('control_id', 'dict_controls', 'control_id', 'CASCADE', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'dict_tests', 'test_id', 'CASCADE', 'CASCADE'); + $this->forge->createTable('result_comments'); + } + + public function down() { + $this->forge->dropTable('result_comments', true); + $this->forge->dropTable('results', true); + $this->forge->dropTable('control_tests', true); + $this->forge->dropTable('dict_tests', true); + $this->forge->dropTable('dict_controls', true); + $this->forge->dropTable('dict_depts', true); + } +} diff --git a/app/Database/Migrations/2026-01-18-000001-QualityControlSystem.php b/app/Database/Migrations/2026-01-18-000001-QualityControlSystem.php new file mode 100644 index 0000000..500f7c6 --- /dev/null +++ b/app/Database/Migrations/2026-01-18-000001-QualityControlSystem.php @@ -0,0 +1,110 @@ +forge->addField([ + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('dept_id', true); + $this->forge->createTable('master_depts'); + + $this->forge->addField([ + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'lot' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'producer' => ['type' => 'TEXT', 'null' => true], + 'exp_date' => ['type' => 'DATE', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('control_id', true); + $this->forge->addForeignKey('dept_id', 'master_depts', 'dept_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('master_controls'); + + $this->forge->addField([ + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'dept_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'name' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'unit' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'method' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'cva' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'ba' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'tea' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('test_id', true); + $this->forge->addForeignKey('dept_id', 'master_depts', 'dept_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('master_tests'); + + $this->forge->addField([ + 'control_test_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'mean' => ['type' => 'FLOAT', 'null' => true], + 'sd' => ['type' => 'FLOAT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('control_test_id', true); + $this->forge->addForeignKey('control_id', 'master_controls', 'control_id', 'SET NULL', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'master_tests', 'test_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('control_tests'); + + $this->forge->addField([ + 'result_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true], + 'res_date' => ['type' => 'DATETIME', 'null' => true], + 'res_value' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true], + 'res_comment' => ['type' => 'TEXT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('result_id', true); + $this->forge->addForeignKey('control_id', 'master_controls', 'control_id', 'SET NULL', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'master_tests', 'test_id', 'SET NULL', 'CASCADE'); + $this->forge->createTable('results'); + + $this->forge->addField([ + 'result_comment_id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true], + 'control_id' => ['type' => 'INT', 'unsigned' => true], + 'test_id' => ['type' => 'INT', 'unsigned' => true], + 'comment_month' => ['type' => 'VARCHAR', 'constraint' => 7], + 'com_text' => ['type' => 'TEXT', 'null' => true], + 'created_at' => ['type' => 'DATETIME', 'null' => true], + 'updated_at' => ['type' => 'DATETIME', 'null' => true], + 'deleted_at' => ['type' => 'DATETIME', 'null' => true], + ]); + $this->forge->addKey('result_comment_id', true); + $this->forge->addUniqueKey(['control_id', 'test_id', 'comment_month']); + $this->forge->addForeignKey('control_id', 'master_controls', 'control_id', 'CASCADE', 'CASCADE'); + $this->forge->addForeignKey('test_id', 'master_tests', 'test_id', 'CASCADE', 'CASCADE'); + $this->forge->createTable('result_comments'); + } + + public function down() + { + $this->forge->dropTable('result_comments', true); + $this->forge->dropTable('results', true); + $this->forge->dropTable('control_tests', true); + $this->forge->dropTable('master_tests', true); + $this->forge->dropTable('master_controls', true); + $this->forge->dropTable('master_depts', true); + } +} diff --git a/app/Database/Migrations/2026-01-18-000001-RenameDictToMasterTables.php b/app/Database/Migrations/2026-01-18-000001-RenameDictToMasterTables.php new file mode 100644 index 0000000..3bac25e --- /dev/null +++ b/app/Database/Migrations/2026-01-18-000001-RenameDictToMasterTables.php @@ -0,0 +1,45 @@ +query('SET FOREIGN_KEY_CHECKS=0'); + + $tables = $db->listTables(); + if (in_array('dict_depts', $tables)) { + $db->query('RENAME TABLE dict_depts TO master_depts'); + } + if (in_array('dict_controls', $tables)) { + $db->query('RENAME TABLE dict_controls TO master_controls'); + } + if (in_array('dict_tests', $tables)) { + $db->query('RENAME TABLE dict_tests TO master_tests'); + } + + $db->query('SET FOREIGN_KEY_CHECKS=1'); + } + + public function down() { + $db = \Config\Database::connect(); + + $db->query('SET FOREIGN_KEY_CHECKS=0'); + + $tables = $db->listTables(); + if (in_array('master_depts', $tables)) { + $db->query('RENAME TABLE master_depts TO dict_depts'); + } + if (in_array('master_controls', $tables)) { + $db->query('RENAME TABLE master_controls TO dict_controls'); + } + if (in_array('master_tests', $tables)) { + $db->query('RENAME TABLE master_tests TO dict_tests'); + } + + $db->query('SET FOREIGN_KEY_CHECKS=1'); + } +} diff --git a/app/Database/Migrations/test.php b/app/Database/Migrations/test.php new file mode 100644 index 0000000..1bfd141 --- /dev/null +++ b/app/Database/Migrations/test.php @@ -0,0 +1,10 @@ +query("SELECT * FROM migrations")->getResult(); +print_r($results); + +echo "\nChecking for dict_ tables:\n"; +$tables = $db->listTables(); +print_r($tables); diff --git a/app/Database/Seeds/CmodQcSeeder.php b/app/Database/Seeds/CmodQcSeeder.php deleted file mode 100644 index c0cbdfd..0000000 --- a/app/Database/Seeds/CmodQcSeeder.php +++ /dev/null @@ -1,322 +0,0 @@ - 440, 'control_ref_id' => 125, 'test_ref_id' => 18, 'mean' => 1.28, 'sd' => 0.64], - ['control_test_id' => 441, 'control_ref_id' => 126, 'test_ref_id' => 18, 'mean' => 2.26, 'sd' => 1.13], - ['control_test_id' => 541, 'control_ref_id' => 169, 'test_ref_id' => 18, 'mean' => 1.24, 'sd' => 0.155], - ['control_test_id' => 443, 'control_ref_id' => 128, 'test_ref_id' => 20, 'mean' => 105, 'sd' => 14.6], - ['control_test_id' => 565, 'control_ref_id' => 179, 'test_ref_id' => 15, 'mean' => 44, 'sd' => 2.2], - ['control_test_id' => 566, 'control_ref_id' => 179, 'test_ref_id' => 16, 'mean' => 107, 'sd' => 5.35], - ['control_test_id' => 482, 'control_ref_id' => 144, 'test_ref_id' => 3, 'mean' => 1.81, 'sd' => 0.1575], - ['control_test_id' => 444, 'control_ref_id' => 127, 'test_ref_id' => 20, 'mean' => 26.8, 'sd' => 3.75], - ['control_test_id' => 523, 'control_ref_id' => 163, 'test_ref_id' => 1, 'mean' => 49.8, 'sd' => 3.75], - ['control_test_id' => 524, 'control_ref_id' => 163, 'test_ref_id' => 2, 'mean' => 56.4, 'sd' => 4.2], - ['control_test_id' => 483, 'control_ref_id' => 144, 'test_ref_id' => 4, 'mean' => 4.17, 'sd' => 0.36], - ['control_test_id' => 449, 'control_ref_id' => 133, 'test_ref_id' => 19, 'mean' => 12.55, 'sd' => 1.883], - ['control_test_id' => 567, 'control_ref_id' => 179, 'test_ref_id' => 13, 'mean' => 168, 'sd' => 8.4], - ['control_test_id' => 568, 'control_ref_id' => 179, 'test_ref_id' => 14, 'mean' => 124, 'sd' => 6.2], - ['control_test_id' => 439, 'control_ref_id' => 124, 'test_ref_id' => 19, 'mean' => 3.03, 'sd' => 0.455], - ['control_test_id' => 569, 'control_ref_id' => 180, 'test_ref_id' => 1, 'mean' => 49.5, 'sd' => 3.75], - ['control_test_id' => 450, 'control_ref_id' => 134, 'test_ref_id' => 13, 'mean' => 166, 'sd' => 8.3], - ['control_test_id' => 570, 'control_ref_id' => 180, 'test_ref_id' => 2, 'mean' => 56.4, 'sd' => 4.2], - ['control_test_id' => 451, 'control_ref_id' => 134, 'test_ref_id' => 14, 'mean' => 127, 'sd' => 6.35], - ['control_test_id' => 452, 'control_ref_id' => 134, 'test_ref_id' => 15, 'mean' => 43, 'sd' => 2.15], - ['control_test_id' => 545, 'control_ref_id' => 173, 'test_ref_id' => 1, 'mean' => 150, 'sd' => 12], - ['control_test_id' => 546, 'control_ref_id' => 173, 'test_ref_id' => 2, 'mean' => 137, 'sd' => 10.5], - ['control_test_id' => 542, 'control_ref_id' => 170, 'test_ref_id' => 18, 'mean' => 2.02, 'sd' => 0.275], - ['control_test_id' => 547, 'control_ref_id' => 173, 'test_ref_id' => 6, 'mean' => 126, 'sd' => 9], - ['control_test_id' => 453, 'control_ref_id' => 134, 'test_ref_id' => 16, 'mean' => 105, 'sd' => 5.25], - ['control_test_id' => 454, 'control_ref_id' => 135, 'test_ref_id' => 13, 'mean' => 232, 'sd' => 11.6], - ['control_test_id' => 455, 'control_ref_id' => 135, 'test_ref_id' => 14, 'mean' => 179, 'sd' => 8.95], - ['control_test_id' => 456, 'control_ref_id' => 135, 'test_ref_id' => 15, 'mean' => 61, 'sd' => 3.05], - ['control_test_id' => 457, 'control_ref_id' => 135, 'test_ref_id' => 16, 'mean' => 146, 'sd' => 7.3], - ['control_test_id' => 473, 'control_ref_id' => 143, 'test_ref_id' => 2, 'mean' => 137, 'sd' => 10.5], - ['control_test_id' => 474, 'control_ref_id' => 143, 'test_ref_id' => 1, 'mean' => 146, 'sd' => 10.5], - ['control_test_id' => 475, 'control_ref_id' => 143, 'test_ref_id' => 7, 'mean' => 4.3, 'sd' => 0.3225], - ['control_test_id' => 476, 'control_ref_id' => 143, 'test_ref_id' => 9, 'mean' => 243, 'sd' => 19], - ['control_test_id' => 489, 'control_ref_id' => 145, 'test_ref_id' => 37, 'mean' => 0.851, 'sd' => 0.113], - ['control_test_id' => 480, 'control_ref_id' => 143, 'test_ref_id' => 5, 'mean' => 4.73, 'sd' => 2.4], - ['control_test_id' => 481, 'control_ref_id' => 143, 'test_ref_id' => 36, 'mean' => 3.31, 'sd' => 0.12], - ['control_test_id' => 484, 'control_ref_id' => 144, 'test_ref_id' => 10, 'mean' => 162, 'sd' => 20.25], - ['control_test_id' => 485, 'control_ref_id' => 144, 'test_ref_id' => 11, 'mean' => 91.7, 'sd' => 6.7], - ['control_test_id' => 580, 'control_ref_id' => 182, 'test_ref_id' => 17, 'mean' => 10.71, 'sd' => 0.25], - ['control_test_id' => 429, 'control_ref_id' => 121, 'test_ref_id' => 3, 'mean' => 0.83, 'sd' => 0.073], - ['control_test_id' => 430, 'control_ref_id' => 121, 'test_ref_id' => 4, 'mean' => 1.53, 'sd' => 0.13], - ['control_test_id' => 431, 'control_ref_id' => 121, 'test_ref_id' => 10, 'mean' => 66.6, 'sd' => 5.575], - ['control_test_id' => 432, 'control_ref_id' => 121, 'test_ref_id' => 11, 'mean' => 27.5, 'sd' => 2.025], - ['control_test_id' => 582, 'control_ref_id' => 184, 'test_ref_id' => 10, 'mean' => 61.65, 'sd' => 5.125], - ['control_test_id' => 434, 'control_ref_id' => 121, 'test_ref_id' => 30, 'mean' => 144, 'sd' => 14.5], - ['control_test_id' => 583, 'control_ref_id' => 184, 'test_ref_id' => 3, 'mean' => 0.765, 'sd' => 0.0675], - ['control_test_id' => 487, 'control_ref_id' => 144, 'test_ref_id' => 30, 'mean' => 220, 'sd' => 22], - ['control_test_id' => 488, 'control_ref_id' => 143, 'test_ref_id' => 32, 'mean' => 8.07, 'sd' => 0.4], - ['control_test_id' => 490, 'control_ref_id' => 145, 'test_ref_id' => 38, 'mean' => 1.15, 'sd' => 0.15], - ['control_test_id' => 494, 'control_ref_id' => 145, 'test_ref_id' => 39, 'mean' => 6.69, 'sd' => 0.89], - ['control_test_id' => 495, 'control_ref_id' => 146, 'test_ref_id' => 37, 'mean' => 23.219, 'sd' => 3.096], - ['control_test_id' => 496, 'control_ref_id' => 146, 'test_ref_id' => 39, 'mean' => 15.24, 'sd' => 2.03], - ['control_test_id' => 497, 'control_ref_id' => 146, 'test_ref_id' => 38, 'mean' => 3.81, 'sd' => 0.51], - ['control_test_id' => 514, 'control_ref_id' => 153, 'test_ref_id' => 47, 'mean' => 0.08, 'sd' => 0.13], - ['control_test_id' => 515, 'control_ref_id' => 154, 'test_ref_id' => 47, 'mean' => 4.91, 'sd' => 0.9], - ['control_test_id' => 516, 'control_ref_id' => 158, 'test_ref_id' => 49, 'mean' => 22.34, 'sd' => 2.98], - ['control_test_id' => 517, 'control_ref_id' => 159, 'test_ref_id' => 49, 'mean' => 63.25, 'sd' => 8.43], - ['control_test_id' => 518, 'control_ref_id' => 155, 'test_ref_id' => 47, 'mean' => 7.6, 'sd' => 1.39], - ['control_test_id' => 519, 'control_ref_id' => 156, 'test_ref_id' => 48, 'mean' => 0.01, 'sd' => 0.13], - ['control_test_id' => 520, 'control_ref_id' => 157, 'test_ref_id' => 48, 'mean' => 4.62, 'sd' => 0.77], - ['control_test_id' => 525, 'control_ref_id' => 163, 'test_ref_id' => 8, 'mean' => 5.16, 'sd' => 0.355], - ['control_test_id' => 526, 'control_ref_id' => 163, 'test_ref_id' => 6, 'mean' => 41.1, 'sd' => 3.075], - ['control_test_id' => 527, 'control_ref_id' => 163, 'test_ref_id' => 7, 'mean' => 1.07, 'sd' => 0.08], - ['control_test_id' => 528, 'control_ref_id' => 163, 'test_ref_id' => 9, 'mean' => 101, 'sd' => 7.75], - ['control_test_id' => 529, 'control_ref_id' => 163, 'test_ref_id' => 5, 'mean' => 3.16, 'sd' => 0.1575], - ['control_test_id' => 530, 'control_ref_id' => 163, 'test_ref_id' => 32, 'mean' => 5.07, 'sd' => 0.2539], - ['control_test_id' => 535, 'control_ref_id' => 163, 'test_ref_id' => 36, 'mean' => 2.2, 'sd' => 0.0838], - ['control_test_id' => 536, 'control_ref_id' => 165, 'test_ref_id' => 17, 'mean' => 5.355, 'sd' => 0.15], - ['control_test_id' => 537, 'control_ref_id' => 166, 'test_ref_id' => 17, 'mean' => 10.29, 'sd' => 0.25], - ['control_test_id' => 548, 'control_ref_id' => 173, 'test_ref_id' => 7, 'mean' => 4.11, 'sd' => 0.305], - ['control_test_id' => 549, 'control_ref_id' => 173, 'test_ref_id' => 8, 'mean' => 10.7, 'sd' => 0.75], - ['control_test_id' => 550, 'control_ref_id' => 173, 'test_ref_id' => 9, 'mean' => 241, 'sd' => 18.75], - ['control_test_id' => 551, 'control_ref_id' => 173, 'test_ref_id' => 5, 'mean' => 4.74, 'sd' => 0.36], - ['control_test_id' => 553, 'control_ref_id' => 175, 'test_ref_id' => 19, 'mean' => 3.05, 'sd' => 0.457], - ['control_test_id' => 554, 'control_ref_id' => 174, 'test_ref_id' => 19, 'mean' => 12.53, 'sd' => 1.88], - ['control_test_id' => 555, 'control_ref_id' => 176, 'test_ref_id' => 43, 'mean' => 34.29, 'sd' => 2.8], - ['control_test_id' => 559, 'control_ref_id' => 163, 'test_ref_id' => 53, 'mean' => 4.46, 'sd' => 0.22], - ['control_test_id' => 560, 'control_ref_id' => 173, 'test_ref_id' => 53, 'mean' => 9.08, 'sd' => 0.47], - ['control_test_id' => 577, 'control_ref_id' => 180, 'test_ref_id' => 32, 'mean' => 5.12, 'sd' => 0.256], - ['control_test_id' => 584, 'control_ref_id' => 184, 'test_ref_id' => 4, 'mean' => 1.33, 'sd' => 0.115], - ['control_test_id' => 585, 'control_ref_id' => 184, 'test_ref_id' => 11, 'mean' => 31.98, 'sd' => 2.325], - ['control_test_id' => 586, 'control_ref_id' => 184, 'test_ref_id' => 30, 'mean' => 145, 'sd' => 14.5], - ['control_test_id' => 587, 'control_ref_id' => 185, 'test_ref_id' => 17, 'mean' => 5.67, 'sd' => 0.15], - ['control_test_id' => 588, 'control_ref_id' => 186, 'test_ref_id' => 17, 'mean' => 10.29, 'sd' => 0.25], - ['control_test_id' => 477, 'control_ref_id' => 143, 'test_ref_id' => 8, 'mean' => 10.4, 'sd' => 0.7], - ['control_test_id' => 478, 'control_ref_id' => 143, 'test_ref_id' => 6, 'mean' => 125, 'sd' => 9], - ['control_test_id' => 499, 'control_ref_id' => 147, 'test_ref_id' => 40, 'mean' => 2.7, 'sd' => 0.36], - ['control_test_id' => 500, 'control_ref_id' => 147, 'test_ref_id' => 41, 'mean' => 1.125, 'sd' => 0.15], - ['control_test_id' => 501, 'control_ref_id' => 147, 'test_ref_id' => 42, 'mean' => 4.38, 'sd' => 0.58], - ['control_test_id' => 502, 'control_ref_id' => 147, 'test_ref_id' => 43, 'mean' => 10.09, 'sd' => 1.35], - ['control_test_id' => 503, 'control_ref_id' => 147, 'test_ref_id' => 44, 'mean' => 29.43, 'sd' => 3.92], - ['control_test_id' => 592, 'control_ref_id' => 187, 'test_ref_id' => 3, 'mean' => 2.19, 'sd' => 0.19], - ['control_test_id' => 362, 'control_ref_id' => 98, 'test_ref_id' => 3, 'mean' => 1.8, 'sd' => 0.232], - ['control_test_id' => 363, 'control_ref_id' => 98, 'test_ref_id' => 4, 'mean' => 5.02, 'sd' => 0.652], - ['control_test_id' => 469, 'control_ref_id' => 139, 'test_ref_id' => 20, 'mean' => 26.7, 'sd' => 3.75], - ['control_test_id' => 593, 'control_ref_id' => 187, 'test_ref_id' => 4, 'mean' => 4.63, 'sd' => 0.403], - ['control_test_id' => 594, 'control_ref_id' => 187, 'test_ref_id' => 10, 'mean' => 151, 'sd' => 12.5], - ['control_test_id' => 595, 'control_ref_id' => 187, 'test_ref_id' => 11, 'mean' => 88.7, 'sd' => 6.58], - ['control_test_id' => 596, 'control_ref_id' => 187, 'test_ref_id' => 30, 'mean' => 216, 'sd' => 21.5], - ['control_test_id' => 470, 'control_ref_id' => 140, 'test_ref_id' => 20, 'mean' => 104.8, 'sd' => 14.6], - ['control_test_id' => 531, 'control_ref_id' => 164, 'test_ref_id' => 13, 'mean' => 233, 'sd' => 11.65], - ['control_test_id' => 532, 'control_ref_id' => 164, 'test_ref_id' => 14, 'mean' => 174, 'sd' => 8.7], - ['control_test_id' => 557, 'control_ref_id' => 173, 'test_ref_id' => 36, 'mean' => 3.26, 'sd' => 0.18], - ['control_test_id' => 533, 'control_ref_id' => 164, 'test_ref_id' => 15, 'mean' => 61, 'sd' => 3.05], - ['control_test_id' => 534, 'control_ref_id' => 164, 'test_ref_id' => 16, 'mean' => 147, 'sd' => 7.35], - ['control_test_id' => 384, 'control_ref_id' => 98, 'test_ref_id' => 11, 'mean' => 95.6, 'sd' => 10.625], - ['control_test_id' => 581, 'control_ref_id' => 183, 'test_ref_id' => 18, 'mean' => 1.94, 'sd' => 0.26], - ['control_test_id' => 579, 'control_ref_id' => 181, 'test_ref_id' => 17, 'mean' => 5.775, 'sd' => 0.15], - ['control_test_id' => 365, 'control_ref_id' => 98, 'test_ref_id' => 10, 'mean' => 188, 'sd' => 23.5], - ['control_test_id' => 367, 'control_ref_id' => 98, 'test_ref_id' => 21, 'mean' => 12.6, 'sd' => 0.675], - ['control_test_id' => 368, 'control_ref_id' => 98, 'test_ref_id' => 29, 'mean' => 7.66, 'sd' => 0.69], - ['control_test_id' => 369, 'control_ref_id' => 98, 'test_ref_id' => 31, 'mean' => 111, 'sd' => 11.025], - ['control_test_id' => 370, 'control_ref_id' => 98, 'test_ref_id' => 30, 'mean' => 252, 'sd' => 25.25], - ['control_test_id' => 505, 'control_ref_id' => 148, 'test_ref_id' => 40, 'mean' => 27, 'sd' => 3.6], - ['control_test_id' => 506, 'control_ref_id' => 148, 'test_ref_id' => 41, 'mean' => 15.277, 'sd' => 2.037], - ['control_test_id' => 507, 'control_ref_id' => 148, 'test_ref_id' => 42, 'mean' => 47.6, 'sd' => 6.35], - ['control_test_id' => 508, 'control_ref_id' => 148, 'test_ref_id' => 43, 'mean' => 58.51, 'sd' => 7.8], - ['control_test_id' => 509, 'control_ref_id' => 148, 'test_ref_id' => 44, 'mean' => 193.03, 'sd' => 25.74], - ['control_test_id' => 510, 'control_ref_id' => 149, 'test_ref_id' => 45, 'mean' => 0.001, 'sd' => 0.017], - ['control_test_id' => 511, 'control_ref_id' => 150, 'test_ref_id' => 45, 'mean' => 0.581, 'sd' => 0.077], - ['control_test_id' => 512, 'control_ref_id' => 151, 'test_ref_id' => 46, 'mean' => 0, 'sd' => 1.67], - ['control_test_id' => 513, 'control_ref_id' => 152, 'test_ref_id' => 46, 'mean' => 19.98, 'sd' => 3], - ['control_test_id' => 538, 'control_ref_id' => 167, 'test_ref_id' => 52, 'mean' => 1.08, 'sd' => 0.1], - ['control_test_id' => 539, 'control_ref_id' => 168, 'test_ref_id' => 39, 'mean' => 6.6485, 'sd' => 0.7125], - ['control_test_id' => 540, 'control_ref_id' => 160, 'test_ref_id' => 50, 'mean' => 34.4, 'sd' => 3.51], - ['control_test_id' => 552, 'control_ref_id' => 173, 'test_ref_id' => 32, 'mean' => 8.01, 'sd' => 0.6], - ['control_test_id' => 572, 'control_ref_id' => 180, 'test_ref_id' => 9, 'mean' => 101.5, 'sd' => 7.75], - ['control_test_id' => 578, 'control_ref_id' => 180, 'test_ref_id' => 5, 'mean' => 3.16, 'sd' => 0.158], - ['control_test_id' => 571, 'control_ref_id' => 180, 'test_ref_id' => 7, 'mean' => 1.08, 'sd' => 0.0825], - ['control_test_id' => 573, 'control_ref_id' => 180, 'test_ref_id' => 8, 'mean' => 5.225, 'sd' => 0.3525], - ['control_test_id' => 574, 'control_ref_id' => 180, 'test_ref_id' => 6, 'mean' => 40.7, 'sd' => 3.05], - ['control_test_id' => 590, 'control_ref_id' => 180, 'test_ref_id' => 53, 'mean' => 4.52, 'sd' => 0.22], - ['control_test_id' => 591, 'control_ref_id' => 180, 'test_ref_id' => 36, 'mean' => 2.2, 'sd' => 0.083], - ]; - $this->db->table('control_tests')->insertBatch($data); - - $data = [ - ['result_id' => 28, 'control_ref_id' => 1, 'test_ref_id' => 1, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '152.868220727426', 'rescomment' => null], - ['result_id' => 29, 'control_ref_id' => 1, 'test_ref_id' => 2, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '118.684360070769', 'rescomment' => null], - ['result_id' => 30, 'control_ref_id' => 1, 'test_ref_id' => 3, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1.78676744546881', 'rescomment' => null], - ['result_id' => 31, 'control_ref_id' => 1, 'test_ref_id' => 4, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '4.88788440216215', 'rescomment' => null], - ['result_id' => 32, 'control_ref_id' => 1, 'test_ref_id' => 5, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '4.54649638396286', 'rescomment' => null], - ['result_id' => 33, 'control_ref_id' => 1, 'test_ref_id' => 6, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '68.9277965359498', 'rescomment' => null], - ['result_id' => 34, 'control_ref_id' => 1, 'test_ref_id' => 7, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '4.7616948568887', 'rescomment' => null], - ['result_id' => 35, 'control_ref_id' => 1, 'test_ref_id' => 8, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '8.2805131289407', 'rescomment' => null], - ['result_id' => 36, 'control_ref_id' => 1, 'test_ref_id' => 9, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '255.718750547819', 'rescomment' => null], - ['result_id' => 37, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '185.86621742091', 'rescomment' => null], - ['result_id' => 38, 'control_ref_id' => 1, 'test_ref_id' => 11, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '96.0370738667909', 'rescomment' => null], - ['result_id' => 39, 'control_ref_id' => 1, 'test_ref_id' => 12, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '7.26130670682815', 'rescomment' => null], - ['result_id' => 40, 'control_ref_id' => 2, 'test_ref_id' => 13, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '158.320085275538', 'rescomment' => null], - ['result_id' => 41, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '123.642030022172', 'rescomment' => null], - ['result_id' => 42, 'control_ref_id' => 2, 'test_ref_id' => 15, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '36.9505985250087', 'rescomment' => null], - ['result_id' => 43, 'control_ref_id' => 2, 'test_ref_id' => 16, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '96.5175241884342', 'rescomment' => null], - ['result_id' => 44, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '110.353601999312', 'rescomment' => null], - ['result_id' => 45, 'control_ref_id' => 2, 'test_ref_id' => 15, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '40.9599586941077', 'rescomment' => null], - ['result_id' => 46, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1528049849.3', 'rescomment' => null], - ['result_id' => 47, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '5.1', 'rescomment' => null], - ['result_id' => 48, 'control_ref_id' => 4, 'test_ref_id' => 13, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '215.383147793402', 'rescomment' => null], - ['result_id' => 49, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '183.063991935605', 'rescomment' => null], - ['result_id' => 50, 'control_ref_id' => 4, 'test_ref_id' => 15, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '52.9496711121656', 'rescomment' => null], - ['result_id' => 51, 'control_ref_id' => 4, 'test_ref_id' => 16, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '133.934963501757', 'rescomment' => null], - ['result_id' => 52, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '158.484164984758', 'rescomment' => null], - ['result_id' => 53, 'control_ref_id' => 4, 'test_ref_id' => 15, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '56.8818601408997', 'rescomment' => null], - ['result_id' => 54, 'control_ref_id' => 5, 'test_ref_id' => 17, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1518899850.3', 'rescomment' => null], - ['result_id' => 55, 'control_ref_id' => 5, 'test_ref_id' => 17, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '10.5', 'rescomment' => null], - ['result_id' => 56, 'control_ref_id' => 5, 'test_ref_id' => 17, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '10.5', 'rescomment' => null], - ['result_id' => 57, 'control_ref_id' => 6, 'test_ref_id' => 1, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '48.9562924866303', 'rescomment' => null], - ['result_id' => 58, 'control_ref_id' => 6, 'test_ref_id' => 2, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '52.1440402715625', 'rescomment' => null], - ['result_id' => 59, 'control_ref_id' => 6, 'test_ref_id' => 3, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '0.827525226237078', 'rescomment' => null], - ['result_id' => 60, 'control_ref_id' => 6, 'test_ref_id' => 4, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1.43268122033837', 'rescomment' => null], - ['result_id' => 61, 'control_ref_id' => 6, 'test_ref_id' => 5, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '3.32791020761993', 'rescomment' => null], - ['result_id' => 62, 'control_ref_id' => 6, 'test_ref_id' => 6, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '20.1899916884103', 'rescomment' => null], - ['result_id' => 63, 'control_ref_id' => 6, 'test_ref_id' => 7, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '0.942164469720469', 'rescomment' => null], - ['result_id' => 64, 'control_ref_id' => 6, 'test_ref_id' => 8, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '4.92672863627875', 'rescomment' => null], - ['result_id' => 65, 'control_ref_id' => 6, 'test_ref_id' => 9, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '97.9752041498986', 'rescomment' => null], - ['result_id' => 66, 'control_ref_id' => 6, 'test_ref_id' => 10, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '82', 'rescomment' => null], - ['result_id' => 67, 'control_ref_id' => 6, 'test_ref_id' => 11, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '55.6067623790927', 'rescomment' => null], - ['result_id' => 68, 'control_ref_id' => 7, 'test_ref_id' => 18, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1.3534129858017', 'rescomment' => null], - ['result_id' => 69, 'control_ref_id' => 8, 'test_ref_id' => 18, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '2.92454624176025', 'rescomment' => null], - ['result_id' => 70, 'control_ref_id' => 9, 'test_ref_id' => 1, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '41.9241811453099', 'rescomment' => null], - ['result_id' => 71, 'control_ref_id' => 9, 'test_ref_id' => 2, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '50.2606047539432', 'rescomment' => null], - ['result_id' => 72, 'control_ref_id' => 9, 'test_ref_id' => 3, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '0.618850628140718', 'rescomment' => null], - ['result_id' => 73, 'control_ref_id' => 9, 'test_ref_id' => 4, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1.64659256568823', 'rescomment' => null], - ['result_id' => 74, 'control_ref_id' => 9, 'test_ref_id' => 5, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '3.37936528279952', 'rescomment' => null], - ['result_id' => 75, 'control_ref_id' => 9, 'test_ref_id' => 6, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '19.9687141929191', 'rescomment' => null], - ['result_id' => 76, 'control_ref_id' => 9, 'test_ref_id' => 7, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '1.25401465739322', 'rescomment' => null], - ['result_id' => 77, 'control_ref_id' => 9, 'test_ref_id' => 8, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '5.20068765776226', 'rescomment' => null], - ['result_id' => 78, 'control_ref_id' => 9, 'test_ref_id' => 9, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '85.8656412403935', 'rescomment' => null], - ['result_id' => 79, 'control_ref_id' => 9, 'test_ref_id' => 10, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '73.7679469620088', 'rescomment' => null], - ['result_id' => 80, 'control_ref_id' => 9, 'test_ref_id' => 11, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '32.6032920741649', 'rescomment' => null], - ['result_id' => 81, 'control_ref_id' => 9, 'test_ref_id' => 12, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '4.60016347657495', 'rescomment' => null], - ['result_id' => 82, 'control_ref_id' => 10, 'test_ref_id' => 19, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '3.07556349669703', 'rescomment' => null], - ['result_id' => 83, 'control_ref_id' => 11, 'test_ref_id' => 19, 'resdate' => '2022-01-03 00:00:00', 'resvalue' => '14.2416023954004', 'rescomment' => null], - ['result_id' => 84, 'control_ref_id' => 1, 'test_ref_id' => 1, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '151.987144896542', 'rescomment' => null], - ['result_id' => 85, 'control_ref_id' => 1, 'test_ref_id' => 2, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '118.037436722317', 'rescomment' => null], - ['result_id' => 86, 'control_ref_id' => 1, 'test_ref_id' => 3, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '1.7947151556153', 'rescomment' => null], - ['result_id' => 87, 'control_ref_id' => 1, 'test_ref_id' => 4, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.73906612533412', 'rescomment' => null], - ['result_id' => 88, 'control_ref_id' => 1, 'test_ref_id' => 5, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.60361234521986', 'rescomment' => null], - ['result_id' => 89, 'control_ref_id' => 1, 'test_ref_id' => 6, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '72.6643107473908', 'rescomment' => null], - ['result_id' => 90, 'control_ref_id' => 1, 'test_ref_id' => 7, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.63980962604914', 'rescomment' => null], - ['result_id' => 91, 'control_ref_id' => 1, 'test_ref_id' => 8, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '8.38141623646488', 'rescomment' => null], - ['result_id' => 92, 'control_ref_id' => 1, 'test_ref_id' => 9, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '264.978406417832', 'rescomment' => null], - ['result_id' => 93, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '181.555224534248', 'rescomment' => null], - ['result_id' => 94, 'control_ref_id' => 1, 'test_ref_id' => 11, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '96.2859292539928', 'rescomment' => null], - ['result_id' => 95, 'control_ref_id' => 1, 'test_ref_id' => 12, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '6.9194402361869', 'rescomment' => null], - ['result_id' => 96, 'control_ref_id' => 1, 'test_ref_id' => 2, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '110.231586595837', 'rescomment' => null], - ['result_id' => 97, 'control_ref_id' => 1, 'test_ref_id' => 8, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '7.83563261140536', 'rescomment' => null], - ['result_id' => 98, 'control_ref_id' => 2, 'test_ref_id' => 13, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '162.230018707428', 'rescomment' => null], - ['result_id' => 99, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '130.52137139783', 'rescomment' => null], - ['result_id' => 100, 'control_ref_id' => 2, 'test_ref_id' => 15, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '40.1447263115978', 'rescomment' => null], - ['result_id' => 101, 'control_ref_id' => 2, 'test_ref_id' => 16, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '101.152360213402', 'rescomment' => null], - ['result_id' => 102, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '102.256365254374', 'rescomment' => null], - ['result_id' => 103, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '104.629167708808', 'rescomment' => null], - ['result_id' => 104, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '82.6663002141555', 'rescomment' => null], - ['result_id' => 105, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '116.848292060971', 'rescomment' => null], - ['result_id' => 106, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '6', 'rescomment' => null], - ['result_id' => 107, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.9', 'rescomment' => null], - ['result_id' => 108, 'control_ref_id' => 4, 'test_ref_id' => 13, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '225.968857118997', 'rescomment' => null], - ['result_id' => 109, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '174.601513698878', 'rescomment' => null], - ['result_id' => 110, 'control_ref_id' => 4, 'test_ref_id' => 15, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '60.5069551717738', 'rescomment' => null], - ['result_id' => 111, 'control_ref_id' => 4, 'test_ref_id' => 16, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '139.447942846202', 'rescomment' => null], - ['result_id' => 112, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '143.31010007369', 'rescomment' => null], - ['result_id' => 113, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '144.761372351536', 'rescomment' => null], - ['result_id' => 114, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '115.071814150515', 'rescomment' => null], - ['result_id' => 115, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '161.317934555282', 'rescomment' => null], - ['result_id' => 116, 'control_ref_id' => 5, 'test_ref_id' => 17, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '10.2', 'rescomment' => null], - ['result_id' => 117, 'control_ref_id' => 6, 'test_ref_id' => 1, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '49.5516111762261', 'rescomment' => null], - ['result_id' => 118, 'control_ref_id' => 6, 'test_ref_id' => 2, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '52.3007836764823', 'rescomment' => null], - ['result_id' => 119, 'control_ref_id' => 6, 'test_ref_id' => 3, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '0.826492230714472', 'rescomment' => null], - ['result_id' => 120, 'control_ref_id' => 6, 'test_ref_id' => 4, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '1.4488869704763', 'rescomment' => null], - ['result_id' => 121, 'control_ref_id' => 6, 'test_ref_id' => 5, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '3.44673661899837', 'rescomment' => null], - ['result_id' => 122, 'control_ref_id' => 6, 'test_ref_id' => 6, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '20.730181610828', 'rescomment' => null], - ['result_id' => 123, 'control_ref_id' => 6, 'test_ref_id' => 7, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '0.931063374396039', 'rescomment' => null], - ['result_id' => 124, 'control_ref_id' => 6, 'test_ref_id' => 8, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.90811693843901', 'rescomment' => null], - ['result_id' => 125, 'control_ref_id' => 6, 'test_ref_id' => 9, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '101.930759918121', 'rescomment' => null], - ['result_id' => 126, 'control_ref_id' => 6, 'test_ref_id' => 10, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '75.5729386133723', 'rescomment' => null], - ['result_id' => 127, 'control_ref_id' => 6, 'test_ref_id' => 11, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '56.5900268982851', 'rescomment' => null], - ['result_id' => 128, 'control_ref_id' => 6, 'test_ref_id' => 10, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '102.528037735786', 'rescomment' => null], - ['result_id' => 129, 'control_ref_id' => 12, 'test_ref_id' => 20, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '51.0905355215073', 'rescomment' => null], - ['result_id' => 130, 'control_ref_id' => 12, 'test_ref_id' => 20, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '37.0758876204491', 'rescomment' => null], - ['result_id' => 131, 'control_ref_id' => 13, 'test_ref_id' => 20, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '104.115432500839', 'rescomment' => null], - ['result_id' => 132, 'control_ref_id' => 13, 'test_ref_id' => 20, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '126.745772361755', 'rescomment' => null], - ['result_id' => 133, 'control_ref_id' => 9, 'test_ref_id' => 1, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '44.2766951686621', 'rescomment' => null], - ['result_id' => 134, 'control_ref_id' => 9, 'test_ref_id' => 2, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '52.3172542490699', 'rescomment' => null], - ['result_id' => 135, 'control_ref_id' => 9, 'test_ref_id' => 3, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '0.611564331171467', 'rescomment' => null], - ['result_id' => 136, 'control_ref_id' => 9, 'test_ref_id' => 4, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '1.61071374749995', 'rescomment' => null], - ['result_id' => 137, 'control_ref_id' => 9, 'test_ref_id' => 5, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '3.40677107339127', 'rescomment' => null], - ['result_id' => 138, 'control_ref_id' => 9, 'test_ref_id' => 6, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '20.3040445233696', 'rescomment' => null], - ['result_id' => 139, 'control_ref_id' => 9, 'test_ref_id' => 7, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '1.18843758036108', 'rescomment' => null], - ['result_id' => 140, 'control_ref_id' => 9, 'test_ref_id' => 8, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '5.30604556512929', 'rescomment' => null], - ['result_id' => 141, 'control_ref_id' => 9, 'test_ref_id' => 9, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '89.4499417480113', 'rescomment' => null], - ['result_id' => 142, 'control_ref_id' => 9, 'test_ref_id' => 10, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '74.0960687372425', 'rescomment' => null], - ['result_id' => 143, 'control_ref_id' => 9, 'test_ref_id' => 11, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '32.4566384751244', 'rescomment' => null], - ['result_id' => 144, 'control_ref_id' => 9, 'test_ref_id' => 12, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.48437909776323', 'rescomment' => null], - ['result_id' => 145, 'control_ref_id' => 9, 'test_ref_id' => 2, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '50.9667682640676', 'rescomment' => null], - ['result_id' => 146, 'control_ref_id' => 9, 'test_ref_id' => 8, 'resdate' => '2022-01-04 00:00:00', 'resvalue' => '4.93310398630639', 'rescomment' => null], - ['result_id' => 147, 'control_ref_id' => 1, 'test_ref_id' => 1, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '145.49911151053', 'rescomment' => null], - ['result_id' => 148, 'control_ref_id' => 1, 'test_ref_id' => 2, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '113.383579655159', 'rescomment' => null], - ['result_id' => 149, 'control_ref_id' => 1, 'test_ref_id' => 3, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '1.78951109759924', 'rescomment' => null], - ['result_id' => 150, 'control_ref_id' => 1, 'test_ref_id' => 4, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.93788942107251', 'rescomment' => null], - ['result_id' => 151, 'control_ref_id' => 1, 'test_ref_id' => 5, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.6838893149483', 'rescomment' => null], - ['result_id' => 152, 'control_ref_id' => 1, 'test_ref_id' => 6, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '71.2844487736166', 'rescomment' => null], - ['result_id' => 153, 'control_ref_id' => 1, 'test_ref_id' => 7, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.66921401448631', 'rescomment' => null], - ['result_id' => 154, 'control_ref_id' => 1, 'test_ref_id' => 8, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '7.75508570982025', 'rescomment' => null], - ['result_id' => 155, 'control_ref_id' => 1, 'test_ref_id' => 9, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '259.337398768362', 'rescomment' => null], - ['result_id' => 156, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '237.342516597661', 'rescomment' => null], - ['result_id' => 157, 'control_ref_id' => 1, 'test_ref_id' => 11, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '95.377689131424', 'rescomment' => null], - ['result_id' => 158, 'control_ref_id' => 1, 'test_ref_id' => 12, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '6.33840481787399', 'rescomment' => null], - ['result_id' => 159, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '254.058423430058', 'rescomment' => null], - ['result_id' => 160, 'control_ref_id' => 1, 'test_ref_id' => 12, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '7.61797516866643', 'rescomment' => null], - ['result_id' => 161, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '243.755676108857', 'rescomment' => null], - ['result_id' => 162, 'control_ref_id' => 1, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '193.063562956371', 'rescomment' => null], - ['result_id' => 163, 'control_ref_id' => 2, 'test_ref_id' => 13, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '156.243798489035', 'rescomment' => null], - ['result_id' => 164, 'control_ref_id' => 2, 'test_ref_id' => 14, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '119.907027927493', 'rescomment' => null], - ['result_id' => 165, 'control_ref_id' => 2, 'test_ref_id' => 15, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '40.447059699393', 'rescomment' => null], - ['result_id' => 166, 'control_ref_id' => 2, 'test_ref_id' => 16, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '102.231291242292', 'rescomment' => null], - ['result_id' => 167, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '5.3', 'rescomment' => null], - ['result_id' => 168, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '1921499810', 'rescomment' => null], - ['result_id' => 169, 'control_ref_id' => 3, 'test_ref_id' => 17, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '5.1', 'rescomment' => null], - ['result_id' => 170, 'control_ref_id' => 4, 'test_ref_id' => 13, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '219.038828305261', 'rescomment' => null], - ['result_id' => 171, 'control_ref_id' => 4, 'test_ref_id' => 14, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '166.155678322747', 'rescomment' => null], - ['result_id' => 172, 'control_ref_id' => 4, 'test_ref_id' => 15, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '56.8925909121002', 'rescomment' => null], - ['result_id' => 173, 'control_ref_id' => 4, 'test_ref_id' => 16, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '140.823342734069', 'rescomment' => null], - ['result_id' => 174, 'control_ref_id' => 5, 'test_ref_id' => 17, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '10.2', 'rescomment' => null], - ['result_id' => 175, 'control_ref_id' => 6, 'test_ref_id' => 1, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '48.9587059015567', 'rescomment' => null], - ['result_id' => 176, 'control_ref_id' => 6, 'test_ref_id' => 2, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '49.1468267441428', 'rescomment' => null], - ['result_id' => 177, 'control_ref_id' => 6, 'test_ref_id' => 3, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '0.799690212662777', 'rescomment' => null], - ['result_id' => 178, 'control_ref_id' => 6, 'test_ref_id' => 4, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '1.45552498470141', 'rescomment' => null], - ['result_id' => 179, 'control_ref_id' => 6, 'test_ref_id' => 5, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '3.41160793396446', 'rescomment' => null], - ['result_id' => 180, 'control_ref_id' => 6, 'test_ref_id' => 6, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '20.2910405834124', 'rescomment' => null], - ['result_id' => 181, 'control_ref_id' => 6, 'test_ref_id' => 7, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '0.94094934133914', 'rescomment' => null], - ['result_id' => 182, 'control_ref_id' => 6, 'test_ref_id' => 8, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.49152415745592', 'rescomment' => null], - ['result_id' => 183, 'control_ref_id' => 6, 'test_ref_id' => 9, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '100.024475839182', 'rescomment' => null], - ['result_id' => 184, 'control_ref_id' => 6, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '85.9679935713317', 'rescomment' => null], - ['result_id' => 185, 'control_ref_id' => 6, 'test_ref_id' => 11, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '53.8509856427683', 'rescomment' => null], - ['result_id' => 186, 'control_ref_id' => 9, 'test_ref_id' => 1, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '42.7806264740846', 'rescomment' => null], - ['result_id' => 187, 'control_ref_id' => 9, 'test_ref_id' => 2, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '51.9985050454933', 'rescomment' => null], - ['result_id' => 188, 'control_ref_id' => 9, 'test_ref_id' => 3, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '0.649795363795779', 'rescomment' => null], - ['result_id' => 189, 'control_ref_id' => 9, 'test_ref_id' => 4, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '1.80260045112525', 'rescomment' => null], - ['result_id' => 190, 'control_ref_id' => 9, 'test_ref_id' => 5, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '3.35288773545917', 'rescomment' => null], - ['result_id' => 191, 'control_ref_id' => 9, 'test_ref_id' => 6, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '20.6904621653494', 'rescomment' => null], - ['result_id' => 192, 'control_ref_id' => 9, 'test_ref_id' => 7, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '1.19703451489628', 'rescomment' => null], - ['result_id' => 193, 'control_ref_id' => 9, 'test_ref_id' => 8, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.89184138396658', 'rescomment' => null], - ['result_id' => 194, 'control_ref_id' => 9, 'test_ref_id' => 9, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '91.9123811518993', 'rescomment' => null], - ['result_id' => 195, 'control_ref_id' => 9, 'test_ref_id' => 10, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '100.544617296457', 'rescomment' => null], - ['result_id' => 196, 'control_ref_id' => 9, 'test_ref_id' => 11, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '31.390065068111', 'rescomment' => null], - ['result_id' => 197, 'control_ref_id' => 9, 'test_ref_id' => 12, 'resdate' => '2022-01-05 00:00:00', 'resvalue' => '4.17808071506795', 'rescomment' => null], - ]; - $this->db->table('results')->insertBatch($data); - } -} diff --git a/app/Models/ControlModel.php b/app/Models/ControlModel.php deleted file mode 100644 index 3aec9bd..0000000 --- a/app/Models/ControlModel.php +++ /dev/null @@ -1,41 +0,0 @@ -where('dept_ref_id', $deptId)->findAll(); - } - - public function getWithDept() - { - $builder = $this->db->table('dict_controls c'); - $builder->select('c.*, d.name as dept_name'); - $builder->join('dict_depts d', 'd.dept_id = c.dept_ref_id', 'left'); - return $builder->get()->getResultArray(); - } - - public function getActiveByDate($date, $deptId = null) - { - $builder = $this->db->table('dict_controls c'); - $builder->select('c.*'); - $builder->where('c.expdate >=', $date); - if ($deptId) { - $builder->where('c.dept_ref_id', $deptId); - } - $builder->orderBy('c.name', 'ASC'); - return $builder->get()->getResultArray(); - } -} diff --git a/app/Models/ControlTestModel.php b/app/Models/ControlTestModel.php deleted file mode 100644 index 7ba7530..0000000 --- a/app/Models/ControlTestModel.php +++ /dev/null @@ -1,32 +0,0 @@ -db->table('control_tests ct'); - $builder->select('ct.*, t.name as test_name, t.unit'); - $builder->join('dict_tests t', 't.test_id = ct.test_ref_id'); - $builder->where('ct.control_ref_id', $controlId); - return $builder->get()->getResultArray(); - } - - public function getByControlAndTest($controlId, $testId) - { - return $this->where('control_ref_id', $controlId) - ->where('test_ref_id', $testId) - ->first(); - } -} diff --git a/app/Models/DailyResultModel.php b/app/Models/DailyResultModel.php deleted file mode 100644 index 323634e..0000000 --- a/app/Models/DailyResultModel.php +++ /dev/null @@ -1,61 +0,0 @@ -db->table('daily_result'); - $builder->select('*'); - $builder->where('control_ref_id', $controlId); - $builder->where('test_ref_id', $testId); - $builder->where('resdate >=', $startDate); - $builder->where('resdate <=', $endDate); - $builder->orderBy('resdate', 'ASC'); - return $builder->get()->getResultArray(); - } - - public function getByControlMonth($controlId, $yearMonth) - { - $startDate = $yearMonth . '-01'; - $endDate = $yearMonth . '-31'; - - $builder = $this->db->table('daily_result'); - $builder->select('*'); - $builder->where('control_ref_id', $controlId); - $builder->where('resdate >=', $startDate); - $builder->where('resdate <=', $endDate); - return $builder->get()->getResultArray(); - } - - public function saveResult($data) - { - $builder = $this->db->table('daily_result'); - $existing = $builder->select('*') - ->where('control_ref_id', $data['control_ref_id']) - ->where('test_ref_id', $data['test_ref_id']) - ->where('resdate', $data['resdate']) - ->get() - ->getRowArray(); - - if ($existing) { - return $builder->where('daily_result_id', $existing['daily_result_id'])->update($data); - } else { - return $builder->insert($data); - } - } -} diff --git a/app/Models/DeptModel.php b/app/Models/DeptModel.php deleted file mode 100644 index 02351b0..0000000 --- a/app/Models/DeptModel.php +++ /dev/null @@ -1,16 +0,0 @@ -where('dept_ref_id', $deptId)->findAll(); - } - - public function getWithDept($keyword = null, $deptId = null) - { - $builder = $this->db->table('dict_controls c'); - $builder->select('c.*, d.name as dept_name'); - $builder->join('dict_depts d', 'd.dept_id = c.dept_ref_id', 'left'); - - if ($keyword) { - $builder->groupStart(); - $builder->like('c.name', $keyword); - $builder->orLike('c.lot', $keyword); - $builder->groupEnd(); - } - - if ($deptId) { - $builder->where('c.dept_ref_id', $deptId); - } - - return $builder->get()->getResultArray(); - } - - public function getActiveByDate($date, $deptId = null) - { - $builder = $this->db->table('dict_controls c'); - $builder->select('c.*'); - $builder->where('c.expdate >=', $date); - if ($deptId) { - $builder->where('c.dept_ref_id', $deptId); - } - $builder->orderBy('c.name', 'ASC'); - return $builder->get()->getResultArray(); - } -} diff --git a/app/Models/DictDeptModel.php b/app/Models/DictDeptModel.php deleted file mode 100644 index d5bd067..0000000 --- a/app/Models/DictDeptModel.php +++ /dev/null @@ -1,16 +0,0 @@ -where('dept_ref_id', $deptId)->findAll(); - } - - public function getWithDept() - { - $builder = $this->db->table('dict_tests t'); - $builder->select('t.*, d.name as dept_name'); - $builder->join('dict_depts d', 'd.dept_id = t.dept_ref_id', 'left'); - return $builder->get()->getResultArray(); - } -} diff --git a/app/Models/Master/MasterControlsModel.php b/app/Models/Master/MasterControlsModel.php new file mode 100644 index 0000000..ba73971 --- /dev/null +++ b/app/Models/Master/MasterControlsModel.php @@ -0,0 +1,32 @@ +groupStart() + ->like('name', $keyword) + ->orLike('lot', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/Master/MasterDeptsModel.php b/app/Models/Master/MasterDeptsModel.php new file mode 100644 index 0000000..5e2a300 --- /dev/null +++ b/app/Models/Master/MasterDeptsModel.php @@ -0,0 +1,27 @@ +groupStart() + ->like('name', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/Master/MasterTestsModel.php b/app/Models/Master/MasterTestsModel.php new file mode 100644 index 0000000..e692759 --- /dev/null +++ b/app/Models/Master/MasterTestsModel.php @@ -0,0 +1,33 @@ +groupStart() + ->like('name', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/MonthlyCommentModel.php b/app/Models/MonthlyCommentModel.php deleted file mode 100644 index cf8c2b1..0000000 --- a/app/Models/MonthlyCommentModel.php +++ /dev/null @@ -1,38 +0,0 @@ -where('control_ref_id', $controlId) - ->where('test_ref_id', $testId) - ->where('commonth', $yearMonth) - ->first(); - } - - public function saveComment($data) - { - $existing = $this->where('control_ref_id', $data['control_ref_id']) - ->where('test_ref_id', $data['test_ref_id']) - ->where('commonth', $data['commonth']) - ->first(); - - if ($existing) { - return $this->update($existing['monthly_comment_id'], $data); - } else { - return $this->insert($data); - } - } -} diff --git a/app/Models/Qc/ControlTestsModel.php b/app/Models/Qc/ControlTestsModel.php new file mode 100644 index 0000000..e15abdc --- /dev/null +++ b/app/Models/Qc/ControlTestsModel.php @@ -0,0 +1,30 @@ +groupStart() + ->like('mean', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/Qc/ResultCommentsModel.php b/app/Models/Qc/ResultCommentsModel.php new file mode 100644 index 0000000..d602de0 --- /dev/null +++ b/app/Models/Qc/ResultCommentsModel.php @@ -0,0 +1,31 @@ +groupStart() + ->like('comment_month', $keyword) + ->orLike('com_text', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/Qc/ResultsModel.php b/app/Models/Qc/ResultsModel.php new file mode 100644 index 0000000..50943aa --- /dev/null +++ b/app/Models/Qc/ResultsModel.php @@ -0,0 +1,31 @@ +groupStart() + ->like('res_value', $keyword) + ->groupEnd() + ->findAll(); + } + return $this->findAll(); + } +} diff --git a/app/Models/ResultCommentModel.php b/app/Models/ResultCommentModel.php deleted file mode 100644 index d4086be..0000000 --- a/app/Models/ResultCommentModel.php +++ /dev/null @@ -1,38 +0,0 @@ -where('control_ref_id', $controlId) - ->where('test_ref_id', $testId) - ->where('commonth', $yearMonth) - ->first(); - } - - public function saveComment($data) - { - $existing = $this->where('control_ref_id', $data['control_ref_id']) - ->where('test_ref_id', $data['test_ref_id']) - ->where('commonth', $data['commonth']) - ->first(); - - if ($existing) { - return $this->update($existing['result_comment_id'], $data); - } else { - return $this->insert($data); - } - } -} diff --git a/app/Models/ResultModel.php b/app/Models/ResultModel.php deleted file mode 100644 index 9bb70a9..0000000 --- a/app/Models/ResultModel.php +++ /dev/null @@ -1,72 +0,0 @@ -db->table('results'); - $builder->select('*'); - $builder->where('control_ref_id', $controlId); - $builder->where('test_ref_id', $testId); - $builder->where('resdate >=', $startDate); - $builder->where('resdate <=', $endDate); - $builder->orderBy('resdate', 'ASC'); - return $builder->get()->getResultArray(); - } - - public function getByControlMonth($controlId, $yearMonth) - { - $startDate = $yearMonth . '-01'; - $endDate = $yearMonth . '-31'; - - $builder = $this->db->table('results'); - $builder->select('*'); - $builder->where('control_ref_id', $controlId); - $builder->where('resdate >=', $startDate); - $builder->where('resdate <=', $endDate); - return $builder->get()->getResultArray(); - } - - public function saveResult($data) - { - $builder = $this->db->table('results'); - $existing = $builder->select('*') - ->where('control_ref_id', $data['control_ref_id']) - ->where('test_ref_id', $data['test_ref_id']) - ->where('resdate', $data['resdate']) - ->get() - ->getRowArray(); - - if ($existing) { - return $builder->where('result_id', $existing['result_id'])->update($data); - } else { - return $builder->insert($data); - } - } - - public function checkExisting($controlId, $testId, $resdate) - { - $builder = $this->db->table('results'); - return $builder->select('result_id') - ->where('control_ref_id', $controlId) - ->where('test_ref_id', $testId) - ->where('resdate', $resdate) - ->get() - ->getRowArray(); - } -} diff --git a/app/Models/TestModel.php b/app/Models/TestModel.php deleted file mode 100644 index 2897ab7..0000000 --- a/app/Models/TestModel.php +++ /dev/null @@ -1,29 +0,0 @@ -where('dept_ref_id', $deptId)->findAll(); - } - - public function getWithDept() - { - $builder = $this->db->table('dict_tests t'); - $builder->select('t.*, d.name as dept_name'); - $builder->join('dict_depts d', 'd.dept_id = t.dept_ref_id', 'left'); - return $builder->get()->getResultArray(); - } -} diff --git a/app/Views/control/dialog_form.php b/app/Views/control/dialog_form.php deleted file mode 100644 index 2ee4847..0000000 --- a/app/Views/control/dialog_form.php +++ /dev/null @@ -1,95 +0,0 @@ - -
-
- - -
-
- -
-

- -
- - -
-
-
-
- - -

-
-
- - -

-
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-
-

Select tests to associate with this control

-
-
-
- - -
- - -
-
-
-
- diff --git a/app/Views/control/form.php b/app/Views/control/form.php deleted file mode 100644 index f9cd142..0000000 --- a/app/Views/control/form.php +++ /dev/null @@ -1,46 +0,0 @@ -
-
-

- -
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- Cancel - -
-
-
-
-
diff --git a/app/Views/control/index.php b/app/Views/control/index.php deleted file mode 100644 index 85cb763..0000000 --- a/app/Views/control/index.php +++ /dev/null @@ -1,261 +0,0 @@ -extend("layout/main_layout"); ?> -section("content") ?> -
- -
-
-

Control Dictionary

-

Manage control materials and lot numbers

-
- -
- - -
-
- - -
-
- - -
-
-
- - -
- - -
-
- - -
- - - - - - - - -
- - - include('control/dialog_form'); ?> -
-endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/app/Views/dashboard.php b/app/Views/dashboard.php index 631534c..c30c5a9 100644 --- a/app/Views/dashboard.php +++ b/app/Views/dashboard.php @@ -1,142 +1,67 @@ extend("layout/main_layout"); ?> -section("content") ?> -
-
-
-
-
-
-

Total Tests

-

-
-
- -
-
-
- - - Active - - in library -
-
-
-
-
-

Total Controls

-

-
-
- -
-
-
- Reference - definitions -
-
+section("content"); ?> +
+
+
+

Dashboard

+

Quality Control Overview

+
+
-
-
-
-

Departments

-

-
-
- -
+
+
+
+
+

Total Controls

+

24

-
- Active - units +
+
- -
endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/app/Views/dept/dialog_form.php b/app/Views/dept/dialog_form.php deleted file mode 100644 index fa96914..0000000 --- a/app/Views/dept/dialog_form.php +++ /dev/null @@ -1,60 +0,0 @@ - -
-
- - -
-
- -
-

- -
- - -
-
-
- - -

-
-
- - -
- - -
-
-
-
- diff --git a/app/Views/dept/index.php b/app/Views/dept/index.php deleted file mode 100644 index 54c9f27..0000000 --- a/app/Views/dept/index.php +++ /dev/null @@ -1,187 +0,0 @@ -extend("layout/main_layout"); ?> -section("content") ?> -
- -
-
-

Department Dictionary

-

Manage department entries

-
- -
- - -
-
- - -
-
- - -
- - - - - - - - -
- - - include('dept/dialog_form'); ?> -
-endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/app/Views/entry/daily.php b/app/Views/entry/daily.php index c281a5e..7298629 100644 --- a/app/Views/entry/daily.php +++ b/app/Views/entry/daily.php @@ -1,256 +1,16 @@ extend("layout/main_layout"); ?> -section("content") ?> -
-
-
-
-

Daily Entry

-

Enter daily QC results

-
-
- - Press Ctrl+S to save -
-
-
-
- - -
+section("content"); ?> +
+
+
+

Daily Entry

+

Record daily QC test results

+
-
-
- - -

-
-
- - -

-
-
- - -

-
-
- - -

-
-
- -
-
-

Result

-
-
- - -

-
-
- - -
-
-
- -
-
-
+
+

Daily entry form coming soon...

endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/app/Views/entry/index.php b/app/Views/entry/index.php new file mode 100644 index 0000000..3e71483 --- /dev/null +++ b/app/Views/entry/index.php @@ -0,0 +1,40 @@ +extend("layout/main_layout"); ?> + +section("content"); ?> +
+
+
+

QC Entry

+

Record quality control results

+
+
+ +
+
+ +
+
+ +
+
+

Daily Entry

+

Record daily QC test results

+
+
+
+ +
+
+
+ +
+
+

Monthly Review

+

Monthly QC analysis & comments

+
+
+
+
+
+
+endSection(); ?> diff --git a/app/Views/entry/monthly.php b/app/Views/entry/monthly.php deleted file mode 100644 index e2d2b56..0000000 --- a/app/Views/entry/monthly.php +++ /dev/null @@ -1,498 +0,0 @@ -extend("layout/main_layout"); ?> -section("content") ?> -
-
-
-
-

Monthly Entry

-

Enter monthly QC results

-
-
- - Press Ctrl+S to save -
-
- -
-
- - -
-
- -
-
- - -

-
-
- - -

-
-
- - -

-
-
- -
-
- -
- -
-
-
- -
-
-

- -

-
-
- - Weekday -
-
- - Weekend -
-
-
- - - - - -
-
-
- - -
-
-
- - -
- -
-
-
-
- -
- -

Select one or more tests above to view and enter monthly data

-
- -
- -

Select a control to view available tests

-
-
-
-endSection(); ?> - -section("script") ?> - -endSection(); ?> diff --git a/app/Views/layout/form_layout.php b/app/Views/layout/form_layout.php deleted file mode 100644 index fb6eed5..0000000 --- a/app/Views/layout/form_layout.php +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - <?= $page_title ?? 'QC Application' ?> - - - - - - - - - - - - - - - -
-
-
-

-
- renderSection("content"); ?> -
-
- - - renderSection("script"); ?> - - - diff --git a/app/Views/layout/main_layout.php b/app/Views/layout/main_layout.php index 4f5a0eb..f8961c9 100644 --- a/app/Views/layout/main_layout.php +++ b/app/Views/layout/main_layout.php @@ -1,252 +1,171 @@ - - + - <?= $page_title ?? 'QC Application' ?> - - - - - - + <?= $pageData['title'] ?? 'TinyQC - QC Management System' ?> + + + + - - - - - - - - - -
-
-
- Loading application... -
-
- -
- - - - -
-
-
-
- -

-
- -
- - - -
AD
+ + renderSection('content') ?> +
+ +
+ +
- -
-
- renderSection("content"); ?> -
-
+
- - - - + - renderSection("script"); ?> + + renderSection('script') ?> - diff --git a/app/Views/master/control/dialog_control_form.php b/app/Views/master/control/dialog_control_form.php new file mode 100644 index 0000000..80a58ba --- /dev/null +++ b/app/Views/master/control/dialog_control_form.php @@ -0,0 +1,83 @@ + + + + diff --git a/app/Views/master/control/index.php b/app/Views/master/control/index.php new file mode 100644 index 0000000..20dc3aa --- /dev/null +++ b/app/Views/master/control/index.php @@ -0,0 +1,242 @@ +extend("layout/main_layout"); ?> + +section("content"); ?> +
+
+
+

Controls

+

Manage QC control standards

+
+ +
+ +
+
+
+ + +
+ +
+
+ +
+ + + + + +
+ + include('master/control/dialog_control_form'); ?> +
+endSection(); ?> + +section("script"); ?> + +endSection(); ?> diff --git a/app/Views/master/dept/dialog_dept_form.php b/app/Views/master/dept/dialog_dept_form.php new file mode 100644 index 0000000..a619dc7 --- /dev/null +++ b/app/Views/master/dept/dialog_dept_form.php @@ -0,0 +1,44 @@ + + + + diff --git a/app/Views/master/dept/index.php b/app/Views/master/dept/index.php new file mode 100644 index 0000000..d5e8fa1 --- /dev/null +++ b/app/Views/master/dept/index.php @@ -0,0 +1,231 @@ +extend("layout/main_layout"); ?> + +section("content"); ?> +
+
+
+

Departments

+

Manage laboratory departments

+
+ +
+ +
+
+
+ + +
+ +
+
+ +
+ + + + + +
+ + include('master/dept/dialog_dept_form'); ?> +
+endSection(); ?> + +section("script"); ?> + +endSection(); ?> diff --git a/app/Views/master/test/dialog_test_form.php b/app/Views/master/test/dialog_test_form.php new file mode 100644 index 0000000..5739f05 --- /dev/null +++ b/app/Views/master/test/dialog_test_form.php @@ -0,0 +1,113 @@ + + + + diff --git a/app/Views/master/test/index.php b/app/Views/master/test/index.php new file mode 100644 index 0000000..da4d6fa --- /dev/null +++ b/app/Views/master/test/index.php @@ -0,0 +1,240 @@ +extend("layout/main_layout"); ?> + +section("content"); ?> +
+
+
+

Tests

+

Manage laboratory tests and parameters

+
+ +
+ +
+
+
+ + +
+ +
+
+ +
+ + + + + +
+ + include('master/test/dialog_test_form'); ?> +
+endSection(); ?> + +section("script"); ?> + +endSection(); ?> diff --git a/app/Views/report/index.php b/app/Views/report/index.php index a375afa..0dccdd8 100644 --- a/app/Views/report/index.php +++ b/app/Views/report/index.php @@ -1,141 +1,16 @@ extend("layout/main_layout"); ?> -section("content") ?> -
-
-
-
-

Generate Report

-

Select parameters to generate QC report

-
-
-
- - -
-
- -
-
-
- - -

-
- -
- - -

-
- -
-
- - -

-
-
- - -
-
- - -
-
- -
- -
-
-
+section("content"); ?> +
+
+
+

Reports

+

Generate and view QC reports

+ +
+

Reports module coming soon...

+
endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/app/Views/report/view.php b/app/Views/report/view.php index 13ee2ae..2d72b39 100644 --- a/app/Views/report/view.php +++ b/app/Views/report/view.php @@ -1,286 +1,16 @@ extend("layout/main_layout"); ?> -section("content") ?> -
-
-

QC Report -

-
- + +section("content"); ?> +
+
+
+

Report View

+

View detailed QC report

- 1): ?> -
-

QC Trend Overview

-
-
- -
-
- -
-
+
+

Report viewer coming soon...

- - - $data): ?> -
-
-
-

(Lot: )

-

-
-
- - Out of Range - -
-
- - - -
-
-
-

Mean

-

-
-
-

SD

-

-
-
-

+2SD

-

-
-
-

-2SD

-

-
-
- -
-

Trend Chart

-
- -
-
- -
- - - - - - - - - - - 0) ? ($value - $mean) / $sd : null; - $status = $zScore !== null ? (abs($zScore) > 2 ? 'Out' : (abs($zScore) > 1 ? 'Warn' : 'OK')) : '-'; - $statusClass = $status == 'Out' ? 'text-red-600 font-bold bg-red-50' : ($status == 'Warn' ? 'text-yellow-600 bg-yellow-50' : 'text-green-600'); - ?> - - - - - - - - -
DayValueZ-ScoreStatus
-
- - -
-

Monthly Comment:

-

-
- -
- -
- No test data found for this control. -
- -
- -
+
endSection(); ?> - -section("script") ?> - - - -endSection(); ?> - diff --git a/app/Views/test/dialog_form.php b/app/Views/test/dialog_form.php deleted file mode 100644 index 57922cb..0000000 --- a/app/Views/test/dialog_form.php +++ /dev/null @@ -1,89 +0,0 @@ - -
-
- - -
-
- -
-

- -
- - -
-
-
-
- - -

-
-
- - -

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
- - -
-
-
-
- diff --git a/app/Views/test/index.php b/app/Views/test/index.php deleted file mode 100644 index 4e84ed8..0000000 --- a/app/Views/test/index.php +++ /dev/null @@ -1,231 +0,0 @@ -extend("layout/main_layout"); ?> -section("content") ?> -
- -
-
-

Test Dictionary

-

Manage test types, methods, and units

-
- -
- - -
-
- - -
-
- - -
-
-
- - -
- -
-
- - -
- - - - - - - - -
- - - include('test/dialog_form'); ?> -
-endSection(); ?> - -section("script") ?> - -endSection(); ?> - diff --git a/backup/qc20260114.bak b/backup/qc20260114.bak new file mode 100644 index 0000000000000000000000000000000000000000..04c5f375cef675c33d0a93296d247b401ba0ebee GIT binary patch literal 8625664 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