提交测试环境

This commit is contained in:
墨大叔 2024-07-15 15:27:19 +08:00
parent 3f0b6cb5f1
commit 29c719dfd4
8 changed files with 127 additions and 16 deletions

View File

@ -92,3 +92,23 @@ export function resetDevice(deviceId) {
method: 'put' method: 'put'
}) })
} }
// 批量修改型号
export function batchUpdateModel(deviceIds, modelId) {
return request({
url: `/system/device/batchUpdateModel`,
method: 'put',
data: {
deviceIds,
modelId
}
})
}
// 设备开关
export function switchDevice(deviceId, open) {
return request({
url: `/system/device/${deviceId}/switch?open=${open}`,
method: 'put'
})
}

View File

@ -2,7 +2,7 @@
<template> <template>
<el-dialog :title="title" :visible="show" width="60%" top="2vh" @open="open" @close="close" <el-dialog :title="title" :visible="show" width="60%" top="2vh" @open="open" @close="close"
:append-to-body="true"> :append-to-body="true">
<el-form size="small" :inline="true" label-width="6em"> <el-form size="small" :inline="true" label-width="6em" @submit.native.prevent = "onSearch">
<el-form-item label="型号名称:"> <el-form-item label="型号名称:">
<el-input v-model="searchForm.modelName" clearable></el-input> <el-input v-model="searchForm.modelName" clearable></el-input>
</el-form-item> </el-form-item>

View File

@ -8,12 +8,13 @@
:placeholder="placeholder"></el-input> :placeholder="placeholder"></el-input>
<span v-else>{{showValue}}</span> <span v-else>{{showValue}}</span>
<model-dialog :show.sync="dialogShow" <model-dialog
:search="search" :show.sync="dialogShow"
:multiple="multiple" :search="search"
:init-select="realValue" :multiple="multiple"
@select="onSubmit" :init-select="realValue"
:title="title"></model-dialog> @select="onSubmit"
:title="title"/>
</div> </div>
</template> </template>

View File

@ -134,12 +134,15 @@
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body :close-on-click-modal="false"> <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row :gutter="8"> <el-row :gutter="8">
<form-col label="所属用户" prop="userId" :span="span * 2">
<user-input v-model="form.userId" :query="userQuery"/>
</form-col>
<form-col label="店铺图片" prop="picture" :span="span * 2"> <form-col label="店铺图片" prop="picture" :span="span * 2">
<image-upload v-model="form.picture" :limit="9"/> <image-upload v-model="form.picture" :limit="9"/>
</form-col> </form-col>
<form-col label="所属用户" prop="userId" :span="span">
<user-input v-model="form.userId" :query="userQuery"/>
</form-col>
<form-col label="是否显示" prop="show" :span="span">
<el-switch v-model="form.show"/>
</form-col>
<form-col label="店铺名称" prop="name" :span="span * 2"> <form-col label="店铺名称" prop="name" :span="span * 2">
<el-input v-model="form.name" placeholder="请输入店铺名称" /> <el-input v-model="form.name" placeholder="请输入店铺名称" />
</form-col> </form-col>
@ -342,7 +345,8 @@ export default {
createBy: null, createBy: null,
updateTime: null, updateTime: null,
updateBy: null, updateBy: null,
deleted: null deleted: null,
show: true
}; };
this.resetForm("form"); this.resetForm("form");
}, },

View File

@ -92,6 +92,7 @@
</el-table-column> </el-table-column>
<el-table-column label="详细说明" align="center" prop="description" show-overflow-tooltip/> <el-table-column label="详细说明" align="center" prop="description" show-overflow-tooltip/>
<el-table-column label="创建时间" align="center" prop="createTime" /> <el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="sourceId" align="center" prop="sourceId" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button

View File

@ -3,6 +3,8 @@
<el-card class="box-card"> <el-card class="box-card">
<el-descriptions title="设备详情"> <el-descriptions title="设备详情">
<template slot="extra"> <template slot="extra">
<el-button icon="el-icon-switch-button" @click="handleSwitch(true)">强制开启</el-button>
<el-button icon="el-icon-switch-button" @click="handleSwitch(false)">强制关闭</el-button>
<el-button icon="el-icon-refresh" @click="handleReset">时长归零</el-button> <el-button icon="el-icon-refresh" @click="handleReset">时长归零</el-button>
<el-button icon="el-icon-plus" @click="handleAddElectricity">增加时长</el-button> <el-button icon="el-icon-plus" @click="handleAddElectricity">增加时长</el-button>
<el-button icon="el-icon-refresh" @click="refreshIot" style="margin-right: 1em">刷新设备信息</el-button> <el-button icon="el-icon-refresh" @click="refreshIot" style="margin-right: 1em">刷新设备信息</el-button>
@ -40,7 +42,7 @@
{{deviceData.remainTime / 60 | money | defaultValue}} 分钟 {{deviceData.remainTime / 60 | money | defaultValue}} 分钟
<span class="remark-text">最近更新时间{{deviceData.lastPullTime}}</span> <span class="remark-text">最近更新时间{{deviceData.lastPullTime}}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="实时功率">{{deviceData.realTimePower | defaultValue}} KWH</el-descriptions-item> <!-- <el-descriptions-item label="实时功率">{{deviceData.realTimePower | defaultValue}} KWH</el-descriptions-item>-->
<el-descriptions-item label="备注">{{deviceData.remark | defaultValue}}</el-descriptions-item> <el-descriptions-item label="备注">{{deviceData.remark | defaultValue}}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-card> </el-card>
@ -89,7 +91,7 @@
<script> <script>
import { addTime, getDevice, refreshIot, resetDevice } from '@/api/system/device' import { addTime, getDevice, refreshIot, resetDevice, switchDevice } from '@/api/system/device'
import LineChart from "@/views/dashboard/LineChart.vue"; import LineChart from "@/views/dashboard/LineChart.vue";
import RechargeRecord from "@/views/system/device/components/rechargeRecord.vue"; import RechargeRecord from "@/views/system/device/components/rechargeRecord.vue";
import {formatDate} from "@/utils"; import {formatDate} from "@/utils";
@ -143,6 +145,22 @@ export default {
clearInterval(this.timer); clearInterval(this.timer);
}, },
methods: { methods: {
handleSwitch(open) {
this.$confirm(`是否确认强制${open ? '开启' : '关闭'}设备?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.loading = true;
switchDevice(this.deviceData.deviceId, open).then(res => {
if (res.code === 200) {
this.$message.success("操作成功");
}
}).finally(() => {
this.loading = false;
})
})
},
// //
computeSurplusTime() { computeSurplusTime() {
console.log('compute', this.deviceData.expireTime , this.surplusTime ); console.log('compute', this.deviceData.expireTime , this.surplusTime );

View File

@ -118,6 +118,17 @@
v-hasPermi="['system:device:export']" v-hasPermi="['system:device:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-edit"
size="mini"
@click="handleBatchModel"
:disabled="multiple"
v-hasPermi="['system:device:edit']"
>批量修改型号</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
@ -251,11 +262,26 @@
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<!--型号选择弹窗-->
<model-dialog
:show.sync="showCheckModel"
@select="onSubmitBatchModel"
/>
</div> </div>
</template> </template>
<script> <script>
import { listDevice, getDevice, addDevice, updateDevice, logicDelDevice, updateDeviceSn } from '@/api/system/device' import {
listDevice,
getDevice,
addDevice,
updateDevice,
logicDelDevice,
updateDeviceSn,
batchUpdateModel
} from '@/api/system/device'
import ModelSelect from "@/components/Business/Model/modelSelect.vue"; import ModelSelect from "@/components/Business/Model/modelSelect.vue";
import SmUserSelect from "@/components/Business/SmUser/smUserSelect.vue"; import SmUserSelect from "@/components/Business/SmUser/smUserSelect.vue";
import QrCode from "@/components/QrCode/index.vue"; import QrCode from "@/components/QrCode/index.vue";
@ -264,13 +290,16 @@ import SnInput from '@/components/SnInput/index.vue'
import StoreInput from '@/components/Business/Store/StoreInput.vue' import StoreInput from '@/components/Business/Store/StoreInput.vue'
import UserInput from '@/components/Business/SmUser/UserInput.vue' import UserInput from '@/components/Business/SmUser/UserInput.vue'
import { isEmpty } from '@/utils' import { isEmpty } from '@/utils'
import ModelDialog from '@/components/Business/Model/modelDialog.vue'
export default { export default {
name: "Device", name: "Device",
components: { UserInput, StoreInput, SnInput, QrCode, SmUserSelect, ModelSelect}, components: { ModelDialog, UserInput, StoreInput, SnInput, QrCode, SmUserSelect, ModelSelect},
dicts: ['sm_device_online_status', 'sm_device_status', 'sm_device_outage_way','sm_device_notice_way'], dicts: ['sm_device_online_status', 'sm_device_status', 'sm_device_outage_way','sm_device_notice_way'],
data() { data() {
return { return {
//
showCheckModel: false,
span: 24, span: 24,
gutter: 8, gutter: 8,
// //
@ -341,6 +370,19 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
//
onSubmitBatchModel(model) {
if (model == null) {
return;
}
batchUpdateModel(this.ids, model.modelId).then(res => {
if (res.code === 200) {
this.$message.success("操作成功");
this.showCheckModel = false;
this.getList();
}
})
},
isEmpty, isEmpty,
handleBindSn(row) { handleBindSn(row) {
this.form.deviceId = row.deviceId; this.form.deviceId = row.deviceId;
@ -471,6 +513,9 @@ export default {
} }
}); });
}, },
handleBatchModel() {
this.showCheckModel = true;
},
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const deviceIds = row.deviceId || this.ids; const deviceIds = row.deviceId || this.ids;

View File

@ -138,6 +138,9 @@
<template v-else-if="column.key === 'deviceCount'"> <template v-else-if="column.key === 'deviceCount'">
{{d.row.deviceCount | defaultValue}} {{d.row.deviceCount | defaultValue}}
</template> </template>
<template v-else-if="column.key === 'deviceAdmin'">
<el-tag :type="d.row.deviceAdmin ? 'danger' : 'info'">{{d.row.deviceAdmin ? '是' : '否'}}</el-tag>
</template>
<template v-else> <template v-else>
{{d.row[column.key]}} {{d.row[column.key]}}
</template> </template>
@ -201,6 +204,9 @@
<el-input v-model="form.phonenumber" placeholder="请输入手机号" :maxlength="11" show-word-limit <el-input v-model="form.phonenumber" placeholder="请输入手机号" :maxlength="11" show-word-limit
clearable prefix-icon='el-icon-mobile' :style="{width: '100%'}"></el-input> clearable prefix-icon='el-icon-mobile' :style="{width: '100%'}"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="是否设备管理员" prop="deviceAdmin" label-width="9em">
<el-switch v-model="form.deviceAdmin" active-text="" inactive-text="" @change="onChangeDeviceAdmin"/>
</el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" :maxlength="500" show-word-limit type="textarea"/> <el-input v-model="form.remark" placeholder="请输入备注" :maxlength="500" show-word-limit type="textarea"/>
</el-form-item> </el-form-item>
@ -248,6 +254,7 @@ export default {
{key: 'serviceRate', visible: true, label: '服务费费率', align: 'center', minWidth: null, sortable: true}, {key: 'serviceRate', visible: true, label: '服务费费率', align: 'center', minWidth: null, sortable: true},
{key: 'status', visible: true, label: '账号状态', align: 'center', minWidth: null, sortable: true}, {key: 'status', visible: true, label: '账号状态', align: 'center', minWidth: null, sortable: true},
{key: 'deviceCount', visible: true, label: '设备数量', align: 'center', minWidth: null, sortable: false}, {key: 'deviceCount', visible: true, label: '设备数量', align: 'center', minWidth: null, sortable: false},
{key: 'deviceAdmin', visible: false, label: '设备管理员', align: 'center', minWidth: null, sortable: false},
], ],
openServiceRate: false, openServiceRate: false,
// //
@ -287,7 +294,7 @@ export default {
sex: undefined, sex: undefined,
identityCard: undefined, identityCard: undefined,
phonenumber: '', phonenumber: '',
address: undefined, address: null,
}, },
// //
rules: { rules: {
@ -323,6 +330,20 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
onChangeDeviceAdmin(val) {
if (val) {
this.$confirm('【高危操作】是否确认设置用户为设备管理员?<br/>用户将可以通过微信小程序注册设备!', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.form.deviceAdmin = true;
}).catch((e) => {
this.form.deviceAdmin = false;
});
}
},
onSortChange(column) { onSortChange(column) {
if (column.order == null) { if (column.order == null) {
this.queryParams.orderByColumn = defaultSort.prop; this.queryParams.orderByColumn = defaultSort.prop;
@ -367,6 +388,7 @@ export default {
sex: "2", sex: "2",
avatar: null, avatar: null,
isMch: false, isMch: false,
deviceAdmin: false,
}; };
this.resetForm("form"); this.resetForm("form");
}, },