You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

565 lines
17 KiB

<template>
<a-spin :spinning="isLoading">
<!-- 照明区域 -->
<div>
<div class="light-area">
<div class="light-area-tab"></div>
<span class="light-area-text"> 照明区域 </span>
<button class="plan" :class="{ enabled: isPlanEnabled, disabled: !isPlanEnabled }" @click="togglePlan">
{{ isPlanEnabled ? '计划启用' : '计划禁用' }}
</button>
</div>
<!-- 照明区域按钮部分 -->
<div class="area">
<template v-if="!showAllButtonsArea">
<button v-for="(button, index) in limitedButtons1" :key="index"
:class="{ btn: true, selected: button.selected }" @click="selectButton(button)">
{{ button.name }}
</button>
<div style="margin-top: 10px">
<span @click="showAllButtonsArea = true" class="openzm"><down-outlined /> 展开</span>
</div>
</template>
<template v-else>
<button v-for="(button, index) in props.treeData" :key="index" :class="{ btn: true, selected: button.selected }"
@click="selectButton(button)">
{{ button.name }}
</button>
<div style="margin-top: 10px">
<span @click="showAllButtonsArea = false" class="openzm"><up-outlined /> 回缩</span>
</div>
</template>
</div>
</div>
<!-- 照明回路部分 -->
<div>
<div class="circuit-area">
<div class="circuit-tab"></div>
<span class="circuit-text">照明回路</span>
<div class="btn2">
<button class="openPlan" :class="{ enabled2: isPlanEnabled2, disabled2: !isPlanEnabled2 }" @click="togglePlan2">
{{ isPlanEnabled2 ? '启用面板' : '禁用面板' }}
</button>
<a-switch v-model:checked="selectAllCheckbox" :disabled="singleSelection" :class="{
'blue-background': selectAllCheckbox,
'grey-background': !selectAllCheckbox,
}" @change="toggleAllSelection" />
<button class="allBtn">全选</button>
<button class="both" @click="selectAll">
{{ singleSelection ? '多选' : '单选' }}
</button>
</div>
</div>
<div class="btnArea">
<template v-if="!showAllButtons">
<button v-for="(button, index) in limitedButtons2" :key="index"
:class="{ btn: true, selected: button.selected }" class="zmhlbtn" @click="toggleSelection(button)">
<stop-outlined v-if="button.ctrlStatus" />
{{ button.name }}
</button>
<div style="margin-top: 10px">
<span @click="showAllButtons = true" class="openzm"><down-outlined /> 展开</span>
</div>
</template>
<template v-else>
<button v-for="(button, index) in buttons2" :key="index"
:class="{ btn: true, selected: button.selected }" class="zmhlbtn" @click="toggleSelection(button)">
<stop-outlined v-if="button.ctrlStatus" />
{{ button.name }}
</button>
<div style="margin-top: 10px">
<span @click="showAllButtons = false" class="openzm"><up-outlined /> 回缩</span>
</div>
</template>
</div>
</div>
<!-- 控制模式部分 -->
<div>
<div class="control-area" v-show="thisButton2.code">
<div class="control-tab"></div>
<span class="control-text"> 控制模式 </span>
</div>
<!-- 控制模式按钮部分 -->
<div class="control-mode-btn-area" v-show="thisButton2.code">
<button v-for="(button3, index) in controlMode" :key="index"
class="btn"
:disabled="button3.value!= 3"
:class="{ selected: thisButton2.mode.value == button3.value }" @click="selectButton3(button3)">
{{ button3.label }}
</button>
</div>
</div>
<!-- 控制场景部分 -->
<div>
<div class="control-scene-area" v-show="thisButton2.mode.value == '3'">
<div class="control-scene-tab"></div>
<span class="control-scene-text"> 控制场景 </span>
</div>
<!-- 控制场景按钮部分 -->
<div class="control-scene-btn-area" v-show="thisButton2.mode.value == '3'">
<button v-for="(button4, index) in controlScene" :key="index"
:class="{ btn: true, selected: thisButton2.mode.value == button4.value }" @click="selectButton4(button4)">
{{ button4.label }}
</button>
</div>
</div>
<!-- 底部按钮区 -->
<div class="bottom">
<a-popconfirm
title="刷新将会取消已作出的修改"
ok-text="确定"
cancel-text="取消"
@confirm="changeConfirm"
@cancel="changeCancel"
>
<button class="flushed">刷新</button>
</a-popconfirm>
<button class="execute" @click="showModal">执行</button>
</div>
<!-- 点击执行时的弹出框 -->
<div class="out-dialog" v-if="executeVisible">
<div class="content" v-if="executeVisible">
<div>
<div class="div-operation"></div>
<span class="text-operation">变更内容 </span>
</div>
<div class="j-box" v-for="item in cxList" :key="item.id">
<div class="journal" style="margin-top: 20px">
<div class="imgText">
<div class="zjzm">
<img class="title-img" src="/asset/image//bulbLogo/21961.png" alt="" />&nbsp;
<span class="title-text" style="font-size: 20px; font-weight: 500; color: rgba(255, 255, 255, 1)">{{ item.name }}</span>
</div>
<button class="cxbtn" @click="delBtn(item.id)">撤销</button>
</div>
<div class="btn-box">
<div class="btn-item">
<div class="left">控制模式</div>
<div class="right">
<span>手动</span>
<img src="/asset/image/bulbLogo/22406.png" alt="" />
<span>自动</span>
</div>
</div>
<div class="btn-item">
<div class="left">
亮度
</div>
<div class="right">
<span>100lux</span>
<img src="/asset/image/bulbLogo/22406.png" alt="" />
<span>30lux</span>
</div>
</div>
<div class="btn-item">
<div class="left">
控制场景
</div>
<div class="right">
<span>手动</span>
<img src="/asset/image/bulbLogo/22406.png" alt="" />
<span>自动</span>
</div>
</div>
<div class="btn-item">
<div class="left">
色温
</div>
<div class="right">
<span>4000k</span>
<img src="/asset/image/bulbLogo/22406.png" alt="" />
<span>3800k</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="width: 100%; height: 60px;"></div>
<div class="button-box">
<button class="cancel" @click="executeVisible = false">取消</button>
<button class="execute">执行</button>
</div>
</div>
</a-spin>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, watch } from 'vue';
import {
DownOutlined,
UpOutlined,
StopOutlined,
} from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
// 请求
import { http } from '/nerv-lib/util/http';
import { lightingManage } from '/@/api/IlluminationInfo';
import { getAllEnum } from '/@/api/index'
// 初始化 =========================================================================
onMounted(() => {
// 设置分区
setArea(0)
// 获得枚举
getEnum(['IlluminationMode', 'IlluminationScene'])
})
// 获得枚举,初始化
const getEnum = (arr: any) => {
getAllEnum({ params: arr }).then(res => {
const data = res.data
controlMode.value = data.IlluminationMode
controlScene.value = data.IlluminationScene
})
}
// 父组件点击俯视图切换分区时,子组件切换线路
const setArea = (isHandle: number) => {
const data = props.treeData.find((item: any) => {
return item.id == props.nowArea
})
// 默认选中第一个分区
data.selected = true
// 修改当前选中的分区
selectedButton.value = props.nowArea
// 设置当前显示的回路
buttons2.value = data.childList
// 如果非初始化触发(点击俯视图)
if (isHandle) {
// 如果选中了线路则children中的某个selected为true
const button2 = data.childList.find((item: any) => {
return item.selected == true
})
// 如果选中了线路
if (button2) {
thisButton2.value = button2;
console.log(button2,'2222222222')
} else {
resetMode()
}
}
}
// 与父组件的交互 ===================================================================
const props = defineProps({
// 分区结构(照明区域 > 照明回路)
treeData: {
type: Array,
default: []
},
// 父组件选中的分区ID
nowArea: {
type: String,
}
});
// 向上传递修改选择样式
/**
* @method changeArea 用于控制俯视图的选中状态
* @method reset 用于重置按钮区
*/
const emit = defineEmits(['changeArea','reset']);
// 监听父组件选中的分区,并实时修改分区
watch(() => props.nowArea, () => {
setArea(1)
// 分区产生了切换, 线路的选中状态置空
handleButton.value = ''
})
// 照明区域业务 =======================================================================
// 计划启用状态
const isPlanEnabled = ref(false);
// 计划启用切换事件
const togglePlan = () => {
isPlanEnabled.value = !isPlanEnabled.value;
};
// 按钮区展开与收起状态
const showAllButtonsArea = ref(false);
// 被选中的分区 默认为1
const selectedButton = ref<string | undefined>('1');
// 区域切换(按钮点击-单选)事件
const selectButton = (button: any) => {
// 当前选中按钮
selectedButton.value = button.id;
initMenu(1)
button.selected = true
buttons2.value = button.childList
emit('changeArea', button.id);
resetMode()
handleButton.value = ''
};
// 默认最多展示8个按钮
const limitedButtons1 = computed(() => props.treeData.slice(0, 8));
// 照明回路业务 ======================================================================
// 最近交互过的按钮id,用于禁用和启用
const handleButton = ref('');
// 面板启用/禁用状态
const isPlanEnabled2 = ref(true);
// 面板启用/禁用切换事件
const togglePlan2 = () => {
// 如果未交互任何按钮
if (handleButton.value == '') {
return message.info('请选择照明回路');
}
// 获取最近交互过的按钮
const btn: any = buttons2.value.find((button) => button.id === handleButton.value)
let panel = +(!btn.ctrlStatus)
isLoading.value = true
http.get(lightingManage.setDisable, { deviceGroup: btn.code, panel }).then(res => {
if (res.msg === 'success') {
// 确认成功后 - 按钮文本取反 - 按钮布尔值修改 - 关闭loading
isPlanEnabled2.value = !isPlanEnabled2.value;
btn.ctrlStatus = panel
isLoading.value = false
} else {
isLoading.value = false
}
}).catch(() => { isLoading.value = false })
};
// 是否单选,状态
let singleSelection = ref(true);
// 多选与单选切换事件
const selectAll = () => {
selectAllCheckbox.value = false
buttons2.value.forEach((button) => {
button.selected = false;
});
singleSelection.value = !singleSelection.value;
resetMode()
emit('changeArea', [selectedButton.value])
};
// 全选状态
const selectAllCheckbox = ref(false);
// 全选切换事件(switch)
const toggleAllSelection = () => {
let arr = [selectedButton.value]
// 全选
if (selectAllCheckbox.value) {
buttons2.value.forEach((item) => {
item.selected = true;
arr.push(item.id)
});
// 全不选
} else {
buttons2.value.forEach((item) => {
item.selected = false;
});
}
emit('changeArea', arr)
};
// 照明回路的按钮切换
const toggleSelection = (button: any) => {
// 存储一次按钮ID,用于禁用/启用交互
handleButton.value = button.id
// 根据按钮状态,展示禁用/启用按钮文本
if (button.ctrlStatus) {
isPlanEnabled2.value = true
} else {
isPlanEnabled2.value = false
}
// 选择时反控俯视图
let level1 = selectedButton.value
let level2 = button.id
// 单选模式,需将所有按钮设为false
if (singleSelection.value) {
buttons2.value.forEach(item => {
item.selected = false;
});
emit('changeArea', [level1, level2])
button.selected = !button.selected;
} else {
// 多选模式传值
button.selected = !button.selected;
const arr = [level1]
buttons2.value.forEach(item => {
if (item.selected) {
arr.push(item.id)
}
});
emit('changeArea', arr)
}
// 用于展示控制模式
if (button.selected) {
// 发生了选中事件
thisButton2.value = button
} else {
// 未发生选中 或 多选被取消
resetMode()
}
console.log(thisButton2,'button')
};
// 照明回路所有按钮
const buttons2 = ref([]);
// 按钮区展开与收起状态
const showAllButtons = ref(false);
// 默认最多展示8个按钮
const limitedButtons2 = computed(() => buttons2.value.slice(0, 8));
// 控制模式业务 ====================================================================
const thisButton2 = ref({
code: '',
mode: {
value: '0'
}
})
// 控制模式 - 按钮切换
const selectButton3 = (button3) => {
let checked = thisButton2.value.mode
console.log(button3.value,'---', checked.value)
// 如果点击了相同的按钮,未作出修改
if (checked.value === button3.value) {
return
}
checked.value = button3.value
selectedButton4.value = null; // 清空选中的控制场景按钮
};
const diff = () => {
console.log(thisButton2)
}
// 控制场景业务 =====================================================================
// 控制模式枚举
const controlMode = ref([])
// 场景枚举
const controlScene = ref([])
// 控制场景 - 当前选择按钮
const selectedButton4 = ref(null);
// 控制场景 - 按钮切换
const selectButton4 = (button4) => {
selectedButton4.value = button4.label;
};
// 内侧弹窗 ========================================================================
// 需要向后端提交的修改内容
const submitArray = ref([])
const cxList = ref([
{
id: '1',
name: '站厅照明 1区',
manual: '手动',
automatic: '自动',
brightness: '100lux',
brightness2: '30lux',
manual2: '手动',
automatic2: '自动',
brightness3: '4000k',
brightness4: '3800k',
},
{
id: '2',
name: '站厅照明 2区',
manual: '手动',
automatic: '自动',
brightness: '100lux',
brightness2: '30lux',
manual2: '手动',
automatic2: '自动',
brightness3: '4000k',
brightness4: '3800k',
},
{
id: '3',
name: '站厅照明 3区',
manual: '手动',
automatic: '自动',
brightness: '100lux',
brightness2: '30lux',
manual2: '手动',
automatic2: '自动',
brightness3: '4000k',
brightness4: '3800k',
},
]);
//撤销
const delBtn = (id: any) => {
cxList.value.pop();
console.log(cxList.value.length);
if (cxList.value.length === 0) {
executeVisible.value = false;
}
};
// 其他业务 ========================================================================
const isLoading = ref(false)
// 用于初始化5级联动的菜单
const initMenu = (tier: number) => {
// 1 = 照明区域 - 切换时,重置以下所有菜单
if (tier == 1) {
emit('reset')
// 灯具参数 隐藏
selectedButton4.value = null;
} else if (tier == 2) {
// 灯具参数 隐藏
selectedButton4.value = null;
}
}
// 刷新
const refresh = () => {
// 关闭执行弹窗
executeVisible.value = false
// 设置当前选中的序列
selectedButton.value = '1';
emit('changeArea', ['1']);
emit('reset')
let data = props.treeData[0]
// 默认选中
data.selected = true
buttons2.value = data.childList
selectedButton4.value = null;
resetMode()
};
// 执行确认
const executeVisible = ref<boolean>(false);
const showModal = () => {
executeVisible.value = true;
};
// 确定
const changeConfirm = () => {
refresh()
}
// 取消
const changeCancel = () => {
}
// 将当前选择的线路置空
const resetMode = () => {
thisButton2.value = {
code: '',
mode: {
value: '0'
}
}
}
defineExpose({
changeCancel
});
</script>
<style lang="less" scoped>
@import "./dialogStyle.less";
@import "./tabs1.less";
</style>