WholeProcessPlatform/frontend/src/components/iconDiv/index.vue

1771 lines
48 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div v-if="renderContent" v-html="renderContent"></div>
</template>
<script setup lang="ts">
import { computed } from "vue";
import moment from "moment";
// TODO: 请根据实际项目路径替换以下导入
// import { getThemee } from '@/utils/JdColor';
// import { transUnitRender, transUnit, getUnitConfigByCode } from '@/utils/unit.config';
// import { Session } from '@/utils/session'; // 假设的路径
// --- 占位工具函数 (请替换为真实实现) ---
const getThemee = (key: string) => {
// 模拟返回颜色配置
return { name: key, color: "#333", unit: "" };
};
const transUnitRender = (val: any, type: string, code: string) => {
if (val == null) return "-";
return val; // 简单返回,实际应进行单位转换
};
const transUnit = (val: any, type: string, code: string) => {
if (val == null) return "-";
return val;
};
const getUnitConfigByCode = (type: string, code: string) => {
// 模拟返回单位配置
const units: Record<string, string> = {
ZJRL: "MW",
FDLYKW: "亿kW·h",
QI: "m³/s",
QO: "m³/s",
QECLIMIT: "m³/s",
INTEMP: "℃",
OUTTEMP: "℃",
WTMP: "℃",
WEI: "尾",
};
return { unit: units[code] || "" };
};
const Session = {
getToken: () => ({ accessToken: "your-token-here" }), // 模拟 Token
getAppCode: () => "hbb", // 模拟 App Code
};
// --- 常量定义 ---
const eqtpList: Record<string, string> = {
"1": "生态放流孔",
"2": "生态放流闸",
"3": "生态放流洞",
"4": "生态放流管",
"5": "基荷发电",
"6": "生态机组",
};
const dwtpList: Record<string, string> = {
DW_1: "多层式进水口",
DW_2: "叠梁门式进水口",
DW_3: "翻板门式进水口",
DW_4: "套筒式进水口",
DW_5: "前置挡墙",
DW_6: "隔水幕墙",
DW_9: "其他设施",
};
const fptpList: Record<string, string> = {
FP_1: "鱼道",
FP_2: "仿自然通道",
FP_3: "集运鱼系统",
FP_4: "升鱼机",
FP_5: "其它过鱼方式",
};
const locationList: Record<string, string> = {
"1": "库尾",
"2": "库中",
"3": "坝前",
"4": "坝下",
};
const allYs = [
"CHLA",
"CL",
"CLARITY",
"CODCR",
"CODMN",
"COND",
"CYANO",
"DOX",
"FCG",
"FID",
"LAS",
"NH3N",
"NO3",
"PH",
"S2",
"SE",
"TN",
"TP",
"TU",
"WTMP",
"ZN",
];
const app = Session.getAppCode();
const timegj = [moment().subtract(7, "days").format("MM-DD"), moment().format("MM-DD")];
const env = (window as any).__env__;
// --- Props 定义 ---
interface IconDivProps {
ennm?: string;
stnm?: string;
ttpwr?: string | number;
yrge?: string | number;
anchoPointState?: string;
sttpMap?: string;
tm?: string;
wwqtg?: string;
wqGrd?: string;
sfdb?: string;
stlc?: string;
position?: string;
eqtp?: string;
limit?: string;
qo?: string;
qi?: string;
normz?: string;
rz?: string;
ddz?: string;
dz?: string;
status?: string;
inTemp?: string;
outTemp?: string;
temperature?: string;
fishList?: any[];
list?: any[];
bldstt?: string;
development?: string;
targetNum?: string;
actualNum?: string;
rvnm?: string;
typeNum?: string;
rescueNum?: string;
ph?: string;
tp?: string;
tn?: string;
lgtd?: number;
lttd?: number;
targetCount?: string;
buildCount?: string;
location?: string;
dtin?: number | string;
stdSstate?: number | string;
stdSstateName?: string;
dtinName?: string;
lcjStatus?: number | string;
lcjStatusName?: string;
bldsttCcode?: string;
lastTmEngEqDataVo?: any;
wtvtInfo?: any;
deviceType?: string;
enfc?: number;
rvcdName?: string;
wqGrdName?: string;
wwqtgName?: string;
year?: string;
targetFtp?: string;
actualFtp?: string;
qecLimit?: any;
vlsr?: string;
fhstnm?: string;
warnDataList?: any[];
warnStateName?: string;
dtmel?: string;
logo?: string;
name?: string;
ftp?: string;
z?: string;
q?: string;
v?: string;
sttpName?: string;
aiSttpName?: string;
reachname?: string;
wt?: string;
yyyy?: string;
stqCount?: number;
wqCount?: number;
zcount?: number;
wtCount?: number;
popName?: string;
isHover?: boolean;
}
// const props = defineProps<IconDivProps>();
const props = {
sttp: "ENG",
stcd: "008660211200000001",
lgtd: 98.958315,
lttd: 30.754818,
dtmel: 3793.292,
anchoPointState: "large_eng_built",
// anchoPointState: "mid_eng_built",
sttpMap: "ENG",
titleName: "叶巴滩",
distance: 50000000,
rvcd: "SJLY46",
addvcd: "542123",
baseId: "01",
rstcds: null,
sttpCode: "ENG",
ennm: "叶巴滩",
rvnm: null,
ttpwr: 2240,
ddz: null,
normz: 2889,
qecLimit: null,
yrge: 91.6,
ifEngSpecial: false,
avq: 839,
endInstalledType: 1,
lastTmEngEqDataVo: {
stcd: "008660211200000001",
stnm: "叶巴滩",
tm: "2090-01-01 08:00:00",
ttpwr: 2240,
qecLimit: null,
mwrLimit: null,
avqLimit: null,
qecC: null,
mwrC: null,
avqC: null,
normz: 2889,
ddz: null,
qi: null,
qo: null,
rz: 2889,
dz: null,
vlsr: null,
vlsrTm: null,
mwrVlsr: null,
mwrVlsrTm: null,
},
logo: null,
addvcdName: "贡觉县",
jcdt: null,
siteStepSort: 0,
prsc: 1,
iconRotate: null,
bldsttCcode: 2,
rvcdStepSort: 1,
rscdStepSort: null,
stnm: "叶巴滩",
iconCode: "map-dxsdzYijian",
code: "pointLayer",
popName: "叶巴滩",
_id: "ENG_008660211200000001",
};
// --- 辅助函数 ---
const isNil = (val: any) => val == null;
const getStatusHtml = () => {
const { dtin, stdSstate, stdSstateName, dtinName, lcjStatus, lcjStatusName } = props;
const _dtin = `${dtin}`;
const baseId = (window as any).__lyConfigs?.baseId;
const _stdSstate = baseId === "07" || baseId === "02" ? `${lcjStatus}` : `${stdSstate}`;
const _stdSstateName =
baseId === "07" || baseId === "02" ? lcjStatusName : stdSstateName;
// if (_dtin === "0") {
// return `<span>${dtinName || "未接入"}</span>`;
// } else if (_dtin === "1" && _stdSstate === "1") {
return `<span style="color: #76C500">${_stdSstateName || "正常运行"}</span>`;
// } else if (_dtin === "1" && _stdSstate === "3") {
// return `<span style="color: #FF6B6B">${_stdSstateName || "未正常运行"}</span>`;
// }
return `<span>${_stdSstateName || "最近1年无数据"}</span>`;
};
const getLimitSpanHtml = (minVal: any, maxVal: any) => {
if (!isNil(maxVal) && !isNil(minVal)) {
return `<span style="color: rgba(255,255,255,0.45)">(${minVal}~${maxVal})</span>`;
} else if (!isNil(maxVal)) {
return `<span style="color: rgba(255,255,255,0.45)">(≤${maxVal})</span>`;
} else if (!isNil(minVal)) {
return `<span style="color: rgba(255,255,255,0.45)">(≥${minVal})</span>`;
}
return "";
};
const needNotShow = (minVal: any, maxVal: any, val: any) => {
const _min = isNil(minVal) ? null : Number(minVal);
const _max = isNil(maxVal) ? null : Number(maxVal);
const _val = isNil(val) ? null : Number(val);
if (isNil(_val)) return true;
if (!isNil(_max) && !isNil(_min)) return _val >= _min && _val <= _max;
if (!isNil(_max)) return _val <= _max;
if (!isNil(_min)) return _val >= _min;
return true;
};
const getYsListHtml = () => {
let html = "";
allYs.forEach((ys: any) => {
const _ys = ys.toLowerCase();
const val = (props as any)[_ys];
const ystheme = getThemee(ys);
const ysUpper = ys.toUpperCase();
let minVal, maxVal;
const ysLimit = props; // 假设 props 上直接挂了 min/max 字段,或者需要从特定字段解析
// 模拟解析 min/max实际需根据数据结构调整
if ((ysLimit as any).min) {
// 简化处理,实际可能需要 JSON.parse
minVal = (ysLimit as any).min;
}
if ((ysLimit as any).max) {
maxVal = (ysLimit as any).max;
}
if (!needNotShow(minVal, maxVal, val)) {
const unit =
ysUpper === "PH"
? ""
: getUnitConfigByCode("WQ_R", ysUpper)?.unit || ystheme?.unit || "";
html += `
<li>
<div class="__label">${ystheme?.name}</div>
<span style="color: #E55555">
${val} ${unit}
${getLimitSpanHtml(minVal, maxVal)}
</span>
</li>
`;
}
});
return html;
};
const getStateClass = () => {
let setclass = "";
if (props?.anchoPointState) {
if (
props.anchoPointState.includes("large_eng") ||
props.anchoPointState.includes("eef_1")
) {
setclass = "large_eng";
} else if (
props.anchoPointState.includes("mid_eng") ||
props.anchoPointState.includes("eef_2")
) {
setclass = "mid_eng";
} else {
setclass = "large_eng";
}
} else {
setclass = "large_eng";
}
if (props?.ennm && props.ennm.length > 3) {
setclass += " smallfont";
}
if (props?.ttpwr && `${transUnitRender(props.ttpwr, "Other", "ZJRL")}`.length > 4) {
setclass += " leftsmallfont";
}
if (
(props?.yrge && `${transUnitRender(props.yrge, "Other", "FDLYKW")}`.length > 4) ||
(props?.limit && `${props.limit}`.length > 4)
) {
setclass += " rightsmallfont";
}
return setclass;
};
const getImageUrl = (logo: string) => {
if (!logo) return "";
const token = Session.getToken()?.accessToken;
const fsAddress = (window as any).__fsAddress || "";
return `${fsAddress}?${logo}&view=jpg&token=${token}`;
};
// --- 核心渲染逻辑 ---
const renderContent = computed(() => {
const p = props;
const dzFdl = getUnitConfigByCode("Other", "FDLYKW")?.unit;
const dzZjrl = getUnitConfigByCode("Other", "ZJRL")?.unit;
// 模拟 Utility.parseQueryString
const urlParams = new URLSearchParams(window.location.search);
const page = urlParams.get("page") || "";
let newsttpMap = p.sttpMap;
// if (newsttpMap == "ENG") {
// if (
// (p?.anchoPointState?.indexOf("_eng_") !== -1 && !p?.isHover) ||
// p?.anchoPointState?.indexOf("eef_") !== -1
// ) {
// newsttpMap = "eng2";
// } else if (page == "shuiWenFenXi") {
// newsttpMap = "eng3";
// } else if (page == "renGongFangLiu") {
// newsttpMap = "eng4";
// }
// }
console.log(newsttpMap);
let html = "";
switch (newsttpMap) {
case "ENG":
html = `
<div class=" ${"iconEngDiv_" + props.anchoPointState} ${
"iconEngDiv-" + props.anchoPointState + "-" + props?.bldsttCcode
}">
<div class="iconDivTitle">${p?.ennm || p?.stnm}</div>
<div class="iconDivContent">
<div class="iconDivLeft">
<div>${transUnitRender(p?.ttpwr, "Other", "ZJRL")}</div>
<div style="font-size: 12px">${dzZjrl || "万kW"}</div>
</div>
<div class="iconDivRight">
<div>${transUnitRender(p?.yrge, "Other", "FDLYKW")}</div>
<div style="font-size: 12px">${dzFdl || "亿kW·h"}</div>
</div>
</div>
</div>
`;
break;
case "eng1":
if (p?.anchoPointState == "eef_1_none" || p?.anchoPointState == "eef_2_none") {
html = `
<div class="iconDiv ${getStateClass()} ${p?.anchoPointState || ""}">
<div class="iconDivTitle">${p?.ennm || p?.stnm}</div>
<div class="iconDivContent">暂无数据</div>
</div>
`;
} else {
html = `
<div class="iconDiv ${getStateClass()} ${p?.anchoPointState || ""}">
<div class="iconDivTitle">${p?.ennm || p?.stnm}</div>
<div class="iconDivContent">
<div class="iconDivLeft">${transUnitRender(p?.ttpwr, "Other", "ZJRL")}</div>
<div class="iconDivRight">${p?.limit}</div>
</div>
</div>
`;
}
break;
case "eng2": {
let lastTmEngEqDataVo: any = {};
if (typeof p?.lastTmEngEqDataVo == "string") {
lastTmEngEqDataVo = JSON.parse(p.lastTmEngEqDataVo);
} else {
lastTmEngEqDataVo = p.lastTmEngEqDataVo;
}
if (!lastTmEngEqDataVo?.qo && !lastTmEngEqDataVo?.qi) return "";
const baseId = (window as any).__lyConfigs?.baseId;
const qiHtml =
baseId !== "02" && lastTmEngEqDataVo?.qi != null && lastTmEngEqDataVo?.qi !== ""
? `
<li>
<div class="__label">入库流量:</div>
<div class="__info">
${transUnitRender(lastTmEngEqDataVo?.qi, "HYDROPW_R", "QI")} ${
getUnitConfigByCode("HYDROPW_R", "QI")?.unit
}
</div>
</li>
`
: "";
const qecLimitVal = lastTmEngEqDataVo?.qecLimit;
let qecLimitDisplay = "-";
if (qecLimitVal == 0 || qecLimitVal == null) {
qecLimitDisplay = app == "hbb" ? "-" : "无生态流量要求";
} else {
qecLimitDisplay = `${transUnitRender(qecLimitVal, "HYDROPW_R", "QECLIMIT")} ${
getUnitConfigByCode("HYDROPW_R", "QECLIMIT")?.unit
}`;
}
const vlsrHtml = lastTmEngEqDataVo?.vlsr
? `<li><div>限值来源:${lastTmEngEqDataVo?.vlsr}</div></li>`
: "";
html = `
<div class="map-tooltip map-tooltip-middle">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm}</div>
<div class="map-tooltip-sub">${lastTmEngEqDataVo?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
${qiHtml}
<li>
<div class="__label">${baseId == "02" ? "生态流量:" : "出库流量:"}</div>
<div class="__info">
${transUnitRender(lastTmEngEqDataVo?.qo, "HYDROPW_R", "QO")} ${
getUnitConfigByCode("HYDROPW_R", "QO")?.unit
}
</div>
</li>
<li>
<div class="__label">生态流量限值:</div>
<div class="__info">${qecLimitDisplay}</div>
</li>
${vlsrHtml}
</ul>
</div>
</div>
`;
break;
}
case "eng3":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm}</div>
<div class="map-tooltip-sub">${p?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">入库水温:</div>
<div class="__info">
${transUnitRender(p?.inTemp, "WTRV_R", "INTEMP") ?? "-"} ${
getUnitConfigByCode("WTRV_R", "INTEMP")?.unit
}
</div>
</li>
<li>
<div class="__label">出库水温:</div>
<div class="__info">
${transUnitRender(p?.outTemp, "WTRV_R", "OUTTEMP") ?? "-"} ${
getUnitConfigByCode("WTRV_R", "OUTTEMP")?.unit
}
</div>
</li>
</ul>
</div>
</div>
`;
break;
case "eng4": {
let devStatusHtml = "<span>数据未接入</span>";
if (p?.development == "未完成")
devStatusHtml = '<span style="color: #FF6B6B">未完成</span>';
else if (p?.development == "未填报")
devStatusHtml = '<span style="color: #F0CC1D">未填报</span>';
else if (p?.development == "已完成")
devStatusHtml = '<span style="color: #76C500">已完成</span>';
const targetInfo = p.targetNum
? `${p?.targetFtp || "-"}种/${p?.targetNum || "-"}万尾`
: "--";
const actualInfo = p.actualNum
? `${p?.actualFtp || "-"}种/${p?.actualNum || "-"}万尾`
: "--";
html = `
<div class="map-tooltip">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm || p?.popName}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">年份:</div>
<div class="__info">${p?.year || "-"}</div>
</li>
<li>
<div class="__label">目标放流种类/数量:</div>
<div class="__info">${targetInfo}</div>
</li>
<li>
<div class="__label">实际放流种类数量:</div>
<div class="__info">${actualInfo}</div>
</li>
<li>
<div class="__label">工作开展情况:</div>
<div class="__info">${devStatusHtml}</div>
</li>
</ul>
</div>
</div>
`;
break;
}
case "VA": {
const hbbLi =
app == "hbb"
? `
<li>
<div class="__label">接入状态:</div>
<div class="__info">${
p?.dtin === 0 ? "未接入" : p?.dtin === 1 ? "已接入" : "-"
}</div>
</li>
`
: "";
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">建设状态:</div>
<div class="__info">
${
p?.bldsttCcode == "0"
? "未建"
: p?.bldsttCcode == "1"
? "在建"
: p?.bldsttCcode == "2"
? "已建"
: "-"
}
</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm}</div>
</li>
${hbbLi}
</ul>
</div>
</div>
`;
break;
}
case "DW":
case "DW_1":
case "DW_2":
case "DW_3":
case "DW_4":
case "DW_5":
case "DW_6":
case "DW_9":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">设施类型:</div>
<div class="__info">${p?.sttpMap ? dwtpList[p.sttpMap] || "-" : "-"}</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm}</div>
</li>
<li>
<div class="__label">运行状态:</div>
<div class="__info">${getStatusHtml()}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "FP":
case "FP_1":
case "FP_2":
case "FP_3":
case "FP_4":
case "FP_5":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">设施类型:</div>
<div class="__info">${p?.dwtp ? fptpList[p.dwtp] : "-"}</div>
</li>
<li>
<div class="__label">建设状态:</div>
<div class="__info">${
p?.bldstt == "0"
? "未建"
: p?.bldstt == "1"
? "在建"
: p?.bldstt == "2"
? "已建"
: "-"
}</div>
</li>
<li>
<div class="__label">运行状态:</div>
<div class="__info">${getStatusHtml()}</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "FB":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">建设状态:</div>
<div class="__info">${
p?.bldstt == "0"
? "未建"
: p?.bldstt == "1"
? "在建"
: p?.bldstt == "2"
? "已建"
: "-"
}</div>
</li>
<li>
<div class="__label">运行状态:</div>
<div class="__info">${getStatusHtml()}</div>
</li>
<li>
<div class="__label">服务电站:</div>
<div class="__info">${p?.ennm}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "EQ":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">设施类型:</div>
<div class="__info">${p?.eqtp ? eqtpList[p.eqtp] : "-"}</div>
</li>
<li>
<div class="__label" style="flex: 0 0 110px; width: 110px">生态流量限值:</div>
<div class="__info">${p?.qecLimit}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "WT": {
let wtvtInfo: any = {};
if (typeof p?.wtvtInfo == "string") {
wtvtInfo = JSON.parse(p.wtvtInfo);
} else {
wtvtInfo = p.wtvtInfo;
}
const tt = p?.deviceType == "1" ? "水深" : "高程";
const sizeClass = p.enfc === 0 ? "small" : "middle";
if (p.enfc === 0) {
html = `
<div class="map-tooltip map-tooltip-${sizeClass}">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm ?? "-"}</div>
<div class="map-tooltip-sub">${p?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">水温:</div>
<div class="__info">
${transUnit(p?.temperature, "WQ_R", "WTMP") ?? "-"}
${getUnitConfigByCode("WQ_R", "WTMP")?.unit}
</div>
</li>
</ul>
</div>
</div>
`;
} else {
html = `
<div class="map-tooltip map-tooltip-${sizeClass}">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<div class="map-tooltip-sub">${wtvtInfo?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">
${tt} ${transUnit(wtvtInfo?.minWthg, "WQ_R", "WTMP") || "-"}m
</div>
<div class="__info">
${transUnit(wtvtInfo?.minWthgWt, "WQ_R", "WTMP")}
${getUnitConfigByCode("WQ_R", "WTMP")?.unit}
</div>
</li>
<li>
<div class="__label">平均水温:</div>
<div class="__info">
${transUnit(wtvtInfo?.avgWt, "WQ_R", "WTMP")}
${getUnitConfigByCode("WQ_R", "WTMP")?.unit}
</div>
</li>
<li>
<div class="__label">
${tt} ${transUnit(wtvtInfo?.maxWthg, "WQ_R", "WTMP") || "-"}m
</div>
<div class="__info">
${transUnit(wtvtInfo?.maxWthgWt, "WQ_R", "WTMP")}
${getUnitConfigByCode("WQ_R", "WTMP")?.unit}
</div>
</li>
</ul>
</div>
</div>
`;
}
break;
}
case "FH": {
const baseId = (window as any).__lyConfigs?.baseId;
const ennmLi =
baseId === "all"
? ""
: `
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm || "-"}</div>
</li>
`;
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">所在河流:</div>
<div class="__info">${p?.rvcdName || "-"}</div>
</li>
${ennmLi}
</ul>
</div>
</div>
`;
break;
}
case "WQFB":
case "WQ": {
const wqGrdTheme = getThemee(p.wqGrdName);
const wwqtgTheme = getThemee(p.wwqtgName);
html = `
<div class="map-tooltip">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p.stnm}</div>
<ul class="map-tooltip-sub map-tooltip-list">
<li>
<div class="__label">监测时间:</div>
<div class="__info">${p?.tm ?? "-"}</div>
</li>
<li>
<div class="__label">水质等级:</div>
<div class="__info">
<span style="color: ${wqGrdTheme?.color}">${
wqGrdTheme?.name ?? "-"
}类</span>
(目标等级 <span style="color: ${wwqtgTheme?.color}">${
wwqtgTheme?.name ?? "-"
}类</span>)
</div>
</li>
</ul>
<ul class="map-tooltip-content map-tooltip-list">
${getYsListHtml()}
</ul>
</div>
</div>
`;
break;
}
case "WE": {
const mergedFishList: any[] = [];
const fishList =
typeof p.fishList === "string" ? JSON.parse(p.fishList) : p.fishList;
fishList?.forEach((item: any) => {
const existingItem = mergedFishList.find(
(mergedItem: any) => mergedItem.fishName === item.fishName
);
if (existingItem) {
existingItem.count += item.count;
} else {
mergedFishList.push({ ...item });
}
});
let fishItemsHtml = "";
if (mergedFishList.length > 0) {
mergedFishList.slice(0, 3).forEach((item: any) => {
fishItemsHtml += `
<li>
<div class="__label">${item.fishName}</div>
<div class="__info">
${transUnitRender(item.count, "Other", "WEI")}
${getUnitConfigByCode("Other", "WEI")?.unit}
</div>
</li>
`;
});
} else {
fishItemsHtml = "<li>暂无数据</li>";
}
if (mergedFishList.length > 3) {
fishItemsHtml += `<li><div style="text-align: center; flex: 0 0 100%; width: 100%">...</div></li>`;
}
html = `
<div class="map-tooltip map-tooltip-middle">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p.stnm}</div>
<ul class="map-tooltip-sub map-tooltip-list __list2">
<li>
<div class="__label">调查时间:</div>
<div class="__info">${p?.tm ?? "-"}</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm ?? "-"} </div>
</li>
</ul>
<div class="map-tooltip-sub1">
<span class="__content">调查鱼类</span>
</div>
<ul class="map-tooltip-content map-tooltip-list __noborder __small __list2">
${fishItemsHtml}
</ul>
</div>
</div>
`;
break;
}
case "WE_FISH": {
const fishData =
typeof p.fishList === "string" ? JSON.parse(p.fishList) : p.fishList;
const imgUrl = getImageUrl(p.logo);
const imgHtml = p.logo
? `<img style="width: 100px; object-fit: cover; margin-right: 10px" src="${imgUrl}" alt="" />`
: `<div style="width: 100px; object-fit: cover; margin-right: 10px">暂无图片</div>`;
let yearsHtml = "";
fishData?.forEach((item: any) => {
yearsHtml += `
<div class="__label">
${item.year}${transUnitRender(item.count, "Other", "WEI")}
${getUnitConfigByCode("Other", "WEI")?.unit}
</div>
`;
});
html = `
<div class="map-tooltip map-tooltip-middle">
<div class="map-tooltip-box">
<div style="display: flex; justify-content: center">
${imgHtml}
<div style="text-align: left">
<div>${fishData?.[0]?.fishName}</div>
<div>${yearsHtml}</div>
</div>
</div>
</div>
</div>
`;
break;
}
case "TE": {
let listItemsHtml = "";
if (p.list?.length > 0) {
p.list.slice(0, 3).forEach((item: any) => {
listItemsHtml += `
<li>
<div class="__label">${item.name}</div>
<div class="__info">${item.amount}k㎡</div>
</li>
`;
});
} else {
listItemsHtml = "<li>暂无数据</li>";
}
html = `
<div class="map-tooltip map-tooltip-middle">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p.stnm}</div>
<ul class="map-tooltip-sub map-tooltip-list __list2">
<li>
<div class="__label">调查时间:</div>
<div class="__info">${p?.tm ?? "-"}</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p?.ennm ?? "-"} </div>
</li>
</ul>
<div class="map-tooltip-sub1">
<span class="__content">调查结果</span>
</div>
<ul class="map-tooltip-content map-tooltip-list __noborder __small">
${listItemsHtml}
</ul>
</div>
</div>
`;
break;
}
case "VP":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p.stnm}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">建设状态:</div>
<div class="__info">${
p.bldsttCcode == "0"
? "未建"
: p.bldsttCcode == "1"
? "在建"
: p.bldsttCcode == "2"
? "已建"
: "-"
}</div>
</li>
<li>
<div class="__label">关联电站:</div>
<div class="__info">${p.ennm}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "ENG_ALARM": {
const sizeClass = app === "hbb" ? "small" : "middle";
const timeRange =
app == "hbb" ? `${p?.yyyy ?? "-"}年` : `${timegj[0]}~${timegj[1]}`;
let extraLi = "";
if (
env !== "ddh" &&
env !== "ddhpro" &&
app !== "hbb" &&
env !== "ylj" &&
env !== "yljpro"
) {
extraLi += `
<li>
<div class="__label" style="flex: 0 0 100px; width: 100px">水位告警:</div>
<div class="__info${p?.zcount > 0 ? " __warn" : ""}">${
p?.zcount ?? "-"
} 次</div>
</li>
`;
}
if (app !== "hbb" && env !== "ylj" && env !== "yljpro") {
extraLi += `
<li>
<div class="__label" style="flex: 0 0 100px; width: 100px">水温告警:</div>
<div class="__info${p?.wtCount > 0 ? " __warn" : ""}">${
p?.wtCount ?? "-"
} 次</div>
</li>
`;
}
html = `
<div class="map-tooltip map-tooltip-${sizeClass}">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p.ennm}</div>
<div class="map-tooltip-sub1">
<span class="__content">电站告警统计</span>
</div>
<ul class="map-tooltip-content map-tooltip-list __noborder">
<li>
<div class="__label" style="flex: 0 0 100px; width: 100px">
${app == "hbb" ? "统计年份" : "统计时间范围"}
</div>
<div class="__info">${timeRange}</div>
</li>
<li>
<div class="__label" style="flex: 0 0 100px; width: 100px">生态流量告警:</div>
<div class="__info${p?.stqCount > 0 ? " __warn" : ""}">${
p?.stqCount ?? "-"
} 次</div>
</li>
<li>
<div class="__label" style="flex: 0 0 100px; width: 100px">水质告警:</div>
<div class="__info${p?.wqCount > 0 ? " __warn" : ""}">${
p?.wqCount ?? "-"
} 次</div>
</li>
${extraLi}
</ul>
</div>
</div>
`;
break;
}
case "ylfb":
html = `
<div class="map-tooltip">
<div class="map-tooltip-box">${p?.ftp ?? "-"}</div>
</div>
`;
break;
case "ZQ":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm + "流量站"}</div>
<div class="map-tooltip-sub">${p?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">水位(m)</div>
<div class="__info">${p?.z ?? "-"}</div>
</li>
<li>
<div class="__label">流量(m³/s)</div>
<div class="__info">${p?.q ?? "-"}</div>
</li>
<li>
<div class="__label">流速(m/s)</div>
<div class="__info">${p?.v ?? "-"}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "VD":
case "AIVD": {
const baseId = (window as any).__lyConfigs?.baseId;
const habitatLi =
p?.ennm === null && p?.fhstnm === null
? ""
: p?.ennm === null
? `<li><div class="__label">所属栖息地:</div><div class="__info">${p?.fhstnm}</div></li>`
: baseId === "all"
? ""
: `<li><div class="__label">关联电站:</div><div class="__info">${p?.ennm}</div></li>`;
html = `
<div class="map-tooltip">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${
p?.stnm?.endsWith("视频站") ? p?.stnm : p?.stnm + "视频站"
}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">监控内容类型:</div>
<div class="__info">${
newsttpMap == "VD" ? p?.sttpName : p?.aiSttpName
}</div>
</li>
${habitatLi}
</ul>
</div>
</div>
`;
break;
}
case "REACH": {
const wwqtgTheme = getThemee(p?.wwqtgName);
const wqGrdTheme = getThemee(p?.wqGrdName);
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.reachname}</div>
<div class="map-waterQuality-subtitle">
<div class="map-waterQuality-leftType">
水质要求<br/>
<span style="color: ${wwqtgTheme?.color}">${
wwqtgTheme?.name || "-"
}</span> 类
</div>
<div class="map-waterQuality-rightType">
监测结果<br/>
<span style="color: ${wqGrdTheme?.color}">${
wqGrdTheme?.name || "-"
}</span> 类
</div>
</div>
</div>
</div>
`;
break;
}
case "WT_ALARM":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm || p?.ennm}</div>
<div class="map-tooltip-sub">${p?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">水温:</div>
<div class="__info">${p?.wt ?? "-"} ℃</div>
</li>
</ul>
</div>
</div>
`;
break;
case "WQ_ALARM": {
let warnItems = "";
p.warnDataList?.forEach((item: any) => {
const theme = getThemee(item.ys);
warnItems += `
<li>
<div class="__label">${theme.name}</div>
<div class="__info">
${item.ssz} ${getUnitConfigByCode("WQ_R", item.ys)?.unit}
</div>
</li>
`;
});
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.stnm || p?.ennm}</div>
<div class="map-tooltip-sub">${p?.warnDataList?.[0]?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
${warnItems}
</ul>
</div>
</div>
`;
break;
}
case "RZ_ALARM":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm}</div>
<div class="map-tooltip-sub">${p?.tm ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">水位:</div>
<div class="__info">${p?.rz ?? "-"} m</div>
</li>
</ul>
</div>
</div>
`;
break;
case "OPERAT_ALARM":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">
<div class="map-tooltip-title">${p?.ennm || p?.stnm}</div>
<div class="map-tooltip-sub">${p?.dtmel ?? ""}</div>
<ul class="map-tooltip-content map-tooltip-list">
<li>
<div class="__label">运行情况:</div>
<div class="__info">${p?.warnStateName ?? "-"}</div>
</li>
</ul>
</div>
</div>
`;
break;
case "WVA":
case "FD":
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">${p.stnm}</div>
</div>
`;
break;
case "TE_ANIMALS": {
let _pic: string[] = [];
if (p.logo) {
_pic = [p]
.filter((item: any) => item.logo !== null)
.map((item: any) => item.logo?.split(","))
.flat();
}
const imgUrl = _pic?.[0] ? getImageUrl(_pic[0]) : "";
const imgHtml = _pic?.[0]
? `<img style="width: 100px; object-fit: cover; margin-right: 10px" src="${imgUrl}" alt="" />`
: `<div style="width: 100px; object-fit: cover; margin-right: 10px">暂无图片</div>`;
html = `
<div class="map-tooltip map-tooltip-middle">
<div class="map-tooltip-box">
<div style="display: flex; justify-content: center">
${imgHtml}
</div>
<div style="text-align: center">
<div>${p?.name}</div>
</div>
</div>
</div>
`;
break;
}
default:
html = `
<div class="map-tooltip map-tooltip-small">
<div class="map-tooltip-box">${p.ennm || p.stnm}</div>
</div>
`;
}
return html ? `<div>${html}</div>` : "";
});
</script>
<style lang="scss">
.map-tooltip {
height: auto;
color: rgba(255, 255, 255, 0.85);
text-align: center;
position: relative;
padding: 24px 0 25px;
// width: 279px;
width: 260px;
&::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 24px;
background: url(@/assets/images/mapTip/top@260.png) center no-repeat;
filter: opacity(75%);
}
&::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 25px;
background: url(@/assets/images/mapTip/bottom@260.png) center no-repeat;
filter: opacity(75%);
}
&-box {
padding: 0 12px;
&::before {
content: "";
position: absolute;
top: 24px;
bottom: 25px;
left: 0;
right: 0;
z-index: -1;
background: url(@/assets/images/mapTip/center@260.png) repeat-y;
filter: opacity(75%);
}
}
&-title {
font-size: 16px;
font-weight: 500;
}
&-list {
font-size: 14px;
line-height: 1.5;
> li {
display: flex;
text-align: left;
.__label {
flex: 0 0 100px;
width: 100px;
text-align: right;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.__warn {
color: #ff4d4f;
}
}
}
&-content {
margin-top: 10px;
border-top: 1px dashed #12aaeb;
padding: 10px 0;
margin: 10px 0 0;
&.__noborder {
border: none;
margin-top: 6px;
}
&.__small {
font-size: 12px;
}
}
&-sub {
margin: 0;
padding: 10px 0 0;
text-align: center;
}
&-sub1 {
text-align: center;
position: relative;
height: 1px;
border-bottom: 1px dashed #12aaeb;
margin-top: 16px;
.__content {
position: absolute;
top: -9px;
left: 50%;
transform: translateX(-50%);
background-color: rgb(88 110 134);
padding: 0 6px;
font-size: 12px;
border-radius: 3px;
white-space: nowrap;
}
}
&.map-tooltip-small {
width: 175px;
padding: 18px 0 18px;
&::after {
background-image: url(@/assets/images/mapTip/top@175.png);
height: 18px;
filter: opacity(75%);
}
&::before {
background-image: url(@/assets/images/mapTip/bottom@175.png);
height: 18px;
filter: opacity(75%);
}
.map-tooltip-box {
padding: 0 10px;
&::before {
content: "";
position: absolute;
top: 18px;
bottom: 18px;
left: 0;
right: 0;
z-index: -1;
background-image: url(@/assets/images/mapTip/center@175.png);
filter: opacity(75%);
}
}
.map-tooltip-list {
> li {
.__label {
flex: 0 0 80px;
width: 80px;
}
}
}
}
&.map-tooltip-middle {
width: 215px;
padding: 18px 0 18px;
&::after {
background-image: url(@/assets/images/mapTip/top@215.png);
height: 18px;
filter: opacity(75%);
}
&::before {
background-image: url(@/assets/images/mapTip/bottom@215.png);
height: 18px;
filter: opacity(75%);
}
.map-tooltip-box {
padding: 0 10px;
&::before {
content: "";
position: absolute;
top: 18px;
bottom: 18px;
left: 0;
right: 0;
z-index: -1;
background-image: url(@/assets/images/mapTip/center@215.png);
filter: opacity(75%);
}
}
.map-tooltip-list {
> li {
.__label {
flex: 0 0 110px;
width: 110px;
}
}
&.__list2 {
> li {
.__label {
flex: 0 0 90px;
width: 90px;
}
}
}
}
}
.map-waterQuality-subtitle {
margin-top: 10px;
border: 1px solid rgba(77, 129, 167);
border-bottom: none;
.map-waterQuality-leftType,
.map-waterQuality-rightType {
width: 50%;
}
}
}
/*
注意:这里需要引入或复制原 style.less 的内容
以下仅为示例基础样式,确保结构不崩坏
*/
.iconDiv {
background: rgba(0, 0, 0, 0.6);
color: #fff;
border-radius: 4px;
padding: 5px;
font-size: 12px;
&.smallfont {
font-size: 10px;
}
}
.iconDivContent {
display: flex;
justify-content: space-between;
}
.map-tooltip {
font-size: 12px;
color: #fff;
&-box {
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
padding: 8px;
min-width: 150px;
}
&-title {
margin-bottom: 4px;
padding-bottom: 4px;
}
&-sub {
font-size: 10px;
color: #999;
margin-bottom: 4px;
}
ul {
list-style: none;
padding: 10px 0;
margin: 0;
li {
display: flex;
margin-bottom: 2px;
.__label {
flex-shrink: 0;
color: #fff;
}
.__info {
word-break: break-all;
}
}
}
}
// 电站 - 大型
.iconEngDiv_large_eng_built {
width: 150px;
height: 164px;
background-repeat: no-repeat;
background-size: 100%;
display: flex;
flex-wrap: wrap;
margin-bottom: 0 !important;
.iconDivTitle {
width: 100%;
height: 48%;
line-height: 100px;
text-align: center;
align-items: center;
font-size: 16px;
text-align: center;
font-weight: normal;
position: relative;
&::after {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
width: 80%;
left: 50%;
transform: translateX(-50%);
content: " ";
}
}
.iconDivContent {
width: 100%;
height: 52%;
font-size: 11px;
position: relative;
&::after {
position: absolute;
top: 0;
left: 50%;
right: 0;
width: 2px;
height: 62%;
transform: translateX(-50%);
content: " ";
}
.iconDivLeft {
width: 50%;
padding-left: 34px;
box-sizing: border-box;
}
.iconDivRight {
width: 50%;
padding-left: 10px;
box-sizing: border-box;
padding-right: 30px;
div:nth-child(1) {
text-align: right;
}
}
}
}
// 电站 - 中型
.iconEngDiv_mid_eng_built {
width: 150px;
height: 112px;
background-repeat: no-repeat;
background-size: 100%;
display: flex;
flex-direction: column;
margin-bottom: 0 !important;
.iconDivTitle {
width: 100%;
height: 50px;
line-height: 52px;
text-align: center;
align-items: center;
font-size: 16px;
text-align: center;
font-weight: normal;
}
.iconDivContent {
width: 100%;
height: 36;
padding: 0 10px;
font-size: 11px;
position: relative;
&::after {
position: absolute;
top: 0;
left: 50%;
right: 0;
width: 2px;
height: 100%;
content: " ";
}
.iconDivLeft {
width: 50%;
text-align: center;
}
.iconDivRight {
width: 50%;
text-align: center;
}
}
}
.iconEngDiv-large_eng_built-0 {
background-image: url("@/assets/images/mapTip/map-dxsdzGuihuaNetMonitor.svg");
color: #859ea3;
.iconDivTitle,
.iconDivContent {
&::after {
background-color: #859ea3;
}
}
}
.iconEngDiv-large_eng_built-1 {
background-image: url("@/assets/images/mapTip/map-dxsdzZaijianNetMonitor.svg");
color: #5389b9;
.iconDivTitle,
.iconDivContent {
&::after {
background-color: #5389b9;
}
}
}
.iconEngDiv-large_eng_built-2 {
background-image: url("@/assets/images/mapTip/map-dxsdzYijianNetMonitor.svg");
color: #7dbc18;
.iconDivTitle,
.iconDivContent {
&::after {
background-color: #95c842;
}
}
}
.iconEngDiv-mid_eng_built-0 {
background-image: url("@/assets/images/mapTip/map-zxsdzGuihuaNetMonitor.svg");
color: #859ea3;
.iconDivContent {
&::after {
background-color: #859ea3;
}
}
}
.iconEngDiv-mid_eng_built-1 {
background-image: url("@/assets/images/mapTip/map-zxsdzZaijianNetMonitor.svg");
color: #5389b9;
.iconDivContent {
&::after {
background-color: #5389b9;
}
}
}
.iconEngDiv-mid_eng_built-2 {
background-image: url("@/assets/images/mapTip/map-zxsdzYijianNetMonitor.svg");
color: #7dbc18;
.iconDivContent {
&::after {
background-color: #95c842;
}
}
}
</style>