界面和细节优化

This commit is contained in:
kerwincui
2022-06-08 01:58:26 +08:00
parent 267d60fb1a
commit 40d6a49bfc
12 changed files with 500 additions and 138 deletions

View File

@@ -150,7 +150,7 @@ public class DeviceController extends BaseController
@ApiOperation("修改设备")
public AjaxResult edit(@RequestBody Device device)
{
return toAjax(deviceService.updateDevice(device));
return deviceService.updateDevice(device);
}
/**

View File

@@ -1,5 +1,6 @@
package com.ruoyi.iot.service;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.iot.domain.Device;
import com.ruoyi.iot.model.*;
import com.ruoyi.iot.model.ThingsModels.ThingsModelShadow;
@@ -129,7 +130,7 @@ public interface IDeviceService
* @param device 设备
* @return 结果
*/
public int updateDevice(Device device);
public AjaxResult updateDevice(Device device);
/**
* 更新设备状态

View File

@@ -3,8 +3,10 @@ package com.ruoyi.iot.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
@@ -447,6 +449,12 @@ public class DeviceServiceImpl implements IDeviceService {
@Override
@Transactional(rollbackFor = Exception.class)
public Device insertDevice(Device device) {
// 设备编号唯一检查
Device existDevice=deviceMapper.selectDeviceBySerialNumber(device.getSerialNumber());
if(existDevice!=null){
log.error("设备编号:"+device.getSerialNumber()+"已经存在了,新增设备失败");
return device;
}
SysUser sysUser = getLoginUser().getUser();
//添加设备
device.setCreateTime(DateUtils.getNowDate());
@@ -492,6 +500,12 @@ public class DeviceServiceImpl implements IDeviceService {
*/
@Override
public int insertDeviceAuto(String serialNumber,Long userId,Long productId) {
// 设备编号唯一检查
Device existDevice=deviceMapper.selectDeviceBySerialNumber(serialNumber);
if(existDevice!=null){
log.error("设备编号:"+serialNumber+"已经存在了,新增设备失败");
return 0;
}
Device device = new Device();
int random = (int) (Math.random() * (9000)) + 1000;
device.setDeviceName("设备" + random);
@@ -599,7 +613,16 @@ public class DeviceServiceImpl implements IDeviceService {
* @return 结果
*/
@Override
public int updateDevice(Device device) {
public AjaxResult updateDevice(Device device) {
// 设备编号唯一检查
Device oldDevice=deviceMapper.selectDeviceByDeviceId(device.getDeviceId());
if(!oldDevice.getSerialNumber().equals(device.getSerialNumber())){
Device existDevice=deviceMapper.selectDeviceBySerialNumber(device.getSerialNumber());
if(existDevice!=null){
log.error("设备编号:"+device.getSerialNumber()+" 已经存在,新增设备失败");
return AjaxResult.success("设备编号:"+device.getSerialNumber()+" 已经存在,修改失败",0);
}
}
device.setUpdateTime(DateUtils.getNowDate());
// 未激活状态,可以修改产品以及物模型值
if (device.getStatus() == 1) {
@@ -608,7 +631,8 @@ public class DeviceServiceImpl implements IDeviceService {
device.setProductId(null);
device.setProductName(null);
}
return deviceMapper.updateDevice(device);
deviceMapper.updateDevice(device);
return AjaxResult.success("修改成功",1);
}
/**
@@ -617,7 +641,9 @@ public class DeviceServiceImpl implements IDeviceService {
*/
@Override
public String generationDeviceNum() {
String number= "D"+toolService.getStringRandom(15);
// 设备编号D + userId + 15位随机字母和数字
SysUser user = getLoginUser().getUser();
String number= "D"+user.getUserId().toString()+toolService.getStringRandom(10);
int count= deviceMapper.getDeviceNumCount(number);
if(count==0) {
return number;

View File

@@ -29,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="firmwareName != null and firmwareName != ''"> and firmware_name like concat('%', #{firmwareName}, '%')</if>
<if test="productName != null and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
<if test="tenantId != null and tenantId != ''"> and tenant_id = #{tenantId}</if>
<if test="productId != null"> and product_id = #{productId}</if>
</where>
order by create_time desc
</select>

View File

@@ -139,7 +139,7 @@
</el-tabs>
<!-- 设备配置JSON -->
<el-dialog title="摘要(设备上传的只读数据)" :visible.sync="openSummary" width="600px" append-to-body>
<el-dialog title="摘要(设备上传的只读数据)" :visible.sync="openSummary" width="600px" append-to-body>
<div style="border:1px solid #ccc;margin-top:-15px;height:400px; overflow:scroll;">
<json-viewer :value="summary" :expand-depth=10 copyable>
<template v-slot:copy>
@@ -148,7 +148,7 @@
</json-viewer>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="info" @click="closeSummaryDialog"> </el-button>
</div>
</el-dialog>
@@ -200,7 +200,7 @@ export default {
data() {
return {
// 打开设备配置对话框
openSummary:false,
openSummary: false,
// 是否加载完成
isLoaded: false,
// 生成设备编码是否禁用
@@ -219,7 +219,7 @@ export default {
firmwareVersion: 1.0,
},
// 设备摘要
summary:[],
summary: [],
// 图片地址
imageUrl: require('@/assets/images/product.jpg'),
// 地址
@@ -279,7 +279,7 @@ export default {
getDevice(deviceId) {
getDevice(deviceId).then(response => {
this.form = response.data;
this.summary=JSON.parse(this.form.summary);
this.summary = JSON.parse(this.form.summary);
// 禁用状态
if (this.form.status == 2) {
this.deviceStatus = 1;
@@ -350,19 +350,25 @@ export default {
this.setDeviceStatus();
console.log(this.form);
updateDevice(this.form).then(response => {
this.$modal.alertSuccess("修改成功");
this.open = false;
this.loadMap();
if (response.data == 0) {
this.$modal.alertError(response.msg);
} else {
this.$modal.alertSuccess("修改成功");
this.loadMap();
}
});
} else {
addDevice(this.form).then(response => {
this.$modal.alertSuccess("新增成功, 可以烧录sdk到设备了");
this.open = false;
this.form = response.data;
if (this.form.status == 2) {
this.deviceStatus = 1;
if (this.form.deviceId == null || this.form.deviceId == 0) {
this.$modal.alertError("设备编号已经存在,添加设备失败");
} else {
if (this.form.status == 2) {
this.deviceStatus = 1;
}
this.$modal.alertSuccess("新增成功, 可以烧录sdk到设备了");
this.loadMap();
}
this.loadMap();
});
}
}

View File

@@ -230,6 +230,8 @@ export default {
open: false,
// 激活时间范围
daterangeActiveTime: [],
// 根路径
baseUrl: process.env.VUE_APP_BASE_API,
// 查询参数
queryParams: {
pageNum: 1,

View File

@@ -67,8 +67,9 @@
<!-- 添加或修改设备告警对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<div class="el-divider el-divider--horizontal" style="margin-top: -25px;"></div>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row style="border-bottom:1px solid #ddd;margin-bottom:20px;" :gutter="50">
<el-row :gutter="50">
<el-col :span="12">
<el-form-item label="告警名称" prop="alertName">
<el-input v-model="form.alertName" placeholder="请输入告警名称" />
@@ -89,124 +90,118 @@
</el-col>
</el-row>
<el-row style="border-bottom:1px solid #ddd;margin-bottom:20px;">
<el-col :span="24">
<el-form-item label="触发器" prop="griggers">
<el-select v-model="form.condition" placeholder="请选择" size="small" style="margin-bottom:10px;">
<el-option v-for="item in triggerConditions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<div v-for="(item,index) in form.triggers" :key="index" style="margin-bottom:15px;border:1px solid #ddd;padding:10px;">
<el-row>
<el-col :span="4">
<el-select v-model="item.source" placeholder="请选择" size="small" @change="changeTriggerSource">
<el-option v-for="subItem in triggerSource" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="16" :offset="1" v-if="item.source==2">
<el-time-picker v-model="timerTimeValue" size="small" value-format="HH:mm" placeholder="选择执行时间" @change="timeChange" :disabled="item.isAdvance==1"></el-time-picker>
</el-col>
<el-col :span="2" :offset="item.source==1?17:1" v-if="index!=0"><a style="color:#F56C6C" @click="removeTriggerItem(index)">删除</a></el-col>
</el-row>
<el-divider></el-divider>
<el-form-item label="触发器" prop="griggers">
<el-select v-model="form.condition" placeholder="请选择" size="small" style="margin-bottom:10px;">
<el-option v-for="item in triggerConditions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<div v-for="(item,index) in form.triggers" :key="index" style="margin-bottom:15px;border:1px solid #ddd;padding:10px;">
<el-row>
<el-col :span="4">
<el-select v-model="item.source" placeholder="请选择" size="small" @change="changeTriggerSource">
<el-option v-for="subItem in triggerSource" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="16" :offset="1" v-if="item.source==2">
<el-time-picker v-model="timerTimeValue" size="small" value-format="HH:mm" placeholder="选择执行时间" @change="timeChange" :disabled="item.isAdvance==1"></el-time-picker>
</el-col>
<el-col :span="2" :offset="item.source==1?17:1" v-if="index!=0"><a style="color:#F56C6C" @click="removeTriggerItem(index)">删除</a></el-col>
</el-row>
<!--定时-->
<el-row v-if="item.source==2">
<el-col :span="24">
<el-row style="margin-bottom:5px;">
<el-col :span="4">
<el-select v-model="timerWeekRepeatValue" placeholder="请选择" @change="repeatChange" size="small" :disabled="item.isAdvance==1">
<el-option v-for="item in timerWeekRepeats" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
<el-col :span="15" :offset="1" v-if="timerWeekRepeatValue==3">
<el-select v-model="timerWeekValue" placeholder="请选择" multiple style="width:485px" @change="weekChange" size="small" :disabled="item.isAdvance==1">
<el-option v-for="item in timerWeeks" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
<el-col :span="24">
<el-row>
<el-col :span="18">
<el-input v-model="item.cronExpression" placeholder="cron执行表达式" :disabled="item.isAdvance==0" size="small">
<template slot="append">
<el-button type="primary" @click="handleShowCron(item,index)" :disabled="item.isAdvance==0">
生成表达式
<i class="el-icon-time el-icon--right"></i>
</el-button>
</template>
</el-input>
</el-col>
<el-col :span="4" :offset="1">
<el-checkbox v-model="item.isAdvance" :true-label="1" :false-label="0" @change="customerCronChange">自定义表达式</el-checkbox>
</el-col>
</el-row>
</el-col>
</el-row>
<!--设备-->
<el-row>
<!--定时-->
<el-row v-if="item.source==2">
<el-col :span="24">
<el-row style="margin-bottom:5px;">
<el-col :span="4">
<el-select v-model="item.modelType" placeholder="请选择" size="small">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
<el-select v-model="timerWeekRepeatValue" placeholder="请选择" @change="repeatChange" size="small" :disabled="item.isAdvance==1">
<el-option v-for="item in timerWeekRepeats" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
<el-col :span="15" :offset="1" v-if="timerWeekRepeatValue==3">
<el-select v-model="timerWeekValue" placeholder="请选择" multiple style="width:485px" @change="weekChange" size="small" :disabled="item.isAdvance==1">
<el-option v-for="item in timerWeeks" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
<el-col :span="24">
<el-row>
<el-col :span="18">
<el-input v-model="item.cronExpression" placeholder="cron执行表达式" :disabled="item.isAdvance==0" size="small">
<template slot="append">
<el-button type="primary" @click="handleShowCron(item,index)" :disabled="item.isAdvance==0">
生成表达式
<i class="el-icon-time el-icon--right"></i>
</el-button>
</template>
</el-input>
</el-col>
<el-col :span="4" :offset="1">
<el-select v-model="item.modelType" placeholder="请选择" size="small">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="5" :offset="1">
<el-select v-model="item.operator" placeholder="请选择操作符" size="small">
<el-option key="=" label="等于(=)" value="=" />
<el-option key="!=" label="不等于(!=)" value="!=" />
<el-option key=">" label="大于(>)" value=">" />
<el-option key="<" label="小于(<)" value="<" />
<el-option key=">=" label="大于等于(>=)" value=">=" />
<el-option key="<=" label="小于等于(<=)" value="<=" />
<el-option key="contain" label="包含(contain)" value="contain" />
<el-option key="notcontain" label="不包含(not contain)" value="notcontain" />
</el-select>
</el-col>
<el-col :span="5" :offset="1">
<el-input v-model="item.value" placeholder="值" size="small" />
<el-checkbox v-model="item.isAdvance" :true-label="1" :false-label="0" @change="customerCronChange">自定义表达式</el-checkbox>
</el-col>
</el-row>
</div>
<div>+ <a style="color:#409EFF" @click="addTriggerItem()">添加触发器</a></div>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<!--设备-->
<el-row>
<el-col :span="4">
<el-select v-model="item.modelType" placeholder="请选择" size="small">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="4" :offset="1">
<el-select v-model="item.modelType" placeholder="请选择" size="small">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="5" :offset="1">
<el-select v-model="item.operator" placeholder="请选择操作符" size="small">
<el-option key="=" label="等于(=)" value="=" />
<el-option key="!=" label="不等于(!=)" value="!=" />
<el-option key=">" label="大于(>)" value=">" />
<el-option key="<" label="小于(<)" value="<" />
<el-option key=">=" label="大于等于(>=)" value=">=" />
<el-option key="<=" label="小于等于(<=)" value="<=" />
<el-option key="contain" label="包含(contain)" value="contain" />
<el-option key="notcontain" label="不包含(not contain)" value="notcontain" />
</el-select>
</el-col>
<el-col :span="5" :offset="1">
<el-input v-model="item.value" placeholder="值" size="small" />
</el-col>
</el-row>
</div>
<div>+ <a style="color:#409EFF" @click="addTriggerItem()">添加触发器</a></div>
</el-form-item>
<el-row>
<el-col :span="24">
<el-form-item label="执行动作">
<el-row v-for="(item,index) in form.actions" :key="index" style="margin-bottom:10px;">
<el-col :span="4">
<el-select v-model="item.modelType" placeholder="请选择">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="4" :offset="1">
<el-select v-model="item.modelType" placeholder="请选择">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="11" :offset="1">
<el-input v-model="item.value" placeholder="值" />
</el-col>
<el-col :span="2" :offset="1" v-if="index!=0"><a style="color:#F56C6C" @click="removeActionItem(index)">删除</a></el-col>
</el-row>
<div>+ <a style="color:#409EFF" @click="addActionItem()">添加执行动作</a></div>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
<el-form-item label="执行动作">
<el-row v-for="(item,index) in form.actions" :key="index" style="margin-bottom:10px;">
<el-col :span="4">
<el-select v-model="item.modelType" placeholder="请选择">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="4" :offset="1">
<el-select v-model="item.modelType" placeholder="请选择">
<el-option v-for="subItem in modelTypes" :key="subItem.value" :label="subItem.label" :value="subItem.value">
</el-option>
</el-select>
</el-col>
<el-col :span="11" :offset="1">
<el-input v-model="item.value" placeholder="值" />
</el-col>
<el-col :span="2" :offset="1" v-if="index!=0"><a style="color:#F56C6C" @click="removeActionItem(index)">删除</a></el-col>
</el-row>
<div>+ <a style="color:#409EFF" @click="addActionItem()">添加执行动作</a></div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@@ -380,6 +375,8 @@ export default {
triggers: [],
actions: []
},
// 产品
productInfo: {},
// 表单校验
rules: {
alertName: [{

View File

@@ -70,6 +70,8 @@ export default {
type: 4,
},
form: {},
// 产品
productInfo:{},
};
},
watch: {
@@ -116,7 +118,7 @@ export default {
top: 45px;
left: 12px;
border: 1px solid #888;
background-color:rgb(245, 245, 255);
background: linear-gradient(303deg, #b2e9fc 50%, #b5c4f8 50%);
}
</style>
</style>

View File

@@ -1,6 +1,6 @@
<template>
<div style="padding-left:20px;">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="设备编号" prop="serialNumber">
<el-input v-model="queryParams.serialNumber" placeholder="请输入设备编号" clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
@@ -168,6 +168,8 @@ export default {
},
// 表单参数
form: {},
// 产品
productInfo:{},
// 表单校验
rules: {

View File

@@ -59,6 +59,7 @@
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
<el-form-item label="产品图片">
<imageUpload ref="image-upload" :value="form.imgUrl" :limit="form.status==2 ? 0 : 1" :fileSize="1" @input="getImagePath($event)"></imageUpload>
<div class="el-upload__tip" style="color:#f56c6c">提示上传后需要提交保存</div>
</el-form-item>
</el-col>
</el-row>
@@ -75,9 +76,9 @@
<span slot="label"><span style="color:red;">* </span>产品模型</span>
<product-things-model ref="productThingsModel" :product="form" />
</el-tab-pane>
<el-tab-pane label="" name="firmware" :disabled="form.productId==0">
<el-tab-pane label="" name="productFirmware" :disabled="form.productId==0">
<span slot="label">固件管理</span>
<product-things-model ref="productThingsModel" :product="form" />
<product-firmware ref="productFirmware" :product="form" />
</el-tab-pane>
<el-tab-pane label="" name="productAuthorize" :disabled="form.productId==0 || form.isAuthorize==0">
@@ -91,7 +92,7 @@
</el-tab-pane>
<el-tab-pane label="" name="productApp">
<span slot="label">产品界面</span>
<span slot="label">控制界面</span>
<product-app ref="productApp" :product="form" />
</el-tab-pane>
@@ -120,6 +121,7 @@
<script>
import productThingsModel from "./product-things-model";
import productFirmware from "./product-firmware";
import productApp from "./product-app"
import productAlert from "./product-alert"
import productAuthorize from "./product-authorize"
@@ -142,6 +144,7 @@ export default {
productApp,
productAlert,
productAuthorize,
productFirmware,
imageUpload,
},
data() {

View File

@@ -0,0 +1,322 @@
<template>
<div style="padding-left:20px;">
<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" style="margin-bottom:-20px;" v-show="showSearch">
<el-form-item label="固件名称" prop="firmwareName">
<el-input v-model="queryParams.firmwareName" placeholder="请输入固件名称" clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
<el-form-item style="float:right;">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['iot:firmware:add']">新增</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="firmwareList" @selection-change="handleSelectionChange">
<el-table-column label="固件名称" align="center" prop="firmwareName" />
<el-table-column label="固件版本" align="center" prop="version">
<template slot-scope="scope">
<span>Version </span> {{scope.row.version}}
</template>
</el-table-column>
<el-table-column label="下载地址" align="center" prop="filePath" width="400">
<template slot-scope="scope">
<el-link :href="getDownloadUrl(scope.row.filePath)" :underline="false" type="primary">{{getDownloadUrl(scope.row.filePath)}}</el-link>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
<template slot-scope="scope">
<el-button size="small" type="primary" style="padding:5px;" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['iot:firmware:edit']">修改</el-button>
<el-button size="small" type="danger" style="padding:5px;" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['iot:firmware:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改产品固件对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="固件名称" prop="firmwareName">
<el-input v-model="form.firmwareName" placeholder="请输入固件名称" />
</el-form-item>
<el-form-item label="固件版本" prop="version">
<el-input v-model="form.version" placeholder="请输入固件版本" type="number" step="0.1" />
</el-form-item>
<el-form-item label="固件上传" prop="filePath">
<fileUpload ref="file-upload" :value="form.filePath" :limit="1" :fileSize="10" :fileType='["bin", "zip", "pdf"]' @input="getFilePath($event)"></fileUpload>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import fileUpload from '../../../components/FileUpload/index'
import {
listFirmware,
getFirmware,
delFirmware,
addFirmware,
updateFirmware
} from "@/api/iot/firmware";
import {
getToken
} from "@/utils/auth";
export default {
name: "product-firmware",
dicts: ["iot_yes_no"],
components: {
fileUpload
},
props: {
product: {
type: Object,
default: null
}
},
watch: {
// 获取到父组件传递的productId后刷新列表
product: function (newVal, oldVal) {
this.productInfo = newVal;
if (this.productInfo && this.productInfo.productId != 0) {
this.queryParams.productId = this.productInfo.productId;
this.form.productId=this.productInfo.productId;
this.form.productName=this.productInfo.productName;
console.log(this.form)
this.getList();
}
}
},
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 产品固件表格数据
firmwareList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
firmwareName: null,
productName: null,
productId: 0,
isSys: null,
},
// 产品
productInfo: {},
// 表单参数
form: {
version: 1.0
},
// 表单校验
rules: {
firmwareName: [{
required: true,
message: "固件名称不能为空",
trigger: "blur"
}],
version: [{
required: true,
message: "固件版本不能为空",
trigger: "blur"
}],
filePath: [{
required: true,
message: "文件路径不能为空",
trigger: "blur"
}],
},
// 上传参数
upload: {
// 是否禁用上传
isUploading: false,
// 设置上传的请求头部
headers: {
Authorization: "Bearer " + getToken()
},
// 上传的地址
url: process.env.VUE_APP_BASE_API + "/iot/tool/upload",
// 上传的文件列表
fileList: []
},
};
},
created() {
},
methods: {
getDownloadUrl(path) {
return window.location.origin + process.env.VUE_APP_BASE_API + path;
},
/** 查询产品固件列表 */
getList() {
this.loading = true;
listFirmware(this.queryParams).then(response => {
this.firmwareList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
firmwareId: null,
firmwareName: null,
tenantId: null,
tenantName: null,
productId:this.form.productId,
productName:this.form.productName,
isSys: null,
version: 1.0,
filePath: null,
delFlag: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.firmwareId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加产品固件";
this.upload.fileList = [];
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const firmwareId = row.firmwareId || this.ids
getFirmware(firmwareId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改产品固件";
this.upload.fileList = [{
name: this.form.firmwareName,
url: this.form.filePath
}];
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.firmwareId != null) {
updateFirmware(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addFirmware(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const firmwareIds = row.firmwareId || this.ids;
this.$modal.confirm('是否确认删除产品固件编号为"' + firmwareIds + '"的数据项?').then(function () {
return delFirmware(firmwareIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('iot/firmware/export', {
...this.queryParams
}, `firmware_${new Date().getTime()}.xlsx`)
},
// 获取文件路径
getFilePath(data) {
console.log(data);
this.form.filePath = data;
},
// 文件提交处理
submitUpload() {
this.$refs.upload.submit();
},
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
this.upload.isUploading = false;
this.form.filePath = response.url;
this.$modal.msgSuccess(response.msg);
},
// 文件下载处理
handleDownload(row) {
window.open(process.env.VUE_APP_BASE_API + row.filePath);
}
},
};
</script>

View File

@@ -1,5 +1,5 @@
<template>
<div style="margin-top:-35px;">
<div style="margin-top:-50px;">
<el-divider></el-divider>
<el-form :model="queryParams" ref="product-select-template" :inline="true" label-width="48px">
<el-form-item label="名称" prop="templateName">
@@ -16,7 +16,7 @@
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="templateList" @selection-change="handleSelectionChange" ref="selectTemplateTable" border>
<el-table v-loading="loading" :data="templateList" @selection-change="handleSelectionChange" ref="selectTemplateTable" size="small">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="名称" align="center" prop="templateName" />
<el-table-column label="标识符" align="center" prop="identifier" />
@@ -27,12 +27,12 @@
</el-table-column>
<el-table-column label="首页显示" align="center" prop="isTop">
<template slot-scope="scope">
<el-switch v-model="scope.row.isTop" :active-value="1" :inactive-value="0" active-color="#81c0fb" disabled></el-switch>
<dict-tag :options="dict.type.iot_yes_no" :value="scope.row.isTop" />
</template>
</el-table-column>
<el-table-column label="监测值" align="center" prop="isMonitor">
<template slot-scope="scope">
<el-switch v-model="scope.row.isMonitor" :active-value="1" :inactive-value="0" active-color="#81c0fb" disabled></el-switch>
<dict-tag :options="dict.type.iot_yes_no" :value="scope.row.isMonitor" />
</template>
</el-table-column>
<el-table-column label="数据类型" align="center" prop="datatype">