fix: 修改bug
This commit is contained in:
parent
a4aa193781
commit
bd42cdd3fb
|
@ -2,7 +2,7 @@
|
||||||
<div class="card j-table-card-box">
|
<div class="card j-table-card-box">
|
||||||
<div
|
<div
|
||||||
class="card-warp"
|
class="card-warp"
|
||||||
:class="{ active: active ? 'active' : '' }"
|
:class="{ active: active ? 'active' : '', 'disabled': disabled }"
|
||||||
@click="handleClick"
|
@click="handleClick"
|
||||||
>
|
>
|
||||||
<div class="card-type" v-if="slots.type">
|
<div class="card-type" v-if="slots.type">
|
||||||
|
@ -140,6 +140,10 @@ const props = defineProps({
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const getBackgroundColor = (code: string | number) => {
|
const getBackgroundColor = (code: string | number) => {
|
||||||
|
@ -160,6 +164,7 @@ const handleClick = () => {
|
||||||
.card {
|
.card {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
|
|
||||||
.checked-icon {
|
.checked-icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: -22px;
|
right: -22px;
|
||||||
|
@ -190,16 +195,20 @@ const handleClick = () => {
|
||||||
position: relative;
|
position: relative;
|
||||||
border: 1px solid #e6e6e6;
|
border: 1px solid #e6e6e6;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: pointer;
|
|
||||||
box-shadow: 0 0 24px rgba(#000, 0.1);
|
box-shadow: 0 0 24px rgba(#000, 0.1);
|
||||||
|
|
||||||
.card-mask {
|
.card-mask {
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
filter: grayscale(100%);
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
position: relative;
|
position: relative;
|
||||||
border: 1px solid #2f54eb;
|
border: 1px solid #2f54eb;
|
||||||
|
|
|
@ -143,7 +143,6 @@
|
||||||
import ChannelApi from '@/api/media/channel';
|
import ChannelApi from '@/api/media/channel';
|
||||||
import type { ActionsType } from '@/views/device/Instance/typings';
|
import type { ActionsType } from '@/views/device/Instance/typings';
|
||||||
import { useMenuStore } from 'store/menu';
|
import { useMenuStore } from 'store/menu';
|
||||||
import { message } from 'jetlinks-ui-components';
|
|
||||||
import Save from './Save.vue';
|
import Save from './Save.vue';
|
||||||
import Live from './Live/index.vue';
|
import Live from './Live/index.vue';
|
||||||
import Tree from './Tree/index.vue';
|
import Tree from './Tree/index.vue';
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { message } from 'jetlinks-ui-components';
|
|
||||||
import type { recordsItemType } from './typings';
|
import type { recordsItemType } from './typings';
|
||||||
import type { Dayjs } from 'dayjs';
|
import type { Dayjs } from 'dayjs';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
<template>
|
||||||
|
<j-modal
|
||||||
|
visible
|
||||||
|
title="新增"
|
||||||
|
okText="确定"
|
||||||
|
cancelText="取消"
|
||||||
|
:width="1000"
|
||||||
|
@cancel="closeModal"
|
||||||
|
@ok="saveCorrelation"
|
||||||
|
>
|
||||||
|
<pro-search :columns="columns" @search="handleSearch" />
|
||||||
|
<div style="height: 500px; overflow-y: auto">
|
||||||
|
<JProTable
|
||||||
|
model="CARD"
|
||||||
|
:request="query"
|
||||||
|
:rowSelection="{
|
||||||
|
selectedRowKeys: _selectedRowKeys,
|
||||||
|
onSelectNone: onSelectChange,
|
||||||
|
// onChange: onChange,
|
||||||
|
}"
|
||||||
|
:gridColumns="[1, 1, 1]"
|
||||||
|
:defaultParams="{
|
||||||
|
sorts: [
|
||||||
|
{
|
||||||
|
name: 'createTime',
|
||||||
|
order: 'desc',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
terms,
|
||||||
|
}"
|
||||||
|
:params="params"
|
||||||
|
>
|
||||||
|
<template #card="slotProps">
|
||||||
|
<CardBox
|
||||||
|
:value="slotProps"
|
||||||
|
:status="slotProps.state?.value"
|
||||||
|
:statusText="slotProps.state?.text"
|
||||||
|
:active="_selectedRowKeys.includes(slotProps.id)"
|
||||||
|
@click="handleClick"
|
||||||
|
:statusNames="{
|
||||||
|
started: 'processing',
|
||||||
|
disable: 'error',
|
||||||
|
}"
|
||||||
|
:disabled="slotProps.state?.value === 'disable'"
|
||||||
|
>
|
||||||
|
<template #type>
|
||||||
|
<span
|
||||||
|
><img
|
||||||
|
:height="16"
|
||||||
|
:src="
|
||||||
|
typeMap.get(slotProps.triggerType)?.icon
|
||||||
|
"
|
||||||
|
style="margin-right: 5px"
|
||||||
|
/>{{
|
||||||
|
typeMap.get(slotProps.triggerType)?.text
|
||||||
|
}}</span
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
<template #img>
|
||||||
|
<img
|
||||||
|
:src="typeMap.get(slotProps.triggerType)?.img"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<Ellipsis style="width: calc(100% - 100px)">
|
||||||
|
<span style="font-size: 16px; font-weight: 600">
|
||||||
|
{{ slotProps.name }}
|
||||||
|
</span>
|
||||||
|
</Ellipsis>
|
||||||
|
<Ellipsis :lineClamp="2">
|
||||||
|
<div class="subTitle">
|
||||||
|
说明:{{
|
||||||
|
slotProps?.description ||
|
||||||
|
typeMap.get(slotProps.triggerType)?.tip
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</Ellipsis>
|
||||||
|
</template>
|
||||||
|
</CardBox>
|
||||||
|
</template>
|
||||||
|
</JProTable>
|
||||||
|
</div>
|
||||||
|
</j-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { getImage, onlyMessage } from '@/utils/comm';
|
||||||
|
import { query } from '@/api/rule-engine/scene';
|
||||||
|
import { _execute } from '@/api/rule-engine/configuration';
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: '名称',
|
||||||
|
dataIndex: 'name',
|
||||||
|
key: 'name',
|
||||||
|
search: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '触发方式',
|
||||||
|
dataIndex: 'triggerType',
|
||||||
|
key: 'triggerType',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态',
|
||||||
|
dataIndex: 'state',
|
||||||
|
key: 'state',
|
||||||
|
search: {
|
||||||
|
type: 'select',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
label: '正常',
|
||||||
|
value: 'started',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '禁用',
|
||||||
|
value: 'disable',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const terms = [
|
||||||
|
{
|
||||||
|
terms: [
|
||||||
|
{
|
||||||
|
column: 'id',
|
||||||
|
termType: 'alarm-bind-rule',
|
||||||
|
value: props.data?.id,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
column: 'triggerType',
|
||||||
|
termType: 'eq',
|
||||||
|
value: props.data?.sceneTriggerType,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
type: 'and',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const params = ref();
|
||||||
|
|
||||||
|
const typeMap = new Map();
|
||||||
|
typeMap.set('manual', {
|
||||||
|
text: '手动触发',
|
||||||
|
img: getImage('/scene/scene-hand.png'),
|
||||||
|
icon: getImage('/scene/trigger-type-icon/manual.png'),
|
||||||
|
tip: '适用于第三方平台向物联网平台下发指令控制设备',
|
||||||
|
});
|
||||||
|
|
||||||
|
const _selectedRowKeys = ref<string[]>([]);
|
||||||
|
|
||||||
|
const handleClick = (dt: any) => {
|
||||||
|
if(dt.state?.value === 'disable') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (_selectedRowKeys.value.includes(dt.id)) {
|
||||||
|
const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id);
|
||||||
|
_selectedRowKeys.value.splice(_index, 1);
|
||||||
|
} else {
|
||||||
|
_selectedRowKeys.value = [..._selectedRowKeys.value, dt.id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 取消选择事件
|
||||||
|
*/
|
||||||
|
const onSelectChange = () => {
|
||||||
|
_selectedRowKeys.value = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSearch = (e: any) => {
|
||||||
|
params.value = e;
|
||||||
|
};
|
||||||
|
const emit = defineEmits(['close', 'save']);
|
||||||
|
/**
|
||||||
|
* 保存选中关联场景
|
||||||
|
*/
|
||||||
|
const saveCorrelation = async () => {
|
||||||
|
if (_selectedRowKeys.value.length > 0) {
|
||||||
|
const scene = _selectedRowKeys.value.map((i) => {
|
||||||
|
return { id: i };
|
||||||
|
});
|
||||||
|
_execute(scene).then((res) => {
|
||||||
|
if (res.status === 200) {
|
||||||
|
onlyMessage('操作成功');
|
||||||
|
emit('save');
|
||||||
|
} else {
|
||||||
|
onlyMessage('操作失败', 'error');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
onlyMessage('请选择至少一条数据', 'error');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const closeModal = () => {
|
||||||
|
emit('close');
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.subTitle {
|
||||||
|
color: rgba(0, 0, 0, 0.65);
|
||||||
|
font-size: 14px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -184,6 +184,7 @@
|
||||||
</FullPage>
|
</FullPage>
|
||||||
</div>
|
</div>
|
||||||
</page-container>
|
</page-container>
|
||||||
|
<HandTrigger @save="onSave" @close="visible = false" v-if="visible" :data="current" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
@ -192,7 +193,6 @@ import {
|
||||||
_enable,
|
_enable,
|
||||||
_disable,
|
_disable,
|
||||||
remove,
|
remove,
|
||||||
_execute,
|
|
||||||
getScene,
|
getScene,
|
||||||
} from '@/api/rule-engine/configuration';
|
} from '@/api/rule-engine/configuration';
|
||||||
import { queryLevel } from '@/api/rule-engine/config';
|
import { queryLevel } from '@/api/rule-engine/config';
|
||||||
|
@ -201,6 +201,8 @@ import type { ActionsType } from '@/components/Table/index.vue';
|
||||||
import { getImage, onlyMessage } from '@/utils/comm';
|
import { getImage, onlyMessage } from '@/utils/comm';
|
||||||
import { useMenuStore } from '@/store/menu';
|
import { useMenuStore } from '@/store/menu';
|
||||||
import encodeQuery from '@/utils/encodeQuery';
|
import encodeQuery from '@/utils/encodeQuery';
|
||||||
|
import HandTrigger from './HandTrigger/index.vue';
|
||||||
|
|
||||||
const params = ref<Record<string, any>>({});
|
const params = ref<Record<string, any>>({});
|
||||||
let isAdd = ref<number>(0);
|
let isAdd = ref<number>(0);
|
||||||
let title = ref<string>('');
|
let title = ref<string>('');
|
||||||
|
@ -331,6 +333,9 @@ const columns = [
|
||||||
scopedSlots: true,
|
scopedSlots: true,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const current = ref<any>({});
|
||||||
|
|
||||||
const map = {
|
const map = {
|
||||||
product: '产品',
|
product: '产品',
|
||||||
device: '设备',
|
device: '设备',
|
||||||
|
@ -382,23 +387,9 @@ const getActions = (
|
||||||
? '未启用,不能手动触发'
|
? '未启用,不能手动触发'
|
||||||
: '手动触发',
|
: '手动触发',
|
||||||
},
|
},
|
||||||
popConfirm: {
|
onClick: () => {
|
||||||
title: '确定手动触发?',
|
visible.value = true;
|
||||||
onConfirm: async () => {
|
current.value = data
|
||||||
const scene = (data.scene || [])
|
|
||||||
.filter((item: any) => item?.triggerType === 'manual')
|
|
||||||
.map((i) => {
|
|
||||||
return { id: i?.id };
|
|
||||||
});
|
|
||||||
_execute(scene).then((res) => {
|
|
||||||
if (res.status === 200) {
|
|
||||||
onlyMessage('操作成功');
|
|
||||||
tableRef.value?.reload();
|
|
||||||
} else {
|
|
||||||
onlyMessage('操作失败', 'error');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
icon: 'LikeOutlined',
|
icon: 'LikeOutlined',
|
||||||
},
|
},
|
||||||
|
@ -479,6 +470,10 @@ const getActions = (
|
||||||
(item) => item.key != 'tigger' || data.sceneTriggerType == 'manual',
|
(item) => item.key != 'tigger' || data.sceneTriggerType == 'manual',
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
const onSave = () => {
|
||||||
|
visible.value = false;
|
||||||
|
tableRef.value?.reload();
|
||||||
|
}
|
||||||
const add = () => {
|
const add = () => {
|
||||||
menuStory.jumpPage('rule-engine/Alarm/Configuration/Save');
|
menuStory.jumpPage('rule-engine/Alarm/Configuration/Save');
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,7 +59,6 @@ import { detail as configurationDetail } from '@/api/rule-engine/configuration';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import type { ActionsType } from '@/components/Table/index.vue';
|
import type { ActionsType } from '@/components/Table/index.vue';
|
||||||
import { message } from 'jetlinks-ui-components';
|
|
||||||
import { useAlarmStore } from '@/store/alarm';
|
import { useAlarmStore } from '@/store/alarm';
|
||||||
import Info from './info.vue';
|
import Info from './info.vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|
|
@ -260,7 +260,6 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import PermissionButton from '@/components/PermissionButton/index.vue';
|
import PermissionButton from '@/components/PermissionButton/index.vue';
|
||||||
import { FormInstance } from 'ant-design-vue';
|
import { FormInstance } from 'ant-design-vue';
|
||||||
import { message } from 'jetlinks-ui-components';
|
|
||||||
import ChooseIconDialog from '../components/ChooseIconDialog.vue';
|
import ChooseIconDialog from '../components/ChooseIconDialog.vue';
|
||||||
import PermissChoose from '../components/PermissChoose.vue';
|
import PermissChoose from '../components/PermissChoose.vue';
|
||||||
import {
|
import {
|
||||||
|
|
|
@ -24,8 +24,13 @@
|
||||||
v-for="item in dataSource"
|
v-for="item in dataSource"
|
||||||
:key="item.provider"
|
:key="item.provider"
|
||||||
class="custom"
|
class="custom"
|
||||||
:header="item.name"
|
|
||||||
>
|
>
|
||||||
|
<template #header>
|
||||||
|
<div>
|
||||||
|
{{ item.name }}
|
||||||
|
<span style="margin-left: 10px;" class="alert" v-if="item.provider === 'alarm'">注意:接收人需要有告警配置页面查询权限,才能收到告警类通知</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<div class="child">
|
<div class="child">
|
||||||
<template
|
<template
|
||||||
v-for="(child, index) in item.children"
|
v-for="(child, index) in item.children"
|
||||||
|
|
Loading…
Reference in New Issue