150 lines
5.0 KiB
PHP
150 lines
5.0 KiB
PHP
<?php
|
||
namespace app\models;
|
||
|
||
use core\base\Model;
|
||
|
||
/**
|
||
* 昂盛达上位机测试数据模型
|
||
*/
|
||
class AsdTestData extends Model
|
||
{
|
||
protected $table = 'asd_test_record';
|
||
|
||
/**
|
||
* 获取 PDO 实例
|
||
*/
|
||
private function db()
|
||
{
|
||
return \core\db\Db::pdo();
|
||
}
|
||
|
||
/**
|
||
* 获取所有测试记录(含统计信息)
|
||
*/
|
||
public function getAllWithStats($keyword = '', $limit = 50)
|
||
{
|
||
$sql = "SELECT r.*,
|
||
COUNT(d.id) AS step_count,
|
||
SUM(CASE WHEN d.test_result = 'FAIL' THEN 1 ELSE 0 END) AS fail_count
|
||
FROM DGZXY_asd_test_record r
|
||
LEFT JOIN DGZXY_asd_test_detail d ON r.id = d.record_id";
|
||
|
||
$params = [];
|
||
if (!empty($keyword)) {
|
||
$sql .= " WHERE r.qr_code LIKE :keyword";
|
||
$params[':keyword'] = '%' . $keyword . '%';
|
||
}
|
||
|
||
$sql .= " GROUP BY r.id ORDER BY r.id DESC LIMIT " . intval($limit);
|
||
|
||
$stmt = $this->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'];
|
||
}
|
||
}
|