mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-27 09:33:55 +08:00
update:设置同类型OTA固件,只保留一个
This commit is contained in:
+26
-16
@@ -124,22 +124,7 @@ public class DeviceServiceImpl extends BaseServiceImpl<DeviceDao, DeviceEntity>
|
|||||||
response.setServer_time(buildServerTime());
|
response.setServer_time(buildServerTime());
|
||||||
|
|
||||||
String type = deviceReport.getBoard() == null ? null : deviceReport.getBoard().getType();
|
String type = deviceReport.getBoard() == null ? null : deviceReport.getBoard().getType();
|
||||||
OtaEntity ota = otaService.getLatestOta(type);
|
DeviceReportRespDTO.Firmware firmware = buildFirmwareInfo(type, macAddress);
|
||||||
String downloadUrl = null;
|
|
||||||
if (ota != null) {
|
|
||||||
// 获取当前请求的URL
|
|
||||||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
|
|
||||||
.getRequest();
|
|
||||||
String requestUrl = request.getRequestURL().toString();
|
|
||||||
// 将URL中的/ota/替换为/otaMag/download/
|
|
||||||
String uuid = UUID.randomUUID().toString();
|
|
||||||
redisUtils.set(RedisKeys.getOtaIdKey(uuid), ota.getId());
|
|
||||||
downloadUrl = requestUrl.replace("/ota/", "/otaMag/download/") + uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceReportRespDTO.Firmware firmware = new DeviceReportRespDTO.Firmware();
|
|
||||||
firmware.setVersion(ota == null ? null : ota.getVersion());
|
|
||||||
firmware.setUrl(downloadUrl);
|
|
||||||
response.setFirmware(firmware);
|
response.setFirmware(firmware);
|
||||||
|
|
||||||
// 添加WebSocket配置
|
// 添加WebSocket配置
|
||||||
@@ -315,4 +300,29 @@ public class DeviceServiceImpl extends BaseServiceImpl<DeviceDao, DeviceEntity>
|
|||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DeviceReportRespDTO.Firmware buildFirmwareInfo(String type, String macAddress) {
|
||||||
|
if (StringUtils.isBlank(type)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
OtaEntity ota = otaService.getLatestOta(type);
|
||||||
|
DeviceReportRespDTO.Firmware firmware = new DeviceReportRespDTO.Firmware();
|
||||||
|
String downloadUrl = null;
|
||||||
|
|
||||||
|
if (ota != null) {
|
||||||
|
// 获取当前请求的URL
|
||||||
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
|
||||||
|
.getRequest();
|
||||||
|
String requestUrl = request.getRequestURL().toString();
|
||||||
|
// 将URL中的/ota/替换为/otaMag/download/
|
||||||
|
String uuid = UUID.randomUUID().toString();
|
||||||
|
redisUtils.set(RedisKeys.getOtaIdKey(uuid), ota.getId());
|
||||||
|
downloadUrl = requestUrl.replace("/ota/", "/otaMag/download/") + uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
firmware.setVersion(ota == null ? null : ota.getVersion());
|
||||||
|
firmware.setUrl(downloadUrl);
|
||||||
|
return firmware;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+13
-11
@@ -1,6 +1,8 @@
|
|||||||
package xiaozhi.modules.device.service.impl;
|
package xiaozhi.modules.device.service.impl;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -38,17 +40,17 @@ public class OtaServiceImpl extends BaseServiceImpl<OtaDao, OtaEntity> implement
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(OtaEntity entity) {
|
public void update(OtaEntity entity) {
|
||||||
// 检查是否存在相同名称、类型和版本的固件(排除当前记录)
|
// 检查是否存在相同类型和版本的固件(排除当前记录)
|
||||||
QueryWrapper<OtaEntity> queryWrapper = new QueryWrapper<OtaEntity>()
|
QueryWrapper<OtaEntity> queryWrapper = new QueryWrapper<OtaEntity>()
|
||||||
.eq("firmware_name", entity.getFirmwareName())
|
|
||||||
.eq("type", entity.getType())
|
.eq("type", entity.getType())
|
||||||
.eq("version", entity.getVersion())
|
.eq("version", entity.getVersion())
|
||||||
.ne("id", entity.getId()); // 排除当前记录
|
.ne("id", entity.getId()); // 排除当前记录
|
||||||
|
|
||||||
if (baseDao.selectCount(queryWrapper) > 0) {
|
if (baseDao.selectCount(queryWrapper) > 0) {
|
||||||
throw new RuntimeException("已存在相同名称、类型和版本的固件,请修改后重试");
|
throw new RuntimeException("已存在相同类型和版本的固件,请修改后重试");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entity.setUpdateDate(new Date());
|
||||||
baseDao.updateById(entity);
|
baseDao.updateById(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,16 +61,16 @@ public class OtaServiceImpl extends BaseServiceImpl<OtaDao, OtaEntity> implement
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean save(OtaEntity entity) {
|
public boolean save(OtaEntity entity) {
|
||||||
// 检查是否存在相同名称、类型和版本的固件
|
|
||||||
QueryWrapper<OtaEntity> queryWrapper = new QueryWrapper<OtaEntity>()
|
QueryWrapper<OtaEntity> queryWrapper = new QueryWrapper<OtaEntity>()
|
||||||
.eq("firmware_name", entity.getFirmwareName())
|
.eq("type", entity.getType());
|
||||||
.eq("type", entity.getType())
|
// 同类固件只保留最新的一条
|
||||||
.eq("version", entity.getVersion());
|
List<OtaEntity> otaList = baseDao.selectList(queryWrapper);
|
||||||
|
if (otaList != null && otaList.size() > 0) {
|
||||||
if (baseDao.selectCount(queryWrapper) > 0) {
|
OtaEntity otaBefore = otaList.getFirst();
|
||||||
throw new RuntimeException("已存在相同名称、类型和版本的固件,请勿重复添加");
|
entity.setId(otaBefore.getId());
|
||||||
|
baseDao.updateById(entity);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return baseDao.insert(entity) > 0;
|
return baseDao.insert(entity) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<el-input v-model="form.firmwareName" placeholder="请输入固件名称(板子+版本号)"></el-input>
|
<el-input v-model="form.firmwareName" placeholder="请输入固件名称(板子+版本号)"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="固件类型" prop="type">
|
<el-form-item label="固件类型" prop="type">
|
||||||
<el-select v-model="form.type" placeholder="请选择固件类型" style="width: 100%;" filterable>
|
<el-select v-model="form.type" placeholder="请选择固件类型" style="width: 100%;" filterable :disabled="isTypeDisabled">
|
||||||
<el-option v-for="item in firmwareTypes" :key="item.key" :label="item.name" :value="item.key"></el-option>
|
<el-option v-for="item in firmwareTypes" :key="item.key" :label="item.name" :value="item.key"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -21,6 +21,9 @@
|
|||||||
</el-upload>
|
</el-upload>
|
||||||
<el-progress v-if="isUploading || uploadStatus === 'success'" :percentage="uploadProgress"
|
<el-progress v-if="isUploading || uploadStatus === 'success'" :percentage="uploadProgress"
|
||||||
:status="uploadStatus"></el-progress>
|
:status="uploadStatus"></el-progress>
|
||||||
|
<div class="hint-text">
|
||||||
|
<span>温馨提示:请上传xiaozhi.bin文件,而不是merged-binary.bin文件</span>
|
||||||
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" v-model="form.remark" placeholder="请输入备注信息"></el-input>
|
<el-input type="textarea" v-model="form.remark" placeholder="请输入备注信息"></el-input>
|
||||||
@@ -76,6 +79,12 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
isTypeDisabled() {
|
||||||
|
// 如果有id,说明是编辑模式,禁用类型选择
|
||||||
|
return !!this.form.id
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleClose() {
|
handleClose() {
|
||||||
this.$refs.form.clearValidate();
|
this.$refs.form.clearValidate();
|
||||||
@@ -195,4 +204,12 @@ export default {
|
|||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hint-text {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
color: #979db1;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -15,15 +15,10 @@
|
|||||||
<div class="content-panel">
|
<div class="content-panel">
|
||||||
<div class="content-area">
|
<div class="content-area">
|
||||||
<el-card class="params-card" shadow="never">
|
<el-card class="params-card" shadow="never">
|
||||||
<el-table
|
<el-table ref="paramsTable" :data="paramsList" class="transparent-table" v-loading="loading"
|
||||||
ref="paramsTable"
|
element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading"
|
||||||
:data="paramsList"
|
element-loading-background="rgba(255, 255, 255, 0.7)"
|
||||||
class="transparent-table"
|
:header-cell-class-name="headerCellClassName">
|
||||||
v-loading="loading"
|
|
||||||
element-loading-text="拼命加载中"
|
|
||||||
element-loading-spinner="el-icon-loading"
|
|
||||||
element-loading-background="rgba(255, 255, 255, 0.7)"
|
|
||||||
:header-cell-class-name="headerCellClassName">
|
|
||||||
<el-table-column label="选择" align="center" width="120">
|
<el-table-column label="选择" align="center" width="120">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-checkbox v-model="scope.row.selected"></el-checkbox>
|
<el-checkbox v-model="scope.row.selected"></el-checkbox>
|
||||||
@@ -48,6 +43,11 @@
|
|||||||
{{ formatDate(scope.row.createDate) }}
|
{{ formatDate(scope.row.createDate) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" prop="updateDate" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ formatDate(scope.row.updateDate) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column label="操作" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button size="mini" type="text"
|
<el-button size="mini" type="text"
|
||||||
|
|||||||
Reference in New Issue
Block a user