Files
MES/app/models/AsdTestData.php
2026-08-08 18:28:49 +08:00

150 lines
5.0 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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'];
}
}