模板管理

main
wangqiujuan0808 2024-04-16 14:48:50 +08:00
parent 20a20f8d5e
commit 88bcff5741
9 changed files with 221 additions and 332 deletions

View File

@ -6,7 +6,7 @@ const infoApi = {
getSys() {
return postPBRequest("/info", null, 51000);
},
// //
//
getNet(params) {
return postPBRequest("/net", params, 52000);
},
@ -31,7 +31,7 @@ const infoApi = {
// },
//
getTxSupport() {
return postPBRequest('/driver', null,53001)
return postPBRequest('/driver', null, 53001)
},
// // api/com
@ -53,26 +53,26 @@ const infoApi = {
// delTc(params) {
// return deleteRequest("/tc", params);
// },
// //
// getMb(params) {
// return getRequest('/tx/mb/list', params)
// },
// //
// addMb(params) {
// return postJsonRequest('/tx/mb', params)
// },
// //
// editMb(params) {
// return putRequest('/tx/mb', params)
// },
// //
// delMb(params) {
// return deleteRequest('/tx/mb', params)
// },
// //
// addP(params) {
// return putRequest('/tx/mb', params)
// },
//
getMb(params) {
return postPBRequest('/template', params, 54000)
},
//
addMb(params) {
return postPBRequest('/template', params, 54100)
},
//
editMb(params) {
return postPBRequest('/template', params, 54200)
},
//
delMb(params) {
return postPBRequest('/template', params, 54300)
},
//
addP(params) {
return postPBRequest('/tx/mb', params)
},
// //
// getP(params) {
@ -86,14 +86,22 @@ const infoApi = {
// addSet(params) {
// return putRequest('/tx/device', params)
// },
//
getTx(params) {
return postPBRequest('/driver', params, 53000)
},
// //
// saveTx(params) {
// return postJsonRequest("/tx", params);
// },
//
getTx(params) {
return postPBRequest('/driver', params, 53000)
},
//
saveTx(params) {
return postPBRequest("/driver", params, 53100);
},
//
getSupportTx(params) {
return postPBRequest("/driver", params, 53001);
},
//
getTxConfig(params) {
return postPBRequest("/driver", params, 53002);
}
// // ,
// changeStatus(params) {

View File

@ -206,7 +206,7 @@ export default {
stop_bits_select: [1, 2],
timeout_select: [0, 100, 200, 500, 1000, 2000],
rules: {
name: [
index: [
{ required: true, message: "请输入通讯名称", trigger: "blur" },
{ required: true, validator: validName, trigger: "blur" },
],
@ -319,10 +319,8 @@ export default {
// com
const getCom = async () => {
const res = await infoApi.getCom();
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
const infodata = com_list.decode(ret.data);
state.comArr = infodata.com;
if (res.code == 0) {
state.comArr = res.data.com;
console.log('comlist',state.comArr)
state.com_select = [];
infodata.com.forEach(e => {

View File

@ -1,42 +1,23 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'I' ? '新增模板': '编辑模板'"
width="30%"
:before-close="closeDialog"
>
<el-form
:model="addForm"
label-width="100px"
:rules="rules"
ref="ruleFormRef"
>
<el-dialog v-model="visible" :title="type === 'I' ? '新增模板' : '编辑模板'" width="30%" :before-close="closeDialog">
<el-form :model="addForm" label-width="100px" :rules="rules" ref="ruleFormRef">
<el-form-item label="模板名称:" prop="name">
<el-input
v-model="addForm.name"
placeholder="请输入模板名称"
clearable
:disabled="type === 'I' ? false: true"
/>
<el-input v-model="addForm.name" placeholder="请输入模板名称" clearable :disabled="type === 'I' ? false : true" />
</el-form-item>
<el-form-item label="模板描述:" prop="description">
<el-input
v-model="addForm.description"
placeholder="请输入模板描述"
clearable
/>
<el-input v-model="addForm.description" placeholder="请输入模板描述" clearable />
</el-form-item>
<el-form-item label="模板类型:" prop="type">
<el-input
v-model="addForm.type"
disabled
/>
<el-select v-model="addForm.type" clearable placeholder="请选择模板类型" @change="driveChange" :disabled="type!=='I'">
<el-option v-for="(item, index) of typeOptions" :key="index" :label="item.name" :value="item.key" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeDialog"></el-button>
<el-button type="primary" @click="saveFormData"> </el-button>
<el-button @click="closeDialog"></el-button>
<el-button type="primary" @click="saveFormData"> </el-button>
</span>
</template>
</el-dialog>
@ -45,7 +26,7 @@
import { onMounted, reactive, ref, toRefs, computed, nextTick } from "vue";
import infoApi from "@/api/infoApi.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { mb_list, mb_info, response} from '../proto/data/pd'
// import { mb_list, mb_info, response} from '../proto/data/pd'
export default {
props: ["formData", "dialogVisible", "type"],
emits: ["dialogClose", "dialogSuccess"],
@ -64,6 +45,16 @@ export default {
{ required: true, message: "请选择类型", trigger: "blur" }
],
},
typeOptions: [
{
key: 1,
name: 'MODBUS'
},
{
key: 2,
name: 'PLC'
}
]
});
const visible = computed(() => {
return props.dialogVisible;
@ -79,28 +70,21 @@ export default {
ctx.emit("dialogClose");
};
const importData = () => {};
const importData = () => { };
const exoportData = () => {};
const exoportData = () => { };
const saveFormData = () => {
ruleFormRef.value.validate(async (valid) => {
if (valid) {
const req_databuf = mb_info.encode(state.addForm).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = props.type === 'I' ? await infoApi.addMb(req_data) : await infoApi.editMb(req_data);
console.log(555, res)
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
//
console.log(new TextDecoder().decode(ret.data));
ElMessage.success(new TextDecoder().decode(ret.data) || "请求成功");
//
ctx.emit("dialogSuccess");
const res = props.type === 'I' ? await infoApi.addMb(state.addForm) : await infoApi.editMb(state.addForm);
if (res.code == 0) {
ElMessage.success(res.message || "请求成功");
//
ctx.emit("dialogSuccess");
} else {
console.log(res);
ElMessage.error(res.message);
}
} else {
console.log("error submit!");
@ -126,42 +110,50 @@ export default {
line-height: 40px;
display: flex;
> div {
>div {
width: 15%;
span {
margin-right: 10px;
}
}
}
.tree-div {
height: 780px;
display: flex;
justify-content: space-between;
.tree {
width: 20%;
border: 1px solid #f2f2f2;
height: 100%;
padding: 10px;
}
.table {
height: 100%;
width: 79%;
display: flex;
flex-direction: column;
justify-content: space-between;
.point-table {
border: 1px solid #f2f2f2;
padding: 10px;
}
.propertie-table {
padding: 10px;
border: 1px solid #f2f2f2;
}
}
.custom-tree-node {
display: flex;
justify-content: space-between;
width: 100%;
.add-icon {
padding-right: 15px;
}

View File

@ -1,132 +1,61 @@
<template>
<el-dialog
v-model="visible"
title="点位管理"
width="60%"
:before-close="closeDialog"
>
<el-dialog v-model="visible" title="点位管理" width="60%" :before-close="closeDialog">
<el-card class="top-title">
<span>模板名称{{ addForm.name }}</span>
<span>模板描述{{ addForm.description }}</span>
<span>模板类型{{ addForm.type }}</span>
<span>模板类型{{ addForm.type == 1 ? 'MODBUS' : 'PLC' }}</span>
</el-card>
<div class="btns">
<div>
<el-button type="primary" @click="saveP"> </el-button>
<el-button @click="closeDialog"></el-button>
<el-button type="primary" @click="saveP"> </el-button>
<el-button @click="closeDialog"></el-button>
</div>
<div>
<el-button type="primary" @click="importData"> </el-button>
<el-button type="primary" @click="exportData"> </el-button>
<el-button type="primary" @click="importData"> </el-button>
<el-button type="primary" @click="exportData"> </el-button>
</div>
</div>
<div>
<el-table
:data="propertiesData"
height="230"
style="width: 100%"
border
stripe
:header-cell-style="{ background: '#F6F7FC' }"
>
<el-table-column
prop="name"
label="点位名称"
align="center"
show-overflow-tooltip
>
<el-table :data="propertiesData" height="230" style="width: 100%" border stripe
:header-cell-style="{ background: '#F6F7FC' }">
<el-table-column prop="name" label="点位名称" align="center" show-overflow-tooltip>
<template #default="scope">
<el-input
v-model="scope.row.name"
clearable
/>
<el-input v-model="scope.row.name" clearable />
</template>
</el-table-column>
<el-table-column
prop="address"
label="点位地址"
align="center"
show-overflow-tooltip
>
<el-table-column prop="address" label="点位地址" align="center" show-overflow-tooltip>
<template #default="scope">
<el-input
v-model="scope.row.address"
clearable
/>
<el-input v-model="scope.row.address" clearable />
</template>
</el-table-column>
<el-table-column
prop="datatype"
label="点位类型"
align="center"
show-overflow-tooltip
>
<el-table-column prop="datatype" label="点位类型" align="center" show-overflow-tooltip>
<template #default="scope">
<el-select v-model="scope.row.datatype" size="mini">
<el-option
v-for="item in datatypeArr"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item in datatypeArr" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column
prop="byteorder"
label="字节顺序"
align="center"
show-overflow-tooltip
>
<el-table-column prop="byteorder" label="字节顺序" align="center" show-overflow-tooltip>
<template #default="scope">
<el-select v-model="scope.row.byteorder" size="mini">
<el-option
v-for="item in byteorderArr"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item in byteorderArr" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column
prop="multplier"
label="缩放系数"
align="center"
show-overflow-tooltip
>
<el-table-column prop="multplier" label="缩放系数" align="center" show-overflow-tooltip>
<template #default="scope">
<el-input
v-model="scope.row.multplier"
clearable
/>
<el-input v-model="scope.row.multplier" clearable />
</template>
</el-table-column>
<el-table-column
prop="unit"
label="点位单位"
align="center"
show-overflow-tooltip
>
<el-table-column prop="unit" label="点位单位" align="center" show-overflow-tooltip>
<template #default="scope">
<el-input
v-model="scope.row.unit"
clearable
/>
<el-input v-model="scope.row.unit" clearable />
</template>
</el-table-column>
<el-table-column
prop="description"
label="点位描述"
align="center"
show-overflow-tooltip
>
<el-table-column prop="description" label="点位描述" align="center" show-overflow-tooltip>
<template #default="scope">
<el-input
v-model="scope.row.description"
clearable
/>
<el-input v-model="scope.row.description" clearable />
</template>
</el-table-column>
<el-table-column label="操作" align="center" show-overflow-tooltip>
@ -147,7 +76,7 @@
import { onMounted, reactive, ref, toRefs, computed, nextTick } from "vue";
import infoApi from "@/api/infoApi.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { m_point, m_properties, mb_info, response} from '../proto/data/pd'
// import { m_point, m_properties, mb_info, response} from '../proto/data/pd'
export default {
props: ["formData", "dialogVisible"],
emits: ["dialogClose", "dialogSuccess"],
@ -158,44 +87,44 @@ export default {
datatypeArr: [{
label: 'bool',
value: 'bool'
},{
}, {
label: 'int16',
value: 'int16'
},{
}, {
label: 'int32',
value: 'int32'
},{
}, {
label: 'unit16',
value: 'unit16'
},{
}, {
label: 'unit32',
value: 'unit32'
},{
}, {
label: 'float32',
value: 'float32'
},{
}, {
label: 'float64',
value: 'float64'
}],
byteorderArr: [{
label: 'null',
value: 'null'
},{
}, {
label: '12',
value: '12'
},{
}, {
label: '21',
value: '21'
},{
}, {
label: '1234',
value: '1234'
},{
}, {
label: '4321',
value: '4321'
},{
}, {
label: 'ABCD',
value: 'ABCD'
},{
}, {
label: 'DCBA',
value: 'DCBA'
}]
@ -210,9 +139,9 @@ export default {
//
getPointList();
});
const getPointList = async() => {
const getPointList = async () => {
const parm = mb_info.encode({
name: state.addForm.name
name: state.addForm.name
}).finish();
//
const parm_data = parm.slice(0, parm.length);
@ -233,19 +162,19 @@ export default {
})
})
} else {
console.log(res);
console.log(res);
}
};
const closeDialog = () => {
ctx.emit("dialogClose");
};
const importData = () => {};
const importData = () => { };
const exportData = () => {};
const exportData = () => { };
const saveP = async () => {
if (state.propertiesData.length<1) {
if (state.propertiesData.length < 1) {
return ElMessage.error("请添加一条点位");
}
const newArr = [];
@ -254,42 +183,40 @@ export default {
name: item.name,
properties: [
m_properties.create({
name: 'address',value:item.address
name: 'address', value: item.address
}),
m_properties.create({
name: 'datatype',value:item.datatype
name: 'datatype', value: item.datatype
}),
m_properties.create({
name: 'byteorder',value:item.byteorder
name: 'byteorder', value: item.byteorder
}),
m_properties.create({
name: 'multplier',value:item.multplier
name: 'multplier', value: item.multplier
}),
m_properties.create({
name: 'unit',value:item.unit
name: 'unit', value: item.unit
}),
m_properties.create({
name: 'description',value:item.description
name: 'description', value: item.description
})
]
}))
})
console.log(123, newArr)
const req_databuf = mb_info.encode({
name: state.addForm.name,
type: state.addForm.type,
description: state.addForm.description,
points: newArr
}).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = await infoApi.addP(req_data);
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
console.log(new TextDecoder().decode(ret.data));
ElMessage.success(new TextDecoder().decode(ret.data) || "请求成功");
const param = {
name: state.addForm.name,
type: state.addForm.type,
description: state.addForm.description,
points: newArr
}
const res = await infoApi.addP(param);
if (res.code == 0) {
ElMessage.success(res.message || "请求成功");
//
getPointList();
} else {
ElMessage.error(res.message);
}
};
@ -302,7 +229,7 @@ export default {
multplier: '',
unit: '',
description: ''
};
};
state.propertiesData.push(newRow);
}
const delData = (index) => {
@ -324,6 +251,7 @@ export default {
<style lang="scss" scoped>
.top-title {
width: 100%;
::v-deep .el-card__body {
width: 100%;
display: flex;
@ -332,12 +260,14 @@ export default {
font-size: 16px;
}
}
.btns {
padding: 15px 0;
width: 100%;
display: flex;
justify-content: space-between;
}
.flex-center {
display: flex;
justify-content: center;

View File

@ -90,7 +90,7 @@ export default {
},
{
id: 3 - 2,
name: "通讯管理",
name: "驱动管理",
index: "/page",
},
// {

View File

@ -32,26 +32,26 @@ const router = createRouter({
name: 'page',
component: () => import('../views/Page.vue')
},
{
path: '/data',
name: 'data',
component: () => import('../views/Data.vue')
},
{
path: '/report',
name: 'report',
component: () => import('../views/Report.vue')
},
{
path: '/transparent',
name: 'transparent',
component: () => import('../views/Transparent.vue')
},
{
path: '/rules',
name: 'rules',
component: () => import('../views/Rules.vue')
}
// {
// path: '/data',
// name: 'data',
// component: () => import('../views/Data.vue')
// },
// {
// path: '/report',
// name: 'report',
// component: () => import('../views/Report.vue')
// },
// {
// path: '/transparent',
// name: 'transparent',
// component: () => import('../views/Transparent.vue')
// },
// {
// path: '/rules',
// name: 'rules',
// component: () => import('../views/Rules.vue')
// }
]
})

View File

@ -48,7 +48,7 @@ axios.interceptors.response.use(
},
(error) => {
ElMessage.closeAll();
ElMessage.error(error);
ElMessage.error("请求错误");
// router.push({
// path: "/login"
// });

View File

@ -4,36 +4,16 @@
<div class="top-div">
<el-button type="primary" @click="addData"></el-button>
</div>
<el-table
:data="tableData"
height="730"
style="width: 100%"
border
stripe
:header-cell-style="{ background: '#F6F7FC' }"
>
<el-table :data="tableData" height="730" style="width: 100%" border stripe
:header-cell-style="{ background: '#F6F7FC' }">
<el-table-column type="index" label="序号" width="80" align="center" />
<el-table-column
prop="name"
label="模板名称"
width="200"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="type"
label="模板类型"
width="200"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="description"
label="模板描述"
width="200"
align="center"
show-overflow-tooltip
/>
<el-table-column prop="name" label="模板名称" width="240" align="center" show-overflow-tooltip />
<el-table-column prop="type" label="模板类型" width="240" align="center" show-overflow-tooltip>
<template #default="scope">
<span>{{ scope.row.type === 1 ? 'MODBUS' : 'PLC' }}</span>
</template>
</el-table-column>
<el-table-column prop="description" label="模板描述" width="600" align="center" show-overflow-tooltip />
<el-table-column label="模板管理" align="center" show-overflow-tooltip>
<template #default="scope">
<el-button type="info" @click="manageData(scope.row)">
@ -49,22 +29,11 @@
</el-table-column>
</el-table>
</div>
<AddMb
:type="type"
:formData="formData"
:dialogVisible="dialogVisible"
v-if="dialogVisible"
@dialogClose="dialogClose"
@dialogSuccess="dialogSuccess"
>
<AddMb :type="type" :formData="formData" :dialogVisible="dialogVisible" v-if="dialogVisible"
@dialogClose="dialogClose" @dialogSuccess="dialogSuccess">
</AddMb>
<AddPoint
:formData="formData1"
:dialogVisible="dialogVisible1"
v-if="dialogVisible1"
@dialogClose="dialogClose"
@dialogSuccess="dialogSuccess"
>
<AddPoint :formData="formData1" :dialogVisible="dialogVisible1" v-if="dialogVisible1" @dialogClose="dialogClose"
@dialogSuccess="dialogSuccess">
</AddPoint>
</el-card>
</template>
@ -74,7 +43,7 @@ import { onMounted, reactive, ref, toRefs } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import AddMb from "@/components/AddMb.vue";
import infoApi from "@/api/infoApi.js";
import { response, mb_info, mb_list } from '../proto/data/pd'
// import { response, mb_info, mb_list } from '../proto/data/pd'
import AddPoint from "@/components/AddPoint.vue";
export default {
name: "model",
@ -101,14 +70,11 @@ export default {
});
const getTableData = async () => {
const res = await infoApi.getMb();
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
//
state.tableData = mb_list.decode(ret.data).mb;
console.log(mb_list.decode(ret.data).mb);
if (res.code == 0) {
//
state.tableData = res.data;
} else {
console.log(res);
console.log(res);
}
};
const editData = (item) => {
@ -124,19 +90,12 @@ export default {
type: "warning",
})
.then(async () => {
const req_databuf = mb_info.encode({
name: item.name,
}).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = await infoApi.delMb(req_data);
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
ElMessage.success(res.msg || "请求成功");
const res = await infoApi.delMb(item);
if (res.code == 0) {
ElMessage.success(res.message || "请求成功");
getTableData();
} else {
ElMessage.error(res.msg);
ElMessage.error(res.message);
}
})
.catch(() => {
@ -150,7 +109,7 @@ export default {
state.formData = {
name: '',
description: '',
type: 'modbus'
type: 1
}
state.type = 'I';
};
@ -187,6 +146,7 @@ export default {
display: flex;
flex-direction: column;
}
.top-div {
display: flex;
justify-content: flex-end;

View File

@ -33,7 +33,11 @@
width="200"
align="center"
show-overflow-tooltip
/>
>
<template #default="scope">
<span>{{ qudongOptions[scope.row.type]}}</span>
</template>
</el-table-column>
<el-table-column
prop="host"
label="主机地址"
@ -200,18 +204,15 @@ export default {
type: "warning",
})
.then(async () => {
const req_databuf = tx_info.encode({
name: state.formData.name,
}).finish();
//
const req_data = req_databuf.slice(0, req_databuf.length);
const res = await infoApi.delTx(req_data);
const ret = response.decode(new Uint8Array(res));
if (ret.code == 0) {
ElMessage.success(res.msg || "删除成功");
let param = {
name: state.formData.name
}
const res = await infoApi.delTx(param);
if (res.code == 0) {
ElMessage.success(res.message || "删除成功");
getTableData();
} else {
ElMessage.error(res.msg | "删除失败");
ElMessage.error(res.message | "删除失败");
}
})
.catch(() => {
@ -249,7 +250,7 @@ export default {
dialogSuccess,
changeStatus,
dialogClose1,
dialogSuccess1,
dialogSuccess1
};
},
};