初始化

This commit is contained in:
2026-08-08 18:28:49 +08:00
parent 9bef4420e0
commit f082037a6e
854 changed files with 217171 additions and 11 deletions
+149
View File
@@ -0,0 +1,149 @@
<?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'];
}
}