fix: bug#17421,17418,17417,17416,17392
* fix: 登录加密 * fix: 登录加密功能 * fix: 树样式错乱bug修改 * fix: bug#17059 * fix: bug#17128 * fix: 17131 * fix: bug#17122 * fix: bug#17156 * fix: 修改bug * fix: bug#17056 * fix: bug#17005 * fix: 修改bug * fix: bug#17296 * fix: bug应用管理/集成菜单 * fix: bug#17299 * fix: bug#17148 * fix: bug#17392 * fix: bug#17416 * fix: bug#17417 * fix: bug#17418 * fix: bug#17421
This commit is contained in:
parent
c2d30f56a7
commit
6eeed06171
|
@ -10,7 +10,7 @@
|
|||
>
|
||||
</j-select>
|
||||
<j-popconfirm-modal
|
||||
v-if="myValue != 'manual'"
|
||||
v-if="myValue != 'manual' && props.target === 'product'"
|
||||
:bodyStyle="{
|
||||
width: '450px',
|
||||
height: myValue === 'rule' ? '300px' : '80px',
|
||||
|
@ -37,6 +37,56 @@
|
|||
<AIcon type="EditOutlined" />
|
||||
</j-button>
|
||||
</j-popconfirm-modal>
|
||||
<j-dropdown v-if="myValue != 'manual'&& target === 'device'" :getPopupContainer="(triggerNode) => triggerNode.parentNode">
|
||||
<span style="width: 20px;" @click.prevent>
|
||||
<AIcon type="MoreOutlined" />
|
||||
</span>
|
||||
<template #overlay>
|
||||
<j-menu>
|
||||
<j-menu-item>
|
||||
<j-popconfirm-modal
|
||||
:bodyStyle="{
|
||||
width: '450px',
|
||||
height: myValue === 'rule' ? '300px' : '80px',
|
||||
}"
|
||||
:get-popup-container="(node) => fullRef || node"
|
||||
placement="bottomRight"
|
||||
@confirm="confirm"
|
||||
@visibleChange="visibleChange"
|
||||
>
|
||||
<template #content>
|
||||
<j-scrollbar v-if="myValue">
|
||||
<div style="padding: 0 10px">
|
||||
<VirtualRule
|
||||
v-if="visible"
|
||||
:value="value"
|
||||
:source="myValue"
|
||||
:dataSource="dataSource"
|
||||
ref="virtualRuleRef"
|
||||
/>
|
||||
</div>
|
||||
</j-scrollbar>
|
||||
</template>
|
||||
<j-button style="padding: 4px 8px" type="link">
|
||||
编辑
|
||||
</j-button>
|
||||
</j-popconfirm-modal>
|
||||
</j-menu-item>
|
||||
<j-menu-divider/>
|
||||
<j-menu-item>
|
||||
<div style="display: flex;">
|
||||
<j-button style="padding: 4px 8px" type="link" @click="resetRules">
|
||||
重置
|
||||
</j-button>
|
||||
<j-tooltip>
|
||||
<template #title>重置为产品属性规则</template>
|
||||
<AIcon type="QuestionCircleOutlined" style="margin-top: 10px;"/>
|
||||
</j-tooltip>
|
||||
</div>
|
||||
</j-menu-item>
|
||||
</j-menu>
|
||||
</template>
|
||||
</j-dropdown>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -45,7 +95,12 @@ import { isNoCommunity } from '@/utils/utils';
|
|||
import VirtualRule from './VirtualRule/index.vue';
|
||||
import { Form } from 'jetlinks-ui-components';
|
||||
import { FULL_CODE } from 'jetlinks-ui-components/es/DataTable'
|
||||
|
||||
import { useInstanceStore } from '@/store/instance';
|
||||
import {
|
||||
queryProductVirtualProperty
|
||||
} from '@/api/device/product';
|
||||
import { updata } from '@/api/rule-engine/configuration';
|
||||
const instanceStore = useInstanceStore();
|
||||
const PropertySource: { label: string; value: string }[] = isNoCommunity
|
||||
? [
|
||||
{
|
||||
|
@ -115,7 +170,6 @@ const disabled = computed(() => {
|
|||
// if (props.target === 'device') {
|
||||
// return true;
|
||||
// }
|
||||
|
||||
return props.noEdit?.length
|
||||
? props.noEdit.includes(props.value.id) && props?.target === 'device'
|
||||
: false;
|
||||
|
@ -156,7 +210,20 @@ const confirm = async () => {
|
|||
}
|
||||
});
|
||||
};
|
||||
|
||||
//重置规则
|
||||
const resetRules = async() =>{
|
||||
let res:any = await queryProductVirtualProperty(instanceStore.current?.productId,props.value.id)
|
||||
if(res && res.status === 200 && res.result.rule){
|
||||
const data:any = {}
|
||||
data.virtualRule = res.result.rule
|
||||
data.virtualRule.triggerProperties = res.result.triggerProperties
|
||||
data.type = type.value
|
||||
updateValue({
|
||||
source:myValue.value,
|
||||
...data
|
||||
})
|
||||
}
|
||||
}
|
||||
const cancel = () => {
|
||||
if (props.value.id && !props.value?.expands?.source) {
|
||||
myValue.value = 'device';
|
||||
|
|
|
@ -581,6 +581,7 @@ const handleImport = async () => {
|
|||
if (data.metadata === 'alink') {
|
||||
try {
|
||||
const _import = JSON.parse(data.import);
|
||||
|
||||
loading.value = true;
|
||||
const res = await convertMetadata(
|
||||
'from',
|
||||
|
@ -588,7 +589,8 @@ const handleImport = async () => {
|
|||
_import,
|
||||
).catch((err) => err);
|
||||
if (res.status === 200) {
|
||||
const metadata = operateLimits(res.result);
|
||||
// const metadata = operateLimits(res.result); // 导入取并集逻辑
|
||||
const metadata = res.result
|
||||
let result;
|
||||
if (props?.type === 'device') {
|
||||
result = await saveMetadata(
|
||||
|
@ -644,14 +646,15 @@ const handleImport = async () => {
|
|||
return;
|
||||
}
|
||||
const { id } = route.params || {};
|
||||
const copyOperateLimits = operateLimits(
|
||||
_object as DeviceMetadata,
|
||||
);
|
||||
// const copyOperateLimits = operateLimits(
|
||||
// _object as DeviceMetadata,
|
||||
// );
|
||||
// console.log(copyOperateLimits,_object); // 导入取并集逻辑
|
||||
const params = {
|
||||
id,
|
||||
metadata: JSON.stringify(copyOperateLimits),
|
||||
metadata: JSON.stringify(_object),
|
||||
};
|
||||
const paramsDevice = copyOperateLimits;
|
||||
const paramsDevice = _object;
|
||||
let resp = undefined;
|
||||
loading.value = true;
|
||||
if (props?.type === 'device') {
|
||||
|
|
|
@ -81,7 +81,6 @@ provide('_metadataType', props.type)
|
|||
|
||||
const showReset = computed(() => {
|
||||
if (props.type === 'device' && instanceStore.current.productMetadata) {
|
||||
console.log(instanceStore.current,123)
|
||||
const proMetadata = JSON.parse(instanceStore.current.productMetadata || '{}')
|
||||
const _metadata = JSON.parse(instanceStore.current.metadata || '{}')
|
||||
return !isEqual(_metadata, proMetadata)
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
props.data?.alarmConfigName
|
||||
}}</j-descriptions-item>
|
||||
<j-descriptions-item label="告警时间" :span="1">{{
|
||||
dayjs(data?.alarmTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
dayjs(props.data?.alarmTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
}}</j-descriptions-item>
|
||||
<j-descriptions-item label="告警级别" :span="1">
|
||||
<j-tooltip
|
||||
|
|
|
@ -285,7 +285,58 @@ const newColumns = computed(() => {
|
|||
otherColumns.title = '场景名称'
|
||||
break;
|
||||
}
|
||||
if(props.type === 'device'){
|
||||
const productColumns = {
|
||||
title: '产品名称',
|
||||
dataIndex: 'product_id',
|
||||
key: 'product_id',
|
||||
search: {
|
||||
type: 'select',
|
||||
options: async () => {
|
||||
const termType = [
|
||||
{
|
||||
column: "targetType",
|
||||
termType: "eq",
|
||||
type: "and",
|
||||
value: "product",
|
||||
}
|
||||
]
|
||||
|
||||
if (props.id) {
|
||||
termType.push({
|
||||
termType: 'eq',
|
||||
column: 'alarmConfigId',
|
||||
value: props.id,
|
||||
type: 'and',
|
||||
},)
|
||||
}
|
||||
|
||||
const resp: any = await handleSearch({
|
||||
sorts: [{ name: 'alarmTime', order: 'desc' }],
|
||||
terms: termType
|
||||
});
|
||||
const listMap: Map<string, any> = new Map()
|
||||
|
||||
if (resp.status === 200) {
|
||||
resp.result.data.forEach(item => {
|
||||
if (item.targetId) {
|
||||
listMap.set(item.targetId, {
|
||||
label: item.targetName,
|
||||
value: item.targetId,
|
||||
})
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
return [...listMap.values()]
|
||||
|
||||
}
|
||||
return [];
|
||||
},
|
||||
},
|
||||
}
|
||||
return [otherColumns,productColumns,...columns]
|
||||
}
|
||||
return ['all', 'detail'].includes(props.type) ? columns : [
|
||||
otherColumns,
|
||||
...columns,
|
||||
|
@ -297,9 +348,9 @@ let params: any = ref({
|
|||
terms: [],
|
||||
});
|
||||
const handleSearch = async (params: any) => {
|
||||
const resp = await query(params);
|
||||
const resp:any = await query(params);
|
||||
if (resp.status === 200) {
|
||||
const res = await getOrgList();
|
||||
const res:any = await getOrgList();
|
||||
if (res.status === 200) {
|
||||
resp.result.data.map((item: any) => {
|
||||
if (item.targetType === 'org') {
|
||||
|
@ -318,7 +369,7 @@ const handleSearch = async (params: any) => {
|
|||
}
|
||||
}
|
||||
};
|
||||
watchEffect(() => {
|
||||
onMounted(() => {
|
||||
if (props.type !== 'all' && !props.id) {
|
||||
params.value.terms = [
|
||||
{
|
||||
|
@ -354,6 +405,16 @@ const search = (data: any) => {
|
|||
type: 'and',
|
||||
});
|
||||
}
|
||||
if(props.type === 'device' && data?.terms[0]?.terms[0]?.column === 'product_id'){
|
||||
params.value.terms = [{
|
||||
column:"targetId$dev-instance",
|
||||
value:[
|
||||
data?.terms[0]?.terms[0]
|
||||
]
|
||||
}]
|
||||
// delete params.value.terms
|
||||
console.log(params.value)
|
||||
}
|
||||
if (props.id) {
|
||||
params.value.terms.push({
|
||||
termType: 'eq',
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
</j-radio-button>
|
||||
</j-radio-group>
|
||||
<j-range-picker
|
||||
:show-time="{format:'HH:mm:ss'}"
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
valueFormat="YYYY-MM-DD HH:mm:ss"
|
||||
style="margin-left: 12px"
|
||||
|
|
|
@ -357,7 +357,6 @@ getCurrentAlarm();
|
|||
const initQueryTime = (data: any) => {
|
||||
queryCodition.startTime = data.start;
|
||||
queryCodition.endTime = data.end;
|
||||
console.log(queryCodition);
|
||||
selectChange();
|
||||
};
|
||||
const selectChange = () => {
|
||||
|
@ -439,10 +438,14 @@ const selectChange = () => {
|
|||
res.result
|
||||
.filter((item: any) => item.group === 'alarmTrend')
|
||||
.forEach((item: any) => {
|
||||
if(time === '1d'){
|
||||
item.data.timeString = item.data.timeString.split(' ')[0]
|
||||
}
|
||||
xData.push(item.data.timeString);
|
||||
sData.push(item.data.value);
|
||||
});
|
||||
const maxY = sData.sort((a,b)=>{
|
||||
const data:any = JSON.parse(JSON.stringify(sData))
|
||||
const maxY = data.sort((a,b)=>{
|
||||
return b-a
|
||||
})[0]
|
||||
alarmStatisticsOption.value = {
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<div class="card-item-content-text">
|
||||
设备类型
|
||||
</div>
|
||||
<div>直连设备</div>
|
||||
<div>{{ slotProps.deviceType.text}}</div>
|
||||
</j-col>
|
||||
</j-row>
|
||||
</template>
|
||||
|
|
|
@ -1,39 +1,17 @@
|
|||
<template>
|
||||
<j-modal
|
||||
visible
|
||||
title="集成菜单"
|
||||
width="600px"
|
||||
@ok="handleOk"
|
||||
@cancel="cancel"
|
||||
class="edit-dialog-container"
|
||||
:confirmLoading="loading"
|
||||
>
|
||||
<j-select
|
||||
v-model:value="form.checkedSystem"
|
||||
@change="(value) => value && getTree(value)"
|
||||
style="width: 200px"
|
||||
placeholder="请选择集成系统"
|
||||
>
|
||||
<j-select-option
|
||||
v-for="item in form.systemList"
|
||||
:value="item.value"
|
||||
:key="item.value"
|
||||
>{{ item.label }}</j-select-option
|
||||
>
|
||||
<j-modal visible title="集成菜单" width="600px" @ok="handleOk" @cancel="cancel" class="edit-dialog-container"
|
||||
:confirmLoading="loading">
|
||||
<j-select v-model:value="form.checkedSystem" @change="(value) => value && getTree(value) " style="width: 200px"
|
||||
placeholder="请选择集成系统">
|
||||
<j-select-option v-for="item in form.systemList" :value="item.value" :key="item.value">{{ item.label
|
||||
}}</j-select-option>
|
||||
</j-select>
|
||||
|
||||
<p style="margin: 20px 0 0 0" v-show="form.menuTree.length > 0">
|
||||
当前集成菜单
|
||||
</p>
|
||||
<j-tree
|
||||
v-model:checkedKeys="form.checkedMenu"
|
||||
v-model:expandedKeys="form.expandedKeys"
|
||||
checkable
|
||||
:tree-data="form.menuTree"
|
||||
:fieldNames="{ key: 'code', title: 'name' }"
|
||||
@check="treeCheck"
|
||||
:height="300"
|
||||
>
|
||||
<j-tree v-model:checkedKeys="form.checkedMenu" v-model:expandedKeys="form.expandedKeys" checkable
|
||||
:tree-data="form.menuTree" :fieldNames="{ key: 'code', title: 'name' }" @check="treeCheck" :height="300">
|
||||
<template #title="{ name }">
|
||||
<span>{{ name }}</span>
|
||||
</template>
|
||||
|
@ -66,10 +44,12 @@ const props = defineProps<{
|
|||
// 弹窗相关
|
||||
const loading = ref(false);
|
||||
const handleOk = async () => {
|
||||
const items = filterTree(form.menuTree, [
|
||||
const menuTree = JSON.parse(JSON.stringify(form.menuTree));
|
||||
const items = filterTree(menuTree, [
|
||||
...form.checkedMenu,
|
||||
...form.half,
|
||||
// ...form.half,
|
||||
]);
|
||||
console.log(items);
|
||||
if (form.checkedSystem) {
|
||||
if (items && items.length !== 0) {
|
||||
loading.value = true;
|
||||
|
@ -128,6 +108,16 @@ function getTree(params: string) {
|
|||
form.expandedKeys = resp.result.map((item: any) => item?.code);
|
||||
});
|
||||
}
|
||||
|
||||
const getCheckMenu = (data: any, keys: any) => {
|
||||
data.forEach((item: any) => {
|
||||
if (item.children) {
|
||||
getCheckMenu(item.children, keys)
|
||||
} else {
|
||||
keys.push(item.code)
|
||||
}
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 获取当前用户可访问菜单
|
||||
*/
|
||||
|
@ -143,7 +133,9 @@ function getMenus(id: string) {
|
|||
getMenuTree_api(params).then((resp: any) => {
|
||||
if (resp.status === 200) {
|
||||
// form.menuTree = resp.result;
|
||||
const keys = resp.result.map((item: any) => item?.code) as string[];
|
||||
// const keys = resp.result.map((item: any) => item?.code) as string[];
|
||||
let keys: any = [];
|
||||
getCheckMenu(resp.result, keys)
|
||||
// form.expandedKeys = keys;
|
||||
form.checkedMenu = keys;
|
||||
}
|
||||
|
@ -170,10 +162,10 @@ function getSystemList(id: string) {
|
|||
|
||||
watch(() => props.data, (newVal: any) => {
|
||||
form.checkedSystem = newVal?.page.configuration?.checkedSystem
|
||||
if(form.checkedSystem){
|
||||
if (form.checkedSystem) {
|
||||
getTree(form.checkedSystem)
|
||||
}
|
||||
if(newVal?.id) {
|
||||
if (newVal?.id) {
|
||||
getSystemList(newVal?.id);
|
||||
getMenus(newVal?.id);
|
||||
}
|
||||
|
@ -188,17 +180,23 @@ function treeCheck(checkedKeys: any, e: CheckInfo) {
|
|||
}
|
||||
//过滤节点-默认带上父节点
|
||||
function filterTree(nodes: any[], list: any[]) {
|
||||
if (!nodes?.length) {
|
||||
return nodes;
|
||||
if (!nodes) {
|
||||
return [];
|
||||
}
|
||||
return nodes.filter((it) => {
|
||||
// 不符合条件的直接砍掉
|
||||
if (list.indexOf(it.code) <= -1) {
|
||||
return false;
|
||||
if (list.includes(it.code)) {
|
||||
return true
|
||||
} else if (it.children) {
|
||||
it.children = filterTree(it.children, list);
|
||||
return it.children.length
|
||||
}
|
||||
// if (list.indexOf(it.code) <= -1) {
|
||||
// return false;
|
||||
// }
|
||||
// 符合条件的保留,并且需要递归处理其子节点
|
||||
it.children = filterTree(it.children, list);
|
||||
return true;
|
||||
// it.children = filterTree(it.children, list);
|
||||
// return true;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -164,12 +164,14 @@ const search = debounce(() => {
|
|||
|
||||
function dig(_data: any[]): any {
|
||||
const pIds: string[] = [];
|
||||
expandedKeys.value = []
|
||||
if (!_data.length) return;
|
||||
_data.forEach((item) => {
|
||||
if (treeMap.has(item)) {
|
||||
const _item = treeMap.get(item);
|
||||
pIds.push(_item.parentId);
|
||||
treeArray.set(item, _item);
|
||||
expandedKeys.value.push(_item.id)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue