Files
smart_storage_app/uni_modules/luyj-tree/components/luyj-tree-item/luyj-tree-item.vue

312 lines
9.5 KiB
Vue
Raw Normal View History

2025-06-30 10:21:25 +08:00
<template>
<view class="container-list-item" >
2026-03-26 20:35:03 +08:00
<view class="content" @click="clickItem($event, item)" style="justify-content: space-between;">
2025-06-30 10:21:25 +08:00
<!-- 复选框 -->
<view class="checkbox" v-if="isCheckBox" @click.stop="clickBox($event , item)">
<i v-if="curChecked " :style="{'color' :checkActiveColor}"
class="iconfont icon-xuanzhong txt icon-selected" />
<i v-else :style="{'color': checkNoneColor}" class="iconfont icon-weixuanzhong txt" />
</view>
<!-- 复选框 -->
<!-- 单选框 -->
<view class="checkbox" v-else-if="isRadio" @click.stop="clickBox($event, item)">
<i v-if="curChecked" :style="{'color' :checkActiveColor}" class="txt iconfont icon-selected" />
<i v-else :style="{'color': checkNoneColor}" class="txt iconfont icon-weixuanzhong1" />
</view>
<!-- 单选框 -->
<!-- 自定义插槽body -->
<view :style="isCheck ?'left: 56rpx':'left: 16rpx'" class="slot">
<view v-if="item.name" class="value_box" style="height: 50rpx!important;display: flex;align-items: center;">
<view class="index" style="height: 50rpx;">
<image v-if="item.deviceType? item.deviceType.includes('pcs') : ''" :src="pcs" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('bms') : ''" :src="bms" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('stack') : ''" :src="cluster" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('storage_fire') : ''" :src="fire" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('pack') : ''" :src="pack" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('air_condition') : ''" :src="air" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('ele_meter') : ''" :src="unit" class="device-img"></image>
<image v-else-if="item.deviceType? item.deviceType.includes('emu') : ''" :src="emu" class="device-img"></image>
<image v-else :src="other" style="width: 50rpx;height: 50rpx;"></image>
<!-- {{item.deviceType}} -->
</view>
<view class="value">
{{item[sLabel]}}
</view>
</view>
</view>
<!-- 自定义插槽body -->
<view v-if="hasChildren" class="right" @click.stop="clickItemRight($event,item)"><i class="iconfont icon-z043" ></i></view>
</view>
</view>
</template>
<script>
import pcs from '@/static/aidex/device/pcs.png'
import bms from '@/static/aidex/device/bms.png'
import cluster from '@/static/aidex/device/cluster.png'
import air from '@/static/aidex/device/air.png'
import fire from '@/static/aidex/device/fire.png'
import emu from '@/static/aidex/device/emu.png'
import pack from '@/static/aidex/device/pack.png'
import unit from '@/static/aidex/device/unit.png'
import other from '@/static/aidex/device/other.png'
/**
* 无限极树的单项 item
* @description无限级数的单项item
* @property {Object} item 单项的值默认{}
* @property {Boolean} isCheck 判断是否可选 (默认false)
* @property {Boolean} 判断是否是否多选默认false isCheck为true时有效
* @property {String} checkActiveColor 选中状态下单选框/复选框的颜色 (默认#00AAFF)
* @property {String} checkNoneColor 未选中状态下单选框/复选框的颜色默认#B8B8B8)
* @property {Object} comparison 属性名称对照表
* @param {String} value 选中值对应列名称(默认value)
* @param {String} label 显示值对应列名称默认label
* @param {String} children 子级列对应名称默认children
* @return {Function} 点击当前项的执行方法
* @param {Object} item 当前项的值
* @return {Function} change 选中值变化时执行方法event.detail = {value: 是否选中}
*/
export default {
name: 'luyj-tree-item',
props: {
// 传入的数值
item: {
type: Object,
default: {}
},
index: {
type: Number,
default: 0
},
// 判断是否可选
isCheck: {
type: Boolean,
default: false
},
// 是否多选
multiple: {
type: Boolean,
default: false
},
// 是否选中状态
checked: {
type: Boolean,
default: false
},
// 是否只能选择叶子结点
nodes: {
type: false,
default: false
},
// 选中状态下单选框/复选框的颜色
checkActiveColor: {
type: String,
default: '#00AAFF'
},
// 未选中状态下单选框的颜色
checkNoneColor: {
type: String,
default: '#B8B8B8'
},
// 列名称对照表
comparison: {
type: Object,
default: () => {
return {
value: 'value', // 选中值
label: 'label', // 显示名称
children: 'children', // 子级名称
};
}
}
},
data() {
return {
sLabel: this.comparison.label ? this.comparison.label : 'label', // label值名称
sChildren: this.comparison.children ? this.comparison.children : 'children', // children值名称
curChecked: this.checked, //是否选中状态
formModel: undefined,
singleMinVolData: undefined,
singleMaxVolData: undefined,
pcs,
bms,
cluster,
air,
fire,emu,other,pack,unit
}
},
computed: {
/**
* 是否包含子级
*/
hasChildren: function() {
return Boolean(this.item) ? (Boolean(this.item[this.sChildren]) ? this.item[this.sChildren].length >
0 : false) : false;
},
/**
* 是否单选
*/
isRadio: function() {
return this.isCheck && !this.multiple && (!this.nodes || !this.hasChildren);
},
/**
* 是否多选
*/
isCheckBox: function() {
return this.isCheck && this.multiple && (!this.nodes || !this.hasChildren);
},
},
watch: {
// 监听列名对照表变化
comparison: {
handler: function(val) {
this.sLabel = this.comparison.label ? this.comparison.label : 'label';
this.sChildren = this.comparison.children ? this.comparison.children : 'children';
},
deep: true
},
// 是否选中状态
checked: function(val) {
this.curChecked = val;
},
item: {
handler(val) {
if (val) {
// this.getStatus()
this.$forceUpdate()
}
},
deep: true,
immediate: true
}
},
created() {
// this.getStatus()
},
methods: {
//获取状态
getStatus() {
if (this.item.deviceType) {
let params = {
colList: [],
srcId: this.item.srcId,
stationId: this.item.stationId
}
if (this.item.deviceType.includes('pcs')) { //舱
params.colList = ['runState']
} else if (this.item.deviceType.includes('emu')) {
//emu 总有功功率 总无功功率
params.colList = ['EMUPTotal', 'EMUQTotal']
} else if (this.item.deviceType.includes('stack')) {
// <!-- 簇 -->累计充电量,累计放电量
params.colList = ['cTotalChargePower', 'cTotalDisChargePower']
} else if (this.item.deviceType.includes('bms')) {
// 堆 累计充电量,累计放电量
params.colList = ['totalCharge', 'totalDischarge']
} else if (this.item.deviceType.includes('ele_meter')) {
// 电表 正向有功总电量 反向有功总电量
params.colList = ['totalCharge', 'totalDisCharge']
} else if (this.item.deviceType.includes('air_condition')) {
//空调 空调开关机:
params.colList = ['airconditionSwitchYX']
} else if (this.item.deviceType.includes('storage_fire')) {
//消防
} else if (this.item.deviceType.includes('pack')) { //组
//组 最高电压 最低电压
params.colList = ['singleMaxVolData', 'singleMinVolData']
}
if (params.colList.length > 0) {
if (this.item.deviceType.includes('pack')) {
this.GetPackTemperatureVoltageData(params)
} else {
this.GetNewValue(params)
}
}
}
},
GetPackTemperatureVoltageData(params) {
this.$u.api.deviceList.GetPackTemperatureVoltageData(params).then(res => {
this.singleMaxVolData = res.data.packData.csingleMaxVolData
this.singleMinVolData = res.data.packData.csingleMinVolData
this.$forceUpdate()
})
},
GetNewValue(params) {
this.$u.api.deviceList.GetNewValue(params).then(res => {
this.formModel = res.data
this.$forceUpdate()
})
},
/**
* @param {Object} e
* @param {Object} item
*/
clickItemRight: function(e, item) {
this.$emit("clickItemRight", item, this.hasChildren);
// 不包含下一级修改check值事件
if (!this.hasChildren && this.isCheck) {
this.clickBox(e);
}
},
/**
* @param {Object} e
* @param {Object} item
*/
clickItem: function(e, item) {
this.$emit("clickItem", item);
},
/**
* 点击单选框或复选框
* @param {Object} e 当前选中值
* @param {Object} item 当前选中的项
*/
clickBox: function(e, item) {
this.curChecked = !this.curChecked;
e.detail.value = this.curChecked;
this.$emit("change", e); // 切换单选框或复选框
},
}
}
</script>
<style lang="scss" scoped>
@import 'luyj-tree-item.scss';
@import "../../lib/css/icon.css";
.device-box {
display: flex;
flex-direction: row;
align-items: center;
margin-top: 20rpx;
.device-img {
width: 100rpx;
height: 100rpx;
background: #f8f8f8;
flex-shrink: 0;
margin-right: 20rpx;
}
}
.device-img{
width: 50rpx;
height: 50rpx;
}
.runValue {
flex: 1;
color: #12ec0a;
font-size: 28rpx;
}
.stopValue {
flex: 1;
color: #FFB800;
font-size: 28rpx;
}
</style>