db()->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } /** * 新增测试记录主表,返回插入ID * * 兼容接口字段名(v1.5)与数据库实际列名的差异: * status -> test_result (整体测试结果 PASS/NG) * device -> device_code (设备序列号) * test_time -> test_date (测试时间) * project_name -> product_model (产品/项目名称) * 其余接口字段(tester/mo/site/station/work_order/group_name/running_time) * 已通过迁移脚本 upgrade_asd_api_20260718.sql 直接补齐为独立列。 */ public function addRecord($data) { $map = [ 'status' => 'test_result', 'device' => 'device_code', 'test_time' => 'test_date', 'project_name' => 'product_model', ]; foreach ($map as $from => $to) { if (array_key_exists($from, $data)) { // 仅当目标列尚未显式传入时才用接口值填充,避免覆盖 if (!array_key_exists($to, $data) || $data[$to] === '' || $data[$to] === null) { $data[$to] = $data[$from]; } unset($data[$from]); } } $result = $this->add($data); if ($result) { return $this->db()->lastInsertId(); } return false; } /** * 根据ID获取测试记录 */ public function findById($id) { return $this->where(['id = :id'], [':id' => $id])->fetch(); } /** * 新增测试工步详情 */ public function addDetail($data) { $sql = "INSERT INTO DGZXY_asd_test_detail (record_id, seq, test_name, test_item, test_units, data_value, lower_limit, upper_limit, test_value, test_limit, test_result) VALUES (:record_id, :seq, :test_name, :test_item, :test_units, :data_value, :lower_limit, :upper_limit, :test_value, :test_limit, :test_result)"; $stmt = $this->db()->prepare($sql); return $stmt->execute([ ':record_id' => $data['record_id'], ':seq' => $data['seq'] ?? 1, ':test_name' => $data['test_name'] ?? '', ':test_item' => $data['test_item'] ?? '', ':test_units' => $data['test_units'] ?? '', ':data_value' => $data['data_value'] ?? null, ':lower_limit' => $data['lower_limit'] ?? null, ':upper_limit' => $data['upper_limit'] ?? null, ':test_value' => $data['test_value'] ?? '', ':test_limit' => $data['test_limit'] ?? '', ':test_result' => $data['test_result'] ?? 'PASS', ]); } /** * 根据记录ID获取所有工步详情 */ public function getDetails($recordId) { $stmt = $this->db()->prepare("SELECT * FROM DGZXY_asd_test_detail WHERE record_id = :rid ORDER BY seq ASC"); $stmt->execute([':rid' => $recordId]); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } /** * 删除测试记录(级联删除详情) */ public function deleteRecord($id) { // 先删详情(FOREIGN KEY ON DELETE CASCADE 会自动处理,这里显式处理更安全) $this->db()->prepare("DELETE FROM DGZXY_asd_test_detail WHERE record_id = :rid")->execute([':rid' => $id]); // 再删主表 return $this->delete($id); } /** * 统计记录数 */ public function countRecords($keyword = '') { if (!empty($keyword)) { $stmt = $this->db()->prepare("SELECT COUNT(*) AS cnt FROM DGZXY_asd_test_record WHERE qr_code LIKE :kw"); $stmt->execute([':kw' => '%' . $keyword . '%']); return $stmt->fetch(\PDO::FETCH_ASSOC)['cnt']; } $stmt = $this->db()->prepare("SELECT COUNT(*) AS cnt FROM DGZXY_asd_test_record"); $stmt->execute(); return $stmt->fetch(\PDO::FETCH_ASSOC)['cnt']; } }