feat(ota): 支持按版本号+版本名+灰度状态检查与分组显示

- 后端新增检查版本是否存在时对版本名称做匹配,避免重复版本名称
- 更新时同步考虑版本名称,防止名称冲突
- 前端实现同型号+版本号+灰度多条记录折叠显示,支持展开查看子记录
- 调整表格列宽及样式,确保树形结构显示正常且细节优化
- 增加分组行视觉区分,弱化折叠子行背景
- 重置展开状态,确保刷新数据后树形结构收起
This commit is contained in:
eafonyang
2026-09-03 15:53:03 +08:00
parent f60255574e
commit e6da74cf01
3 changed files with 60 additions and 15 deletions
+10 -8
View File
@@ -215,7 +215,7 @@ router.post('/api/ota/', async (req: Request, res: Response) => {
const data = parsed.data;
logger.info(`Creating OTA: verCode=${data.verCode}, verName=${data.verName}, model=${data.model}`);
// 检查版本号是否已存在
// 检查版本号+版本名称是否已存在
const [existing] = await db
.select()
.from(otas)
@@ -223,11 +223,12 @@ router.post('/api/ota/', async (req: Request, res: Response) => {
eq(otas.verCode, data.verCode),
eq(otas.model, data.model!),
eq(otas.beta, data.beta ?? 0),
eq(otas.verName, data.verName),
))
.limit(1);
if (existing) {
logger.warn(`OTA version already exists: verCode=${data.verCode}, model=${data.model}, beta=${data.beta ?? 0}`);
res.json(ApiResponse.error('该版本已存在(相同版本+灰度状态)'));
logger.warn(`OTA version already exists: verCode=${data.verCode}, verName=${data.verName}, model=${data.model}, beta=${data.beta ?? 0}`);
res.json(ApiResponse.error('该版本已存在(相同版本+名称+灰度状态)'));
return;
}
@@ -279,20 +280,21 @@ router.put('/api/ota/:ota_id', async (req: Request, res: Response) => {
return;
}
// 如果更新版本号或灰度状态,检查是否冲突
// 如果更新版本号、名称或灰度状态,检查是否冲突
const newVerCode = data.verCode !== undefined && data.verCode !== null ? data.verCode : dbOta.verCode;
const newModel = data.model !== undefined && data.model !== null ? data.model : dbOta.model;
const newBeta = data.beta !== undefined && data.beta !== null ? data.beta : dbOta.beta;
const newVerName = data.verName !== undefined && data.verName !== null ? data.verName : dbOta.verName;
if (newVerCode !== dbOta.verCode || newModel !== dbOta.model || newBeta !== dbOta.beta) {
if (newVerCode !== dbOta.verCode || newModel !== dbOta.model || newBeta !== dbOta.beta || newVerName !== dbOta.verName) {
const [existing] = await db
.select()
.from(otas)
.where(and(eq(otas.verCode, newVerCode), eq(otas.model, newModel!), eq(otas.beta, newBeta)))
.where(and(eq(otas.verCode, newVerCode), eq(otas.model, newModel!), eq(otas.beta, newBeta), eq(otas.verName, newVerName)))
.limit(1);
if (existing) {
logger.warn(`OTA version already exists: verCode=${newVerCode}, model=${newModel}, beta=${newBeta}`);
res.json(ApiResponse.error('该版本已存在(相同版本+灰度状态)'));
logger.warn(`OTA version already exists: verCode=${newVerCode}, verName=${newVerName}, model=${newModel}, beta=${newBeta}`);
res.json(ApiResponse.error('该版本已存在(相同版本+名称+灰度状态)'));
return;
}
}