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

1771 lines
48 KiB
Vue
Raw Normal View History

<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">流量(/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>