Browse Source

fix:修改通信管理 套餐业务逻辑

confidence
杜贤金 3 years ago
parent
commit
6bbdc5d19f
  1. 2
      public/index.html
  2. 8
      src/api/communication/basiccard.js
  3. 27
      src/api/sys/index.js
  4. 2
      src/lang/zh.js
  5. 107
      src/views/communicationmanage/basiccard/basiccard.vue
  6. 78
      src/views/communicationmanage/device/device.vue
  7. 238
      src/views/communicationmanage/outbound/outbound.vue
  8. 214
      src/views/iot/vendor/ali/config.vue
  9. 199
      src/views/iot/vendor/ali/consumer.vue
  10. 28
      src/views/original/packagegroupmanage/index.vue
  11. 139
      src/views/original/packagemanage/index.vue
  12. 139
      src/views/original/targetpackagemanage/index.vue
  13. 352
      src/views/sys/index.vue

2
public/index.html

@ -19,7 +19,7 @@
<script src="<%= BASE_URL %>cdn/xlsx/FileSaver.min.js"></script>
<script src="<%= BASE_URL %>cdn/xlsx/xlsx.full.min.js"></script>
<link rel="icon" href="<%= BASE_URL %>favicon.png">
<title>Saber企业级开发平台</title>
<title>青鸟物联网平台</title>
<style>
html,
body,

8
src/api/communication/basiccard.js

@ -80,3 +80,11 @@ export const channelfillData = () => {
})
}
//流量池
export const flowpoolfillData = () => {
return request({
url:'/api/iot-sim/flowpool/fillData?isSource=' + 1,
method: 'get',
})
}

27
src/api/sys/index.js

@ -1,27 +0,0 @@
import request from '@/router/axios';
/**
* 获取租户详情
* @param{string} tenantId
*/
export const getTenantDetail = (tenantId) => request({
url: '/api/iot/tenant/summary',
params: {
tenantId,
},
});
/**
* 获取在线设备统计数据
* @param queryStartTime
* @param queryEndTime
* @param productId
*/
export const getOnlineDeviceData = (queryStartTime, queryEndTime, productId) => request({
url: '/api/iot/statistics/online',
params: {
queryStartTime,
queryEndTime,
productId,
},
});

2
src/lang/zh.js

@ -1,6 +1,6 @@
export default {
tip: '提示',
title: 'Saber企业级开发平台',
title: '青鸟物联网平台',
logoutTip: '退出系统, 是否继续?',
submitText: '确定',
cancelText: '取消',

107
src/views/communicationmanage/basiccard/basiccard.vue

@ -303,8 +303,8 @@ export default {
{
label: "通道名称",
prop: "channelId",
dataType: "number",
type: "select",
dataType: "number",
span: 12,
labelWidth: 130,
search: true,
@ -313,6 +313,7 @@ export default {
label: "name",
value: "id",
},
rules: [
{
required: true,
@ -321,12 +322,43 @@ export default {
},
],
},
{
label: "元流量池名称",
prop: "flowPoolId",
type: "select",
dataType: "number",
span: 12,
labelWidth: 130,
searchLabelWidth: 110,
search: true,
display: true,
dicUrl: "/api/iot-sim/flowpool/fillData?isSource=" + 1,
formatter: (val, value, label) => {
if (value == -1) {
return "-";
} else {
return `${label}`;
}
},
props: {
label: "name",
value: "id",
},
rules: [
{
required: true,
message: "请选择元流量池名称",
trigger: "change",
},
],
},
{
label: "批次号",
prop: "batchNum",
span: 12,
labelWidth: 130,
search: true,
addDisplay: false,
rules: [
{
required: true,
@ -335,28 +367,6 @@ export default {
},
],
},
// {
// label: "",
// prop: "cardType",
// type: "select",
// span: 12,
// dicUrl: "/api/iot-system/dict/dictionary?code=card_type",
// props: {
// label: "dictValue",
// value: "dictKey",
// },
// dataType:"number",
// labelWidth: 130,
// searchLabelWidth: 120,
// search: true,
// rules: [
// {
// required: true,
// message: "",
// trigger: "change",
// },
// ],
// },
{
label: "iccid",
prop: "iccid",
@ -401,6 +411,23 @@ export default {
},
],
},
{
label: "卡类型",
prop: "cardType",
type: "select",
dicUrl: "/api/iot-system/dict/dictionary?code=card_type",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
span: 12,
labelWidth: 130,
search: true,
rules: [
{ required: true, message: "请选择卡类型", trigger: "change" },
],
},
{
label: "是否出库",
prop: "isDeliver",
@ -413,6 +440,7 @@ export default {
dataType: "number",
span: 12,
labelWidth: 130,
width: 70,
search: true,
rules: [
{ required: true, message: "请选择是否出库", trigger: "change" },
@ -493,6 +521,17 @@ export default {
column.disabled = true;
}
},
"form.$channelId"() {
const columns = this.findObject(this.option.column, "flowPoolId");
if (this.form.$channelId != undefined) {
if (this.form.$channelId.indexOf("电信") != -1) {
columns.display = false;
this.form.flowPoolId = "";
} else {
columns.display = true;
}
}
},
},
methods: {
//
@ -519,13 +558,22 @@ export default {
//
rowSave(row, done, loading) {
add(row).then(
() => {
(res) => {
if (res.data.data == true) {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!",
});
done();
} else {
this.$message({
type: "error",
message: "操作失败!",
});
done(); //
loading(); //
}
},
(error) => {
window.console.log(error);
@ -536,13 +584,22 @@ export default {
//
rowUpdate(row, index, done, loading) {
update(row).then(
() => {
(res) => {
if (res.data.data == true) {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!",
});
done();
} else {
this.$message({
type: "error",
message: "操作失败!",
});
done(); //
loading(); //
}
},
(error) => {
window.console.log(error);

78
src/views/communicationmanage/device/device.vue

@ -41,7 +41,7 @@ import {
update,
} from "@/api/communication/device";
import { mapGetters } from "vuex";
import { getToken } from "@/util/auth";
export default {
data() {
return {
@ -68,19 +68,37 @@ export default {
dialogWidth: "60%",
column: [
{
label: "设备序列号",
prop: "deviceSn",
label: "批次号",
prop: "batchNum",
span: 12,
labelWidth: 130,
search: false,
search: true,
rules: [
{
required: true,
message: "请输入设备序列号",
message: "请输入批次号",
trigger: "blur",
},
],
},
{
label: "租户名称",
prop: "tenantId",
type: "select",
dicUrl: "/api/iot-system/tenant/fillData",
props: {
label: "tenantName",
value: "tenantId",
},
dataType: "string",
span: 12,
labelWidth: 130,
width: 140,
search: true,
rules: [
{ required: true, message: "请选择租户名称", trigger: "change" },
],
},
{
label: "设备名称",
prop: "name",
@ -97,45 +115,45 @@ export default {
},
{
label: "贴片卡iccid",
prop: "simChipIccid",
label: "设备号",
prop: "sn",
span: 12,
labelWidth: 130,
search: false,
hide: true,
search: true,
rules: [
{
required: false,
message: "请输入贴片卡id",
required: true,
message: "请输入设备号",
trigger: "blur",
},
],
},
{
label: "插拔卡iccid",
prop: "simExtraIccid",
label: "贴片卡iccid",
prop: "simChipIccid",
span: 12,
labelWidth: 130,
search: false,
hide: true,
rules: [
{
required: false,
message: "请输入插拔卡id",
required: true,
message: "请输入贴片卡id",
trigger: "blur",
},
],
},
{
label: "sn码",
prop: "sn",
label: "插拔卡iccid",
prop: "simExtraIccid",
span: 12,
labelWidth: 130,
search: false,
hide: true,
rules: [
{
required: true,
message: "请输入sn码",
required: false,
message: "请输入插拔卡id",
trigger: "blur",
},
],
@ -159,6 +177,7 @@ export default {
},
{
label: "设备读卡类型",
prop: "type",
type: "select",
span: 12,
dicUrl: "/api/iot-system/dict/dictionary?code=device_type",
@ -167,8 +186,7 @@ export default {
value: "dictKey",
},
dataType: "number",
prop: "type",
labelWidth: 130,
labelWidth: 120,
searchLabelWidth: 140,
search: true,
rules: [
@ -179,20 +197,6 @@ export default {
},
],
},
{
label: "管理员账号",
prop: "account",
span: 12,
labelWidth: 130,
search: false,
rules: [
{
required: true,
message: "请输入管理员账号",
trigger: "blur",
},
],
},
],
},
data: [],
@ -292,13 +296,13 @@ export default {
handleExport() {
if (process.env.NODE_ENV === "production") {
window.open(
`http://223.99.228.240:18081/bd-core/tenant/dailybill/export-excel?${
`http://223.99.228.240:18081/iot-sim/device/export-device?${
this.website.tokenHeader
}=${getToken()}`
);
} else {
window.open(
`/api/iot-sim/simcard/export-simCard?${
`/api/iot-sim/device/export-device?${
this.website.tokenHeader
}=${getToken()}`
);

238
src/views/communicationmanage/outbound/outbound.vue

@ -19,6 +19,15 @@
@refresh-change="refreshChange"
@on-load="onLoad"
>
<template slot="menuLeft">
<el-button
size="small"
type="primary"
icon="el-icon-download"
@click="handleExport"
>导出
</el-button>
</template>
</avue-crud>
</basic-container>
</template>
@ -32,7 +41,7 @@ import {
update,
} from "@/api/communication/outbound";
import { mapGetters } from "vuex";
import { getToken } from "@/util/auth";
export default {
data() {
return {
@ -50,7 +59,7 @@ export default {
searchMenuSpan: 6,
border: true,
index: true,
addBtn: false,
addBtn: true,
viewBtn: true,
delBtn: true,
columnBtn: false,
@ -58,42 +67,143 @@ export default {
dialogClickModal: false,
dialogWidth: "60%",
column: [
{
label: "租户名称",
prop: "tenantId",
type: "select",
dicUrl: "/api/iot-system/tenant/fillData",
props: {
label: "tenantName",
value: "tenantId",
},
dataType: "string",
span: 12,
labelWidth: 130,
width: 140,
search: true,
rules: [
{ required: true, message: "请选择租户名称", trigger: "change" },
],
},
{
label: "用户名称",
prop: "userId",
type: "select",
dicUrl: "/api/iot-system/user/fillData",
props: {
label: "account",
value: "id",
},
dataType: "string",
span: 12,
labelWidth: 130,
width: 70,
search: false,
rules: [
{ required: true, message: "请选择用户名称", trigger: "change" },
],
},
{
label: "通道名称",
prop: "channelId",
type: "select",
dicUrl: "/api/iot-sim/channel/fillData",
props: {
label: "name",
value: "id",
},
dataType: "number",
span: 12,
labelWidth: 130,
width: 100,
search: true,
rules: [
{ required: true, message: "请选择通道名称", trigger: "change" },
],
},
{
label: "流量池名称",
prop: "flowPoolId",
type: "select",
dataType: "number",
span: 12,
labelWidth: 130,
searchLabelWidth: 110,
width: 110,
search: true,
display: true,
dicUrl: "/api/iot-sim/flowpool/fillData?isSource=" + 2,
formatter: (val, value, label) => {
if (value == -1) {
return "-";
} else {
return `${label}`;
}
},
props: {
label: "name",
value: "id",
},
rules: [
{
required: true,
message: "请选择流量池名称",
trigger: "change",
},
],
},
{
label: "卡状态",
prop: "cardStatus",
type: "select",
dicUrl: "/api/iot-system/dict/dictionary?code=card_status",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
span: 12,
labelWidth: 130,
width: 70,
search: true,
rules: [
{ required: true, message: "请选择卡状态", trigger: "change" },
],
},
{
label: "卡类型",
prop: "cardType",
type: "select",
dicUrl: "/api/iot-system/dict/dictionary?code=card_type",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
span: 12,
labelWidth: 130,
width: 70,
search: true,
rules: [
{ required: true, message: "请选择卡类型", trigger: "change" },
],
},
{
label: "批次号",
prop: "batchNum",
span: 12,
labelWidth: 130,
search: true,
hide: true,
addDisplay: false,
rules: [
{
required: true,
message: "请输入通道名称",
message: "请输入批次号",
trigger: "blur",
},
],
},
// {
// label: "",
// prop: "cardType",
// type: "select",
// span: 12,
// dicUrl: "/api/iot-system/dict/dictionary?code=card_type",
// props: {
// label: "dictValue",
// value: "dictKey",
// },
// dataType: "number",
// labelWidth: 130,
// searchLabelWidth: 120,
// search: true,
// rules: [
// {
// required: true,
// message: "",
// trigger: "change",
// },
// ],
// },
{
label: "iccid",
prop: "iccid",
@ -104,7 +214,7 @@ export default {
rules: [
{
required: true,
message: "请输入通道名称",
message: "请输入iccid",
trigger: "blur",
},
],
@ -116,46 +226,77 @@ export default {
width: 150,
labelWidth: 130,
search: true,
addDisplay: false,
rules: [
{
required: true,
message: "请输入imsi",
trigger: "blur",
},
],
},
{
label: "msisdn",
prop: "msisdn",
span: 12,
width: 150,
labelWidth: 130,
addDisplay: false,
search: true,
rules: [
{
required: true,
message: "请输入通道名称",
message: "请输入msisdn",
trigger: "blur",
},
],
},
// {
// label: "",
// prop: "status",
// span: 12,
// labelWidth: 130,
// rules: [
// { required: true, message: "apiUrl", trigger: "blur" },
// ],
// },
{
label: "剩余流量(单位M)",
label: "剩余流量(M)",
prop: "surplus",
span: 12,
labelWidth: 130,
hide: true,
rules: [
{ required: true, message: "请输入apiUrl", trigger: "blur" },
{ required: true, message: "请输入剩余流量", trigger: "blur" },
],
},
{
label: "使用量(单位M)",
label: "使用量(M)",
prop: "usage",
span: 12,
labelWidth: 130,
hide: true,
rules: [
{ required: true, message: "请输入apiUrl", trigger: "blur" },
{ required: true, message: "请输入使用量", trigger: "blur" },
],
},
{
label: "总量(M)",
prop: "total",
span: 12,
labelWidth: 130,
hide: true,
rules: [{ required: true, message: "请输入总量", trigger: "blur" }],
},
],
},
data: [],
};
},
watch: {
"form.$channelId"() {
const columns = this.findObject(this.option.column, "flowPoolId");
if (this.form.$channelId != undefined) {
if (this.form.$channelId.indexOf("电信") != -1) {
columns.display = false;
this.form.flowPoolId = "";
} else {
columns.display = true;
}
}
},
},
computed: {
...mapGetters(["permission"]),
permissionList() {
@ -187,6 +328,7 @@ export default {
},
//
rowSave(row, done, loading) {
console.log(this.form);
add(row).then(
() => {
this.onLoad(this.page);
@ -246,6 +388,22 @@ export default {
refreshChange() {
this.onLoad(this.page, this.query);
},
//
handleExport() {
if (process.env.NODE_ENV === "production") {
window.open(
`http://223.99.228.240:18081/iot-sim/simcarddeliver/export-simCardDeliver?${
this.website.tokenHeader
}=${getToken()}`
);
} else {
window.open(
`/api/iot-sim/simcarddeliver/export-simCardDeliver?${
this.website.tokenHeader
}=${getToken()}`
);
}
},
onLoad(page, params = {}) {
this.loading = true;
getList(

214
src/views/iot/vendor/ali/config.vue vendored

@ -1,214 +0,0 @@
<template>
<basic-container>
<avue-crud :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
:permission="permissionList"
:before-open="beforeOpen"
v-model="form"
ref="crud"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@search-change="searchChange"
@search-reset="searchReset"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
import {add, getDetail, getList, remove, update} from "@/api/iot/vendor/aliConfig";
import {mapGetters} from "vuex";
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
option: {
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
viewBtn: true,
columnBtn: false,
selection: false,
dialogClickModal: false,
dialogWidth: "45%",
column: [
{
label: "配置名称",
prop: "configName",
span: 24,
labelWidth: 120,
search: true,
searchLabelWidth: 80,
searchPlaceholder: "请输入配置名称",
rules: [{
required: true,
message: "请输入配置名称",
trigger: "blur"
}],
},
{
label: "区域",
prop: "regionId",
span: 22,
labelWidth: 120,
searchPlaceholder: "请输入区域",
rules: [{
required: true,
message: "请输入区域",
trigger: "blur"
}]
},
{
label: "AccessKey",
prop: "accessKey",
span: 22,
labelWidth: 120,
searchPlaceholder: "请输入 AccessKey",
rules: [{
required: true,
message: "请输入 AccessKey",
trigger: "blur"
}]
},
{
label: "AccessSecret",
prop: "accessSecret",
span: 22,
labelWidth: 120,
searchPlaceholder: "请输入 AccessSecret",
rules: [{
required: true,
message: "请输入 AccessSecret",
trigger: "blur"
}]
},
{
label: "接入域名",
prop: "connectionUrl",
span: 22,
labelWidth: 120,
searchPlaceholder: "请输入接入域名",
rules: [{
required: false,
message: "请输入接入域名",
trigger: "blur"
}]
},
]
},
data: []
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.ali_config_add, false),
viewBtn: this.vaildData(this.permission.ali_config_view, false),
delBtn: this.vaildData(this.permission.ali_config_delete, false),
editBtn: this.vaildData(this.permission.ali_config_edit, false)
};
}
},
methods: {
rowSave(row, done, loading) {
add(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
loading();
window.console.log(error);
});
},
rowUpdate(row, index, done, loading) {
update(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
loading();
console.log(error);
});
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getDetail(this.form.id).then(res => {
this.form = res.data.data;
});
}
done();
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
this.loading = true;
getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
});
}
}
};
</script>
<style>
</style>

199
src/views/iot/vendor/ali/consumer.vue vendored

@ -1,199 +0,0 @@
<template>
<basic-container>
<avue-crud :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
:permission="permissionList"
:before-open="beforeOpen"
v-model="form"
ref="crud"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@search-change="searchChange"
@search-reset="searchReset"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
import {add, getDetail, getList, remove, update} from "@/api/iot/vendor/aliConsumer";
import {mapGetters} from "vuex";
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
option: {
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
viewBtn: true,
columnBtn: false,
selection: false,
dialogClickModal: false,
dialogWidth: "45%",
column: [
{
label: "阿里云配置",
prop: "configId",
type: "tree",
dicUrl: "/api/iot/ali/config/select",
props: {
label: "configName",
value: "id"
},
span: 24,
labelWidth: 110,
search: true,
searchLabelWidth: 90,
searchPlaceholder: "请选择阿里云配置",
rules: [{
required: true,
message: "请选择阿里云配置",
trigger: "click"
}],
editDisplay: false,
},
{
label: "消费组名称",
prop: "consumerName",
span: 24,
labelWidth: 110,
searchPlaceholder: "请输入消费组名称",
rules: [{
required: true,
message: "请输入消费组名称",
trigger: "blur"
}]
},
{
label: "消费组ID",
prop: "consumerId",
labelWidth: 110,
search: true,
searchPlaceholder: "请输入消费组ID",
rules: [{
required: true,
message: "请输入消费组ID",
trigger: "blur"
}],
addDisplay: false,
editDisplay: false,
},
]
},
data: []
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.ali_config_add, false),
viewBtn: this.vaildData(this.permission.ali_config_view, false),
delBtn: this.vaildData(this.permission.ali_config_delete, false),
editBtn: this.vaildData(this.permission.ali_config_edit, false)
};
}
},
methods: {
rowSave(row, done, loading) {
add(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
loading();
window.console.log(error);
});
},
rowUpdate(row, index, done, loading) {
update(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
loading();
console.log(error);
});
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getDetail(this.form.id).then(res => {
this.form = res.data.data;
});
}
done();
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
this.loading = true;
getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
});
}
}
};
</script>
<style>
</style>

28
src/views/original/packagegroupmanage/index.vue

@ -19,15 +19,6 @@
@refresh-change="refreshChange"
@on-load="onLoad"
>
<!-- <template slot="menuLeft">
<el-button
size="small"
type="primary"
icon="el-icon-download"
@click="handleExport"
>导出
</el-button>
</template> -->
</avue-crud>
</basic-container>
</template>
@ -84,7 +75,7 @@ export default {
],
},
{
label: "支持的套餐类型",
label: "套餐类型",
prop: "type",
span: 12,
type: "select",
@ -100,11 +91,26 @@ export default {
rules: [
{
required: true,
message: "请选择支持的套餐类型",
message: "请选择套餐类型",
trigger: "change",
},
],
},
{
label: "订购数量",
prop: "orderCount",
span: 12,
labelWidth: 130,
searchLabelWidth: 100,
search: false,
rules: [
{
required: true,
message: "请输入订购数量",
trigger: "blur",
},
],
},
],
},
data: [],

139
src/views/original/packagemanage/index.vue

@ -59,6 +59,7 @@ export default {
option: {
tip: false,
searchShow: true,
// dialogDrag:true,//
searchMenuSpan: 6,
border: true,
index: true,
@ -71,6 +72,24 @@ export default {
dialogClickModal: false,
dialogWidth: "60%",
column: [
{
label: "租户名称",
prop: "tenantId",
type: "select",
dicUrl: "/api/iot-system/tenant/fillData",
props: {
label: "tenantName",
value: "tenantId",
},
dataType: "string",
span: 12,
labelWidth: 130,
width: 140,
search: true,
rules: [
{ required: true, message: "请选择租户名称", trigger: "change" },
],
},
{
label: "套餐组名称",
prop: "dataPlanGroupId",
@ -108,38 +127,60 @@ export default {
},
],
},
{
label: "元套餐内容",
prop: "content",
label: "套餐类型",
prop: "type",
span: 12,
labelWidth: 130,
type: "select",
searchLabelWidth: 100,
search: false,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=dataPlanType",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
rules: [
{ required: true, message: "请输入元套餐内容", trigger: "blur" },
{
required: true,
message: "请选择套餐类型",
trigger: "change",
},
],
},
{
label: "套餐总量(M)",
prop: "total",
label: "生效类型",
prop: "activateType",
span: 12,
type: "number",
labelWidth: 130,
type: "select",
searchLabelWidth: 100,
search: false,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=activateType",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
rules: [
{ required: true, message: "请输入套餐总量", trigger: "blur" },
{
required: true,
message: "请选择生效类型",
trigger: "change",
},
],
},
{
label: "套餐周期类型",
prop: "type",
label: "套餐使用类型",
prop: "usageType",
span: 12,
type: "select",
searchLabelWidth: 100,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=DataPlanType",
dicUrl: "/api/iot-system/dict/dictionary?code=usageType",
props: {
label: "dictValue",
value: "dictKey",
@ -148,11 +189,79 @@ export default {
rules: [
{
required: true,
message: "请选择套餐周期类型",
message: "请选择套餐使用类型",
trigger: "change",
},
],
},
{
label: "套餐总量(M)",
prop: "total",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
rules: [
{ required: true, message: "请输入套餐总量", trigger: "blur" },
],
},
{
label: "成本价",
prop: "costPrice",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{ required: true, message: "请输入成本价", trigger: "blur" },
],
},
{
label: "代理价",
prop: "agentPrice",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{ required: true, message: "请输入代理价", trigger: "blur" },
],
},
{
label: "停机多少天后注销账户",
prop: "stopClose",
span: 12,
type: "number",
labelWidth: 170,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{
required: true,
message: "请输入停机多少天后注销账户",
trigger: "blur",
},
],
},
{
label: "元套餐内容",
prop: "content",
span: 24,
type: "textarea",
labelWidth: 130,
searchLabelWidth: 100,
hide: true,
search: false,
rules: [
{ required: true, message: "请输入元套餐内容", trigger: "blur" },
],
},
],
},
data: [],

139
src/views/original/targetpackagemanage/index.vue

@ -59,6 +59,7 @@ export default {
option: {
tip: false,
searchShow: true,
// dialogDrag:true,//
searchMenuSpan: 6,
border: true,
index: true,
@ -71,6 +72,24 @@ export default {
dialogClickModal: false,
dialogWidth: "60%",
column: [
{
label: "租户名称",
prop: "tenantId",
type: "select",
dicUrl: "/api/iot-system/tenant/fillData",
props: {
label: "tenantName",
value: "tenantId",
},
dataType: "string",
span: 12,
labelWidth: 130,
width: 140,
search: true,
rules: [
{ required: true, message: "请选择租户名称", trigger: "change" },
],
},
{
label: "套餐组名称",
prop: "dataPlanGroupId",
@ -108,38 +127,60 @@ export default {
},
],
},
{
label: "目标套餐内容",
prop: "content",
label: "套餐类型",
prop: "type",
span: 12,
labelWidth: 130,
type: "select",
searchLabelWidth: 100,
search: false,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=dataPlanType",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
rules: [
{ required: true, message: "请输入目标套餐内容", trigger: "blur" },
{
required: true,
message: "请选择套餐类型",
trigger: "change",
},
],
},
{
label: "目标套餐总量(M)",
prop: "total",
label: "生效类型",
prop: "activateType",
span: 12,
type: "number",
labelWidth: 130,
type: "select",
searchLabelWidth: 100,
search: false,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=activateType",
props: {
label: "dictValue",
value: "dictKey",
},
dataType: "number",
rules: [
{ required: true, message: "请输入目标套餐总量", trigger: "blur" },
{
required: true,
message: "请选择生效类型",
trigger: "change",
},
],
},
{
label: "套餐周期类型",
prop: "type",
label: "套餐使用类型",
prop: "usageType",
span: 12,
type: "select",
searchLabelWidth: 100,
search: true,
labelWidth: 130,
dicUrl: "/api/iot-system/dict/dictionary?code=DataPlanType",
dicUrl: "/api/iot-system/dict/dictionary?code=usageType",
props: {
label: "dictValue",
value: "dictKey",
@ -148,11 +189,79 @@ export default {
rules: [
{
required: true,
message: "请选择套餐周期类型",
message: "请选择套餐使用类型",
trigger: "change",
},
],
},
{
label: "套餐总量(M)",
prop: "total",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
rules: [
{ required: true, message: "请输入套餐总量", trigger: "blur" },
],
},
{
label: "成本价",
prop: "costPrice",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{ required: true, message: "请输入成本价", trigger: "blur" },
],
},
{
label: "代理价",
prop: "agentPrice",
span: 12,
type: "number",
labelWidth: 130,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{ required: true, message: "请输入代理价", trigger: "blur" },
],
},
{
label: "停机多少天后注销账户",
prop: "stopClose",
span: 12,
type: "number",
labelWidth: 170,
searchLabelWidth: 100,
search: false,
hide: true,
rules: [
{
required: true,
message: "请输入停机多少天后注销账户",
trigger: "blur",
},
],
},
{
label: "元套餐内容",
prop: "content",
span: 24,
type: "textarea",
labelWidth: 130,
searchLabelWidth: 100,
hide: true,
search: false,
rules: [
{ required: true, message: "请输入元套餐内容", trigger: "blur" },
],
},
],
},
data: [],

352
src/views/sys/index.vue

@ -1,352 +0,0 @@
<template>
<div>
<div class='infos'>
<el-card>
<div class='title'>
<span class='icon el-icon-tickets'></span>
租户基本信息
</div>
<div class='content'>
<div>
租户ID <span>{{tenantDetail.tenantId}}</span>
</div>
<div>
租户名称 <span>{{tenantDetail.tenantName}}</span>
</div>
<div>
开通时间 <span>{{tenantDetail.tenantCreateTime}}</span>
</div>
</div>
</el-card>
<el-card>
<div class='title'>
<span class='icon el-icon-cpu'></span>
设备数
</div>
<div class='content'>
<Bar
:current-value='tenantDetail.countStatistics.productCount || 0'
:total-value='tenantDetail.countStatistics.productLimitNumber || 1'
>
<template #title>
<div class='bar-title'>
<div class='label'>
产品
</div>
</div>
</template>
<template #currentValue>已添加</template>
</Bar>
<Bar
:current-value='tenantDetail.countStatistics.deviceCount || 0'
:total-value='(tenantDetail.countStatistics.deviceLimitNumberPerProduct || 1) * (tenantDetail.countStatistics.productLimitNumber || 1)'
>
<template #title>
<div class='bar-title'>
<div class='label'>
设备
</div>
</div>
</template>
<template #currentValue>已添加</template>
</Bar>
</div>
</el-card>
<el-card>
<div class='title'>
<span class='icon el-icon-coin'></span>
Open API
</div>
<div class='content'>
<div>
AppID <span>{{tenantDetail.openApi.appId || '-'}}</span>
</div>
<div class='secret'>
AppSecret
<span>
{{tenantDetail.openApi.appSecret || '-'}}
</span>
<a class='reset' @click='handleReset'>重置</a>
</div>
<div>
生成时间 <span>{{tenantDetail.openApi.createTime || '-'}}</span>
</div>
</div>
</el-card>
</div>
<div class='device'>
<el-card>
<div class='title'>
<span class='icon el-icon-cpu'></span>
实时在线设备数
<el-tooltip effect='dark' content='于物联网平台建立长连接的设备数量,数据采集有一定延迟。' placement='top'>
<span class='tips el-icon-question'></span>
</el-tooltip>
</div>
<div class='content'>
<Bar
:current-value='tenantDetail.onlineStatistics.onlineCount || 0'
:total-value='tenantDetail.onlineStatistics.totalCount || 1'
>
<template #title>
<div class='bar-title'>
<div class='label'>
当前在线设备
</div>
</div>
</template>
</Bar>
<div class='not-active'>
<div>
占比: {{
((tenantDetail.onlineStatistics.onlineCount || 0) / (tenantDetail.onlineStatistics.totalCount || 1) * 100).toFixed(2)
}}%
</div>
</div>
</div>
</el-card>
<el-card>
<div class='title'>
<span class='icon el-icon-cpu'></span>
在线设备数量
<DatePicker
v-model='onLineDeviceQueryDate'
@change='getOnLineDevice'
/>
</div>
<BasicLine class='line-chart' :data='onLineDeviceList' />
</el-card>
</div>
<div class='message'>
<el-card>
<div class='title'>
<span class='icon el-icon-chat-dot-square'></span>
发送到平台的消息量
<el-tooltip effect='dark' content='从物联网发送到服务端和设备的消息,数据采集有一定延迟。' placement='top'>
<span class='tips el-icon-question'></span>
</el-tooltip>
</div>
<BasicLine :height='210'/>
<div class='month'>本月消息量: 3000</div>
</el-card>
<el-card>
<div class='title'>
<span class='icon el-icon-chat-dot-square'></span>
平台发出的消息量
<el-tooltip effect='dark' content='从物联网发送到服务端和设备的消息,数据采集有一定延迟。' placement='top'>
<span class='tips el-icon-question'></span>
</el-tooltip>
</div>
<BasicLine :height='210' />
<div class='month'>本月消息量: 3000</div>
</el-card>
</div>
</div>
</template>
<script>
import {mapGetters} from 'vuex';
import dayjs from 'dayjs';
import Bar from '@/components/Bar/index.vue';
import BasicLine from '@/components/Charts/BasicLine';
import {getOnlineDeviceData, getTenantDetail} from '@/api/sys';
import DatePicker from '@/components/DatePicker/index.vue';
export default {
name: 'Sys',
components: {
Bar,
BasicLine,
DatePicker,
},
data() {
return {
tenantDetail: {
countStatistics: {},
onlineStatistics: {},
openApi: {},
},
onLineDeviceQueryDate: [dayjs().subtract(24, 'hour'), dayjs()],
onLineDeviceList: [],
};
},
computed: {
...mapGetters(['userInfo']),
},
methods: {
//
handleReset() {
this.$confirm('重置后将导致原有AppSecret失效, 是否确定重置?', { type: 'warning' }).then(() => {
// todo reset
}).catch(() => {});
},
// 线
getOnLineDevice() {
let [start, end] = this.onLineDeviceQueryDate;
const format = 'YYYY-MM-DD HH:mm:ss';
start = dayjs(start).format(format);
end = dayjs(end).format(format);
getOnlineDeviceData(start, end).then((res) => {
this.onLineDeviceList = res.data.data.map((item) => ({
label: dayjs(item.timeString).format('MM/DD HH:mm'),
value: item.onlineNum,
}));
});
},
initData() {
getTenantDetail(this.userInfo['tenant_id']).then((res) => {
this.tenantDetail = res.data.data;
});
this.getOnLineDevice();
},
},
mounted() {
this.initData();
},
};
</script>
<style scoped lang='scss'>
.infos {
display: flex;
.el-card {
flex: 1;
margin-right: 20px;
&:last-child {
margin-right: 0;
}
.content {
color: #555555;
font-size: 14px;
line-height: 3;
span {
margin-left: 10px;
}
.reset {
color: red;
cursor: pointer;
margin: 0 20px;
&:hover {
text-decoration: underline;
}
}
.ki-bar:first-child {
margin-top: 20px;
}
.ki-bar {
margin-top: 30px;
}
.secret {
display: flex;
span {
width: 0;
flex: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
}
}
.title {
color: #000c17;
font-weight: bold;
display: flex;
align-items: center;
.icon {
margin-right: 10px;
}
}
.bar-title {
color: #555555;
font-size: 14px;
display: flex;
align-items: baseline;
.label {
font-size: 16px;
font-weight: bold;
margin-right: 20px;
}
span {
font-size: 14px;
font-weight: normal;
}
}
.tips {
color: #cccccc;
margin-left: 10px;
}
.el-date-editor {
margin-left: auto;
}
.device {
margin-top: 20px;
display: flex;
.el-card:first-child {
flex: 1;
margin-right: 20px;
}
.el-card:last-child {
flex: 2;
padding-right: 20px
}
.ki-bar, .line-chart {
margin-top: 25px;
}
.not-active {
margin-top: 30px;
span {
font-size: 14px;
margin-left: 10px;
}
}
}
.message {
margin-top: 20px;
display: flex;
.title {
margin-bottom: 30px;
}
.el-card {
flex: 1;
}
.el-card:first-child {
margin-right: 20px;
}
.month {
font-size: 14px;
margin-top: 15px;
}
}
</style>
Loading…
Cancel
Save